diff options
author | heretic <heretic@yandex-team.ru> | 2022-02-10 16:45:43 +0300 |
---|---|---|
committer | Daniil Cherednik <dcherednik@yandex-team.ru> | 2022-02-10 16:45:43 +0300 |
commit | 397cbe258b9e064f49c4ca575279f02f39fef76e (patch) | |
tree | a0b0eb3cca6a14e4e8ea715393637672fa651284 /contrib/libs/cxxsupp | |
parent | 43f5a35593ebc9f6bcea619bb170394ea7ae468e (diff) | |
download | ydb-397cbe258b9e064f49c4ca575279f02f39fef76e.tar.gz |
Restoring authorship annotation for <heretic@yandex-team.ru>. Commit 1 of 2.
Diffstat (limited to 'contrib/libs/cxxsupp')
62 files changed, 17463 insertions, 17463 deletions
diff --git a/contrib/libs/cxxsupp/.yandex_meta/devtools.copyrights.report b/contrib/libs/cxxsupp/.yandex_meta/devtools.copyrights.report index 9995dec32d..0641a36c5c 100644 --- a/contrib/libs/cxxsupp/.yandex_meta/devtools.copyrights.report +++ b/contrib/libs/cxxsupp/.yandex_meta/devtools.copyrights.report @@ -1,114 +1,114 @@ -# File format ($ symbol means the beginning of a line): -# -# $ # this message -# $ # ======================= -# $ # comments (all commentaries should starts with some number of spaces and # symbol) -# ${action} {license id} {license text hash} -# $BELONGS ./ya/make/file/relative/path/1/ya.make ./ya/make/2/ya.make -# ${all_file_action} filename -# $ # user commentaries (many lines) -# $ generated description - files with this license, license text... (some number of lines that starts with some number of spaces, do not modify) -# ${action} {license spdx} {license text hash} -# $BELONGS ./ya/make/file/relative/path/3/ya.make -# ${all_file_action} filename -# $ # user commentaries -# $ generated description -# $ ... -# -# You can modify action, all_file_action and add commentaries -# Available actions: -# keep - keep license in contrib and use in credits -# skip - skip license -# remove - remove all files with this license -# rename - save license text/links into licenses texts file, but not store SPDX into LINCENSE macro. You should store correct license id into devtools.license.spdx.txt file -# -# {all file action} records will be generated when license text contains filename that exists on filesystem (in contrib directory) -# We suppose that that files can contain some license info -# Available all file actions: -# FILE_IGNORE - ignore file (do nothing) -# FILE_INCLUDE - include all file data into licenses text file -# ======================= - -KEEP COPYRIGHT_SERVICE_LABEL 1d5ea88b15cad450fcd61657e1cf38f0 -BELONGS libcxxrt/ya.make - License text: - * Copyright 2010-2011 PathScale, Inc. All rights reserved. - Scancode info: - Original SPDX id: COPYRIGHT_SERVICE_LABEL - Score : 100.00 - Match type : COPYRIGHT - Files with this license: - libcxxrt/LICENSE [3:3] - libcxxrt/auxhelper.cc [2:2] - libcxxrt/dwarf_eh.h [2:2] - libcxxrt/dynamic_cast.cc [2:2] - libcxxrt/exception.cc [2:2] - libcxxrt/memory.cc [2:2] - libcxxrt/stdexcept.cc [2:2] - libcxxrt/stdexcept.h [2:2] - libcxxrt/typeinfo.h [2:2] - -KEEP COPYRIGHT_SERVICE_LABEL 5efdfd987a88b455d2c1b8018df2035e -BELONGS libcxxrt/ya.make - License text: - * Copyright 2012 David Chisnall. All rights reserved. - Scancode info: - Original SPDX id: COPYRIGHT_SERVICE_LABEL - Score : 100.00 - Match type : COPYRIGHT - Files with this license: - libcxxrt/cxxabi.h [2:2] - -KEEP COPYRIGHT_SERVICE_LABEL 69053d6417df98873c8a8b466c648c78 -BELONGS libcxxrt/ya.make - License text: - * Copyright 2010-2012 PathScale, Inc. All rights reserved. - Scancode info: - Original SPDX id: COPYRIGHT_SERVICE_LABEL - Score : 100.00 - Match type : COPYRIGHT - Files with this license: - libcxxrt/guard.cc [2:2] - libcxxrt/typeinfo.cc [2:2] - -KEEP COPYRIGHT_SERVICE_LABEL 7e6a182a2f65f965d96f2755976c1829 -BELONGS libcxx/ya.make - License text: - * FreeBSD libc. These are covered by the following copyright: - * - * Copyright (c) 2002-2004 Tim J. Robbins. - Scancode info: - Original SPDX id: COPYRIGHT_SERVICE_LABEL - Score : 100.00 - Match type : COPYRIGHT - Files with this license: - libcxx/src/support/solaris/mbsnrtowcs.inc [5:7] - libcxx/src/support/solaris/wcsnrtombs.inc [2:2] - -KEEP COPYRIGHT_SERVICE_LABEL ebc015cad7377d32e7b2fc0ae5293aa1 -BELONGS libcxx/ya.make -FILE_INCLUDE libcxx/CREDITS.TXT found in files: libcxx/LICENSE.TXT at line 252 -FILE_IGNORE libcxxabi/CREDITS.TXT found in files: libcxx/LICENSE.TXT at line 252 - # libcxxabi/CREDITS.TXT included in libcxxabi - License text: - Copyright (c) 2009-2019 by the contributors listed in CREDITS.TXT - Scancode info: - Original SPDX id: COPYRIGHT_SERVICE_LABEL - Score : 100.00 - Match type : COPYRIGHT - Files with this license: - libcxx/LICENSE.TXT [252:252] - -KEEP COPYRIGHT_SERVICE_LABEL f52c727d32a7eaf5a8de6bc96b82797c -BELONGS libcxx/ya.make -FILE_INCLUDE libcxx/CREDITS.TXT found in files: libcxx/LICENSE.TXT at line 293 -FILE_IGNORE libcxxabi/CREDITS.TXT found in files: libcxx/LICENSE.TXT at line 293 - # libcxxabi/CREDITS.TXT included in libcxxabi - License text: - Copyright (c) 2009-2014 by the contributors listed in CREDITS.TXT - Scancode info: - Original SPDX id: COPYRIGHT_SERVICE_LABEL - Score : 100.00 - Match type : COPYRIGHT - Files with this license: - libcxx/LICENSE.TXT [293:293] +# File format ($ symbol means the beginning of a line): +# +# $ # this message +# $ # ======================= +# $ # comments (all commentaries should starts with some number of spaces and # symbol) +# ${action} {license id} {license text hash} +# $BELONGS ./ya/make/file/relative/path/1/ya.make ./ya/make/2/ya.make +# ${all_file_action} filename +# $ # user commentaries (many lines) +# $ generated description - files with this license, license text... (some number of lines that starts with some number of spaces, do not modify) +# ${action} {license spdx} {license text hash} +# $BELONGS ./ya/make/file/relative/path/3/ya.make +# ${all_file_action} filename +# $ # user commentaries +# $ generated description +# $ ... +# +# You can modify action, all_file_action and add commentaries +# Available actions: +# keep - keep license in contrib and use in credits +# skip - skip license +# remove - remove all files with this license +# rename - save license text/links into licenses texts file, but not store SPDX into LINCENSE macro. You should store correct license id into devtools.license.spdx.txt file +# +# {all file action} records will be generated when license text contains filename that exists on filesystem (in contrib directory) +# We suppose that that files can contain some license info +# Available all file actions: +# FILE_IGNORE - ignore file (do nothing) +# FILE_INCLUDE - include all file data into licenses text file +# ======================= + +KEEP COPYRIGHT_SERVICE_LABEL 1d5ea88b15cad450fcd61657e1cf38f0 +BELONGS libcxxrt/ya.make + License text: + * Copyright 2010-2011 PathScale, Inc. All rights reserved. + Scancode info: + Original SPDX id: COPYRIGHT_SERVICE_LABEL + Score : 100.00 + Match type : COPYRIGHT + Files with this license: + libcxxrt/LICENSE [3:3] + libcxxrt/auxhelper.cc [2:2] + libcxxrt/dwarf_eh.h [2:2] + libcxxrt/dynamic_cast.cc [2:2] + libcxxrt/exception.cc [2:2] + libcxxrt/memory.cc [2:2] + libcxxrt/stdexcept.cc [2:2] + libcxxrt/stdexcept.h [2:2] + libcxxrt/typeinfo.h [2:2] + +KEEP COPYRIGHT_SERVICE_LABEL 5efdfd987a88b455d2c1b8018df2035e +BELONGS libcxxrt/ya.make + License text: + * Copyright 2012 David Chisnall. All rights reserved. + Scancode info: + Original SPDX id: COPYRIGHT_SERVICE_LABEL + Score : 100.00 + Match type : COPYRIGHT + Files with this license: + libcxxrt/cxxabi.h [2:2] + +KEEP COPYRIGHT_SERVICE_LABEL 69053d6417df98873c8a8b466c648c78 +BELONGS libcxxrt/ya.make + License text: + * Copyright 2010-2012 PathScale, Inc. All rights reserved. + Scancode info: + Original SPDX id: COPYRIGHT_SERVICE_LABEL + Score : 100.00 + Match type : COPYRIGHT + Files with this license: + libcxxrt/guard.cc [2:2] + libcxxrt/typeinfo.cc [2:2] + +KEEP COPYRIGHT_SERVICE_LABEL 7e6a182a2f65f965d96f2755976c1829 +BELONGS libcxx/ya.make + License text: + * FreeBSD libc. These are covered by the following copyright: + * + * Copyright (c) 2002-2004 Tim J. Robbins. + Scancode info: + Original SPDX id: COPYRIGHT_SERVICE_LABEL + Score : 100.00 + Match type : COPYRIGHT + Files with this license: + libcxx/src/support/solaris/mbsnrtowcs.inc [5:7] + libcxx/src/support/solaris/wcsnrtombs.inc [2:2] + +KEEP COPYRIGHT_SERVICE_LABEL ebc015cad7377d32e7b2fc0ae5293aa1 +BELONGS libcxx/ya.make +FILE_INCLUDE libcxx/CREDITS.TXT found in files: libcxx/LICENSE.TXT at line 252 +FILE_IGNORE libcxxabi/CREDITS.TXT found in files: libcxx/LICENSE.TXT at line 252 + # libcxxabi/CREDITS.TXT included in libcxxabi + License text: + Copyright (c) 2009-2019 by the contributors listed in CREDITS.TXT + Scancode info: + Original SPDX id: COPYRIGHT_SERVICE_LABEL + Score : 100.00 + Match type : COPYRIGHT + Files with this license: + libcxx/LICENSE.TXT [252:252] + +KEEP COPYRIGHT_SERVICE_LABEL f52c727d32a7eaf5a8de6bc96b82797c +BELONGS libcxx/ya.make +FILE_INCLUDE libcxx/CREDITS.TXT found in files: libcxx/LICENSE.TXT at line 293 +FILE_IGNORE libcxxabi/CREDITS.TXT found in files: libcxx/LICENSE.TXT at line 293 + # libcxxabi/CREDITS.TXT included in libcxxabi + License text: + Copyright (c) 2009-2014 by the contributors listed in CREDITS.TXT + Scancode info: + Original SPDX id: COPYRIGHT_SERVICE_LABEL + Score : 100.00 + Match type : COPYRIGHT + Files with this license: + libcxx/LICENSE.TXT [293:293] diff --git a/contrib/libs/cxxsupp/.yandex_meta/devtools.licenses.report b/contrib/libs/cxxsupp/.yandex_meta/devtools.licenses.report index 5322307293..debc2f374c 100644 --- a/contrib/libs/cxxsupp/.yandex_meta/devtools.licenses.report +++ b/contrib/libs/cxxsupp/.yandex_meta/devtools.licenses.report @@ -1,1656 +1,1656 @@ -# File format ($ symbol means the beginning of a line): -# -# $ # this message -# $ # ======================= -# $ # comments (all commentaries should starts with some number of spaces and # symbol) -# ${action} {license spdx} {license text hash} -# $BELONGS ./ya/make/file/relative/path/1/ya.make ./ya/make/2/ya.make -# ${all_file_action} filename -# $ # user commentaries (many lines) -# $ generated description - files with this license, license text... (some number of lines that starts with some number of spaces, do not modify) -# ${action} {license spdx} {license text hash} -# $BELONGS ./ya/make/file/relative/path/3/ya.make -# ${all_file_action} filename -# $ # user commentaries -# $ generated description -# $ ... -# -# You can modify action, all_file_action and add commentaries -# Available actions: -# keep - keep license in contrib and use in credits -# skip - skip license -# remove - remove all files with this license -# rename - save license text/links into licenses texts file, but not store SPDX into LINCENSE macro. You should store correct license id into devtools.license.spdx.txt file -# -# {all file action} records will be generated when license text contains filename that exists on filesystem (in contrib directory) -# We suppose that that files can contain some license info -# Available all file actions: -# FILE_IGNORE - ignore file (do nothing) -# FILE_INCLUDE - include all file data into licenses text file -# ======================= - -KEEP NCSA AND MIT 0791db4b6d90edd44c715bba1e426f74 -BELONGS openmp/ya.make -FILE_INCLUDE builtins/LICENSE.txt found in files: openmp/extractExternal.cpp at line 11, openmp/include/30/omp.h.var at line 11, openmp/include/40/omp.h.var at line 11, openmp/include/41/omp.h.var at line 11, openmp/kmp.h at line 12, openmp/kmp_affinity.cpp at line 11, openmp/kmp_affinity.h at line 11, openmp/kmp_alloc.c at line 11, openmp/kmp_atomic.c at line 11, openmp/kmp_atomic.h at line 11, openmp/kmp_barrier.cpp at line 11, openmp/kmp_cancel.cpp at line 7, openmp/kmp_config.h at line 9, openmp/kmp_csupport.c at line 11, openmp/kmp_debug.c at line 11, openmp/kmp_debug.h at line 11, openmp/kmp_debugger.c at line 12, openmp/kmp_debugger.h at line 12, openmp/kmp_dispatch.cpp at line 11, openmp/kmp_environment.c at line 11, openmp/kmp_environment.h at line 11, openmp/kmp_error.c at line 11, openmp/kmp_error.h at line 11, openmp/kmp_ftn_cdecl.c at line 11, openmp/kmp_ftn_entry.h at line 11, openmp/kmp_ftn_extra.c at line 11, openmp/kmp_ftn_os.h at line 11, openmp/kmp_ftn_stdcall.c at line 11, openmp/kmp_global.c at line 11, openmp/kmp_gsupport.c at line 11, openmp/kmp_i18n.c at line 11, openmp/kmp_i18n.h at line 11, openmp/kmp_import.c at line 11, openmp/kmp_io.c at line 11, openmp/kmp_io.h at line 11, openmp/kmp_itt.c at line 14, openmp/kmp_itt.h at line 12, openmp/kmp_itt.inl at line 12, openmp/kmp_lock.cpp at line 11, openmp/kmp_lock.h at line 11, openmp/kmp_omp.h at line 13, openmp/kmp_os.h at line 11, openmp/kmp_platform.h at line 10, openmp/kmp_runtime.c at line 11, openmp/kmp_safe_c_api.h at line 7, openmp/kmp_sched.cpp at line 11, openmp/kmp_settings.c at line 11, openmp/kmp_settings.h at line 11, openmp/kmp_stats.cpp at line 11, openmp/kmp_stats.h at line 14, openmp/kmp_stats_timing.cpp at line 11, openmp/kmp_stats_timing.h at line 14, openmp/kmp_str.c at line 11, openmp/kmp_str.h at line 11, openmp/kmp_stub.c at line 11, openmp/kmp_stub.h at line 11, openmp/kmp_taskdeps.cpp at line 11, openmp/kmp_tasking.c at line 11, openmp/kmp_taskq.c at line 11, openmp/kmp_threadprivate.c at line 11, openmp/kmp_utility.c at line 11, openmp/kmp_version.c at line 11, openmp/kmp_version.h at line 11, openmp/kmp_wait_release.cpp at line 11, openmp/kmp_wait_release.h at line 11, openmp/kmp_wrapper_getpid.h at line 11, openmp/kmp_wrapper_malloc.h at line 12, openmp/omp.h at line 11, openmp/test-touch.c at line 9, openmp/thirdparty/ittnotify/disable_warnings.h at line 7, openmp/thirdparty/ittnotify/ittnotify.h at line 7, openmp/thirdparty/ittnotify/ittnotify_config.h at line 7, openmp/thirdparty/ittnotify/ittnotify_static.c at line 7, openmp/thirdparty/ittnotify/ittnotify_types.h at line 7, openmp/thirdparty/ittnotify/legacy/ittnotify.h at line 7, openmp/z_Linux_util.c at line 11, openmp/z_Windows_NT-586_util.c at line 11, openmp/z_Windows_NT_util.c at line 11 - License text: - // This file is dual licensed under the MIT and the University of Illinois Open - // Source Licenses. See LICENSE.txt for details. - Scancode info: - Original SPDX id: NCSA - Score : 100.00 - Match type : NOTICE - Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA - Files with this license: - openmp/extractExternal.cpp [10:11] - openmp/include/30/omp.h.var [10:11] - openmp/include/40/omp.h.var [10:11] - openmp/include/41/omp.h.var [10:11] - openmp/kmp.h [11:12] - openmp/kmp_affinity.cpp [10:11] - openmp/kmp_affinity.h [10:11] - openmp/kmp_alloc.c [10:11] - openmp/kmp_atomic.c [10:11] - openmp/kmp_atomic.h [10:11] - openmp/kmp_barrier.cpp [10:11] - openmp/kmp_cancel.cpp [6:7] - openmp/kmp_config.h [8:9] - openmp/kmp_csupport.c [10:11] - openmp/kmp_debug.c [10:11] - openmp/kmp_debug.h [10:11] - openmp/kmp_debugger.c [11:12] - openmp/kmp_debugger.h [11:12] - openmp/kmp_dispatch.cpp [10:11] - openmp/kmp_environment.c [10:11] - openmp/kmp_environment.h [10:11] - openmp/kmp_error.c [10:11] - openmp/kmp_error.h [10:11] - openmp/kmp_ftn_cdecl.c [10:11] - openmp/kmp_ftn_entry.h [10:11] - openmp/kmp_ftn_extra.c [10:11] - openmp/kmp_ftn_os.h [10:11] - openmp/kmp_ftn_stdcall.c [10:11] - openmp/kmp_global.c [10:11] - openmp/kmp_gsupport.c [10:11] - openmp/kmp_i18n.c [10:11] - openmp/kmp_i18n.h [10:11] - openmp/kmp_import.c [10:11] - openmp/kmp_io.c [10:11] - openmp/kmp_io.h [10:11] - openmp/kmp_itt.c [13:14] - openmp/kmp_itt.h [11:12] - openmp/kmp_itt.inl [11:12] - openmp/kmp_lock.cpp [10:11] - openmp/kmp_lock.h [10:11] - openmp/kmp_omp.h [12:13] - openmp/kmp_os.h [10:11] - openmp/kmp_platform.h [9:10] - openmp/kmp_runtime.c [10:11] - openmp/kmp_safe_c_api.h [6:7] - openmp/kmp_sched.cpp [10:11] - openmp/kmp_settings.c [10:11] - openmp/kmp_settings.h [10:11] - openmp/kmp_stats.cpp [10:11] - openmp/kmp_stats.h [13:14] - openmp/kmp_stats_timing.cpp [10:11] - openmp/kmp_stats_timing.h [13:14] - openmp/kmp_str.c [10:11] - openmp/kmp_str.h [10:11] - openmp/kmp_stub.c [10:11] - openmp/kmp_stub.h [10:11] - openmp/kmp_taskdeps.cpp [10:11] - openmp/kmp_tasking.c [10:11] - openmp/kmp_taskq.c [10:11] - openmp/kmp_threadprivate.c [10:11] - openmp/kmp_utility.c [10:11] - openmp/kmp_version.c [10:11] - openmp/kmp_version.h [10:11] - openmp/kmp_wait_release.cpp [10:11] - openmp/kmp_wait_release.h [10:11] - openmp/kmp_wrapper_getpid.h [10:11] - openmp/kmp_wrapper_malloc.h [11:12] - openmp/omp.h [10:11] - openmp/test-touch.c [8:9] - openmp/thirdparty/ittnotify/disable_warnings.h [6:7] - openmp/thirdparty/ittnotify/ittnotify.h [6:7] - openmp/thirdparty/ittnotify/ittnotify_config.h [6:7] - openmp/thirdparty/ittnotify/ittnotify_static.c [6:7] - openmp/thirdparty/ittnotify/ittnotify_types.h [6:7] - openmp/thirdparty/ittnotify/legacy/ittnotify.h [6:7] - openmp/z_Linux_util.c [10:11] - openmp/z_Windows_NT-586_util.c [10:11] - openmp/z_Windows_NT_util.c [10:11] - Scancode info: - Original SPDX id: MIT - Score : 100.00 - Match type : NOTICE - Links : http://opensource.org/licenses/mit-license.php, https://spdx.org/licenses/MIT - Files with this license: - openmp/extractExternal.cpp [10:11] - openmp/include/30/omp.h.var [10:11] - openmp/include/40/omp.h.var [10:11] - openmp/include/41/omp.h.var [10:11] - openmp/kmp.h [11:12] - openmp/kmp_affinity.cpp [10:11] - openmp/kmp_affinity.h [10:11] - openmp/kmp_alloc.c [10:11] - openmp/kmp_atomic.c [10:11] - openmp/kmp_atomic.h [10:11] - openmp/kmp_barrier.cpp [10:11] - openmp/kmp_cancel.cpp [6:7] - openmp/kmp_config.h [8:9] - openmp/kmp_csupport.c [10:11] - openmp/kmp_debug.c [10:11] - openmp/kmp_debug.h [10:11] - openmp/kmp_debugger.c [11:12] - openmp/kmp_debugger.h [11:12] - openmp/kmp_dispatch.cpp [10:11] - openmp/kmp_environment.c [10:11] - openmp/kmp_environment.h [10:11] - openmp/kmp_error.c [10:11] - openmp/kmp_error.h [10:11] - openmp/kmp_ftn_cdecl.c [10:11] - openmp/kmp_ftn_entry.h [10:11] - openmp/kmp_ftn_extra.c [10:11] - openmp/kmp_ftn_os.h [10:11] - openmp/kmp_ftn_stdcall.c [10:11] - openmp/kmp_global.c [10:11] - openmp/kmp_gsupport.c [10:11] - openmp/kmp_i18n.c [10:11] - openmp/kmp_i18n.h [10:11] - openmp/kmp_import.c [10:11] - openmp/kmp_io.c [10:11] - openmp/kmp_io.h [10:11] - openmp/kmp_itt.c [13:14] - openmp/kmp_itt.h [11:12] - openmp/kmp_itt.inl [11:12] - openmp/kmp_lock.cpp [10:11] - openmp/kmp_lock.h [10:11] - openmp/kmp_omp.h [12:13] - openmp/kmp_os.h [10:11] - openmp/kmp_platform.h [9:10] - openmp/kmp_runtime.c [10:11] - openmp/kmp_safe_c_api.h [6:7] - openmp/kmp_sched.cpp [10:11] - openmp/kmp_settings.c [10:11] - openmp/kmp_settings.h [10:11] - openmp/kmp_stats.cpp [10:11] - openmp/kmp_stats.h [13:14] - openmp/kmp_stats_timing.cpp [10:11] - openmp/kmp_stats_timing.h [13:14] - openmp/kmp_str.c [10:11] - openmp/kmp_str.h [10:11] - openmp/kmp_stub.c [10:11] - openmp/kmp_stub.h [10:11] - openmp/kmp_taskdeps.cpp [10:11] - openmp/kmp_tasking.c [10:11] - openmp/kmp_taskq.c [10:11] - openmp/kmp_threadprivate.c [10:11] - openmp/kmp_utility.c [10:11] - openmp/kmp_version.c [10:11] - openmp/kmp_version.h [10:11] - openmp/kmp_wait_release.cpp [10:11] - openmp/kmp_wait_release.h [10:11] - openmp/kmp_wrapper_getpid.h [10:11] - openmp/kmp_wrapper_malloc.h [11:12] - openmp/omp.h [10:11] - openmp/test-touch.c [8:9] - openmp/thirdparty/ittnotify/disable_warnings.h [6:7] - openmp/thirdparty/ittnotify/ittnotify.h [6:7] - openmp/thirdparty/ittnotify/ittnotify_config.h [6:7] - openmp/thirdparty/ittnotify/ittnotify_static.c [6:7] - openmp/thirdparty/ittnotify/ittnotify_types.h [6:7] - openmp/thirdparty/ittnotify/legacy/ittnotify.h [6:7] - openmp/z_Linux_util.c [10:11] - openmp/z_Windows_NT-586_util.c [10:11] - openmp/z_Windows_NT_util.c [10:11] - -KEEP NCSA AND MIT 1f7e00acb6cda5de868d4d4c1ffe3c2b -BELONGS libcxx/ya.make - Note: matched license text is too long. Read it in the source files. - Scancode info: - Original SPDX id: NCSA - Score : 100.00 - Match type : NOTICE - Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA - Files with this license: - libcxx/LICENSE.TXT [240:245] - Scancode info: - Original SPDX id: MIT - Score : 100.00 - Match type : NOTICE - Links : http://opensource.org/licenses/mit-license.php, https://spdx.org/licenses/MIT - Files with this license: - libcxx/LICENSE.TXT [240:245] - -KEEP NCSA AND MIT 479de2cae020eacfac58212c03d33ab1 -BELONGS openmp/ya.make -FILE_INCLUDE builtins/LICENSE.txt found in files: openmp/thirdparty/ittnotify/ittnotify_static.h at line 7 - License text: - // This file is dual licensed under the MIT and the University of Illinois Open - // Source Licenses. See LICENSE.txt for details. - Scancode info: - Original SPDX id: NCSA - Score : 100.00 - Match type : NOTICE - Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA - Files with this license: - openmp/thirdparty/ittnotify/ittnotify_static.h [6:7] - Scancode info: - Original SPDX id: MIT - Score : 100.00 - Match type : NOTICE - Links : http://opensource.org/licenses/mit-license.php, https://spdx.org/licenses/MIT - Files with this license: - openmp/thirdparty/ittnotify/ittnotify_static.h [6:7] - -KEEP NCSA 5a35b4c0d3b3923cac31a5a371332ca2 -BELONGS libcxx/ya.make - License text: - Legacy LLVM License (https://llvm.org/docs/DeveloperPolicy.html#legacy): - Scancode info: - Original SPDX id: NCSA - Score : 100.00 - Match type : REFERENCE - Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA - Files with this license: - libcxx/LICENSE.TXT [237:237] - -KEEP BSD-2-Clause 5a4c43ebab4641c8f908bfd9c8d25cec -BELONGS libcxxrt/ya.make -FILE_IGNORE libcxx/include/experimental/list found in files: libcxxrt/exception.cc at line 11, libcxxrt/exception.cc at line 8 -FILE_IGNORE libcxx/include/list found in files: libcxxrt/exception.cc at line 11, libcxxrt/exception.cc at line 8 -FILE_INCLUDE libcxxrt/COPYRIGHT found in files: libcxxrt/exception.cc at line 14, libcxxrt/exception.cc at line 17 - # list - just word, not file reference - Note: matched license text is too long. Read it in the source files. - Scancode info: - Original SPDX id: BSD-2-Clause - Score : 100.00 - Match type : TEXT - Links : http://opensource.org/licenses/bsd-license.php, http://www.opensource.org/licenses/BSD-2-Clause, https://spdx.org/licenses/BSD-2-Clause - Files with this license: - libcxxrt/exception.cc [4:24] - -KEEP MIT 5debb370f50e1dfd24ff5144233a2ef6 -BELONGS libcxx/ya.make -FILE_IGNORE libcxx/include/any found in files: libcxx/LICENSE.TXT at line 295 -FILE_INCLUDE libcxxrt/AUTHORS found in files: libcxx/LICENSE.TXT at line 308 -FILE_INCLUDE libcxxrt/COPYRIGHT found in files: libcxx/LICENSE.TXT at line 308 - # any - just word, not file reference - Note: matched license text is too long. Read it in the source files. - Scancode info: - Original SPDX id: MIT - Score : 100.00 - Match type : TEXT - Links : http://opensource.org/licenses/mit-license.php, https://spdx.org/licenses/MIT - Files with this license: - libcxx/LICENSE.TXT [295:311] - -KEEP NCSA AND MIT 61ab203794bd26e0aab2c6b954e30d9a -BELONGS openmp/ya.make -FILE_INCLUDE builtins/LICENSE.txt found in files: openmp/libomp.rc.var at line 9, openmp/z_Linux_asm.s at line 10 - License text: - //// This file is dual licensed under the MIT and the University of Illinois Open - //// Source Licenses. See LICENSE.txt for details. - Scancode info: - Original SPDX id: NCSA - Score : 100.00 - Match type : NOTICE - Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA - Files with this license: - openmp/libomp.rc.var [8:9] - openmp/z_Linux_asm.s [9:10] - Scancode info: - Original SPDX id: MIT - Score : 100.00 - Match type : NOTICE - Links : http://opensource.org/licenses/mit-license.php, https://spdx.org/licenses/MIT - Files with this license: - openmp/libomp.rc.var [8:9] - openmp/z_Linux_asm.s [9:10] - -KEEP Apache-2.0 WITH LLVM-exception 705a75a25bce12b12334e8fc577d8a46 -BELONGS libcxx/ya.make - License text: - * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. - * See https://llvm.org/LICENSE.txt for license information. - Scancode info: - Original SPDX id: Apache-2.0 - Score : 100.00 - Match type : NOTICE - Links : http://www.apache.org/licenses/, http://www.apache.org/licenses/LICENSE-2.0, https://spdx.org/licenses/Apache-2.0 - Files with this license: - libcxx/src/filesystem/int128_builtins.cpp [3:4] - Scancode info: - Original SPDX id: LLVM-exception - Score : 100.00 - Match type : NOTICE - Links : http://llvm.org/foundation/relicensing/LICENSE.txt, https://spdx.org/licenses/LLVM-exception - Files with this license: - libcxx/src/filesystem/int128_builtins.cpp [3:4] - -KEEP Apache-2.0 WITH LLVM-exception 755ab7da3ff8c5d6ae90bdbebd177e49 -BELONGS libcxx/ya.make - License text: - // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. - // See https://llvm.org/LICENSE.txt for license information. - Scancode info: - Original SPDX id: Apache-2.0 - Score : 100.00 - Match type : NOTICE - Links : http://www.apache.org/licenses/, http://www.apache.org/licenses/LICENSE-2.0, https://spdx.org/licenses/Apache-2.0 - Files with this license: - libcxx/include/__availability [4:5] - libcxx/include/__bit_reference [4:5] - libcxx/include/__bsd_locale_defaults.h [4:5] - libcxx/include/__bsd_locale_fallbacks.h [4:5] - libcxx/include/__config [4:5] - libcxx/include/__config_site.in [3:4] - libcxx/include/__debug [4:5] - libcxx/include/__errc [4:5] - libcxx/include/__functional_03 [4:5] - libcxx/include/__functional_base [4:5] - libcxx/include/__functional_base_03 [4:5] - libcxx/include/__hash_table [4:5] - libcxx/include/__locale [4:5] - libcxx/include/__memory/allocator_traits.h [4:5] - libcxx/include/__memory/base.h [4:5] - libcxx/include/__memory/pointer_traits.h [4:5] - libcxx/include/__memory/utilities.h [4:5] - libcxx/include/__mutex_base [4:5] - libcxx/include/__node_handle [4:5] - libcxx/include/__nullptr [4:5] - libcxx/include/__sso_allocator [4:5] - libcxx/include/__std_stream [4:5] - libcxx/include/__string [4:5] - libcxx/include/__threading_support [4:5] - libcxx/include/__tree [4:5] - libcxx/include/__tuple [4:5] - libcxx/include/__undef_macros [4:5] - libcxx/include/algorithm [4:5] - libcxx/include/any [4:5] - libcxx/include/array [4:5] - libcxx/include/atomic [4:5] - libcxx/include/barrier [4:5] - libcxx/include/bit [4:5] - libcxx/include/bitset [4:5] - libcxx/include/cassert [4:5] - libcxx/include/ccomplex [4:5] - libcxx/include/cctype [4:5] - libcxx/include/cerrno [4:5] - libcxx/include/cfenv [4:5] - libcxx/include/cfloat [4:5] - libcxx/include/charconv [4:5] - libcxx/include/chrono [4:5] - libcxx/include/cinttypes [4:5] - libcxx/include/ciso646 [4:5] - libcxx/include/climits [4:5] - libcxx/include/clocale [4:5] - libcxx/include/cmath [4:5] - libcxx/include/codecvt [4:5] - libcxx/include/compare [4:5] - libcxx/include/complex [4:5] - libcxx/include/complex.h [4:5] - libcxx/include/concepts [4:5] - libcxx/include/condition_variable [4:5] - libcxx/include/csetjmp [4:5] - libcxx/include/csignal [4:5] - libcxx/include/cstdarg [4:5] - libcxx/include/cstdbool [4:5] - libcxx/include/cstddef [4:5] - libcxx/include/cstdint [4:5] - libcxx/include/cstdio [4:5] - libcxx/include/cstdlib [4:5] - libcxx/include/cstring [4:5] - libcxx/include/ctgmath [4:5] - libcxx/include/ctime [4:5] - libcxx/include/ctype.h [4:5] - libcxx/include/cwchar [4:5] - libcxx/include/cwctype [4:5] - libcxx/include/deque [4:5] - libcxx/include/errno.h [4:5] - libcxx/include/exception [4:5] - libcxx/include/execution [4:5] - libcxx/include/experimental/__memory [4:5] - libcxx/include/experimental/algorithm [4:5] - libcxx/include/experimental/coroutine [4:5] - libcxx/include/experimental/deque [4:5] - libcxx/include/experimental/filesystem [4:5] - libcxx/include/experimental/forward_list [4:5] - libcxx/include/experimental/functional [4:5] - libcxx/include/experimental/iterator [4:5] - libcxx/include/experimental/list [4:5] - libcxx/include/experimental/map [4:5] - libcxx/include/experimental/memory_resource [4:5] - libcxx/include/experimental/propagate_const [4:5] - libcxx/include/experimental/regex [4:5] - libcxx/include/experimental/set [4:5] - libcxx/include/experimental/simd [4:5] - libcxx/include/experimental/string [4:5] - libcxx/include/experimental/type_traits [4:5] - libcxx/include/experimental/unordered_map [4:5] - libcxx/include/experimental/unordered_set [4:5] - libcxx/include/experimental/utility [4:5] - libcxx/include/experimental/vector [4:5] - libcxx/include/ext/__hash [4:5] - libcxx/include/ext/hash_map [4:5] - libcxx/include/ext/hash_set [4:5] - libcxx/include/filesystem [4:5] - libcxx/include/float.h [4:5] - libcxx/include/forward_list [4:5] - libcxx/include/fstream [4:5] - libcxx/include/functional [4:5] - libcxx/include/future [4:5] - libcxx/include/initializer_list [4:5] - libcxx/include/inttypes.h [4:5] - libcxx/include/iomanip [4:5] - libcxx/include/ios [4:5] - libcxx/include/iosfwd [4:5] - libcxx/include/iostream [4:5] - libcxx/include/istream [4:5] - libcxx/include/iterator [4:5] - libcxx/include/latch [4:5] - libcxx/include/limits [4:5] - libcxx/include/limits.h [4:5] - libcxx/include/list [4:5] - libcxx/include/locale [4:5] - libcxx/include/locale.h [4:5] - libcxx/include/map [4:5] - libcxx/include/math.h [4:5] - libcxx/include/memory [4:5] - libcxx/include/mutex [4:5] - libcxx/include/new [4:5] - libcxx/include/numbers [4:5] - libcxx/include/numeric [4:5] - libcxx/include/optional [4:5] - libcxx/include/ostream [4:5] - libcxx/include/queue [4:5] - libcxx/include/random [4:5] - libcxx/include/ratio [4:5] - libcxx/include/regex [4:5] - libcxx/include/scoped_allocator [4:5] - libcxx/include/semaphore [4:5] - libcxx/include/set [4:5] - libcxx/include/setjmp.h [4:5] - libcxx/include/shared_mutex [4:5] - libcxx/include/span [4:5] - libcxx/include/sstream [4:5] - libcxx/include/stack [4:5] - libcxx/include/stdbool.h [4:5] - libcxx/include/stddef.h [4:5] - libcxx/include/stdexcept [4:5] - libcxx/include/stdint.h [4:5] - libcxx/include/stdio.h [4:5] - libcxx/include/stdlib.h [4:5] - libcxx/include/streambuf [4:5] - libcxx/include/string [4:5] - libcxx/include/string.h [4:5] - libcxx/include/string_view [4:5] - libcxx/include/strstream [4:5] - libcxx/include/support/android/locale_bionic.h [4:5] - libcxx/include/support/fuchsia/xlocale.h [4:5] - libcxx/include/support/ibm/limits.h [4:5] - libcxx/include/support/ibm/locale_mgmt_aix.h [4:5] - libcxx/include/support/ibm/nanosleep.h [4:5] - libcxx/include/support/ibm/support.h [4:5] - libcxx/include/support/ibm/xlocale.h [4:5] - libcxx/include/support/musl/xlocale.h [4:5] - libcxx/include/support/newlib/xlocale.h [3:4] - libcxx/include/support/nuttx/xlocale.h [4:5] - libcxx/include/support/solaris/floatingpoint.h [3:4] - libcxx/include/support/solaris/wchar.h [3:4] - libcxx/include/support/solaris/xlocale.h [3:4] - libcxx/include/support/win32/limits_msvc_win32.h [4:5] - libcxx/include/support/win32/locale_win32.h [4:5] - libcxx/include/support/xlocale/__nop_locale_mgmt.h [4:5] - libcxx/include/support/xlocale/__posix_l_fallback.h [4:5] - libcxx/include/support/xlocale/__strtonum_fallback.h [4:5] - libcxx/include/system_error [4:5] - libcxx/include/tgmath.h [4:5] - libcxx/include/thread [4:5] - libcxx/include/tuple [4:5] - libcxx/include/type_traits [4:5] - libcxx/include/typeindex [4:5] - libcxx/include/typeinfo [4:5] - libcxx/include/unordered_map [4:5] - libcxx/include/unordered_set [4:5] - libcxx/include/utility [4:5] - libcxx/include/valarray [4:5] - libcxx/include/variant [4:5] - libcxx/include/vector [4:5] - libcxx/include/version [4:5] - libcxx/include/wchar.h [4:5] - libcxx/include/wctype.h [4:5] - libcxx/src/algorithm.cpp [3:4] - libcxx/src/any.cpp [3:4] - libcxx/src/atomic.cpp [3:4] - libcxx/src/barrier.cpp [3:4] - libcxx/src/bind.cpp [3:4] - libcxx/src/charconv.cpp [3:4] - libcxx/src/chrono.cpp [3:4] - libcxx/src/condition_variable.cpp [3:4] - libcxx/src/condition_variable_destructor.cpp [3:4] - libcxx/src/debug.cpp [3:4] - libcxx/src/exception.cpp [3:4] - libcxx/src/experimental/memory_resource.cpp [3:4] - libcxx/src/filesystem/directory_iterator.cpp [3:4] - libcxx/src/filesystem/filesystem_common.h [3:4] - libcxx/src/filesystem/operations.cpp [3:4] - libcxx/src/functional.cpp [3:4] - libcxx/src/future.cpp [3:4] - libcxx/src/hash.cpp [3:4] - libcxx/src/include/apple_availability.h [3:4] - libcxx/src/include/atomic_support.h [3:4] - libcxx/src/include/config_elast.h [3:4] - libcxx/src/include/refstring.h [3:4] - libcxx/src/ios.cpp [3:4] - libcxx/src/ios.instantiations.cpp [3:4] - libcxx/src/iostream.cpp [3:4] - libcxx/src/locale.cpp [3:4] - libcxx/src/memory.cpp [3:4] - libcxx/src/mutex.cpp [3:4] - libcxx/src/mutex_destructor.cpp [3:4] - libcxx/src/new.cpp [3:4] - libcxx/src/optional.cpp [3:4] - libcxx/src/random.cpp [3:4] - libcxx/src/random_shuffle.cpp [3:4] - libcxx/src/regex.cpp [3:4] - libcxx/src/shared_mutex.cpp [3:4] - libcxx/src/stdexcept.cpp [3:4] - libcxx/src/string.cpp [3:4] - libcxx/src/strstream.cpp [3:4] - libcxx/src/support/runtime/exception_fallback.ipp [4:5] - libcxx/src/support/runtime/exception_glibcxx.ipp [4:5] - libcxx/src/support/runtime/exception_libcxxabi.ipp [4:5] - libcxx/src/support/runtime/exception_libcxxrt.ipp [4:5] - libcxx/src/support/runtime/exception_msvc.ipp [4:5] - libcxx/src/support/runtime/exception_pointer_cxxabi.ipp [4:5] - libcxx/src/support/runtime/exception_pointer_glibcxx.ipp [4:5] - libcxx/src/support/runtime/exception_pointer_msvc.ipp [4:5] - libcxx/src/support/runtime/exception_pointer_unimplemented.ipp [4:5] - libcxx/src/support/runtime/new_handler_fallback.ipp [4:5] - libcxx/src/support/runtime/stdexcept_default.ipp [3:4] - libcxx/src/support/runtime/stdexcept_vcruntime.ipp [3:4] - libcxx/src/support/solaris/xlocale.cpp [3:4] - libcxx/src/support/win32/locale_win32.cpp [4:5] - libcxx/src/support/win32/support.cpp [4:5] - libcxx/src/support/win32/thread_win32.cpp [4:5] - libcxx/src/system_error.cpp [3:4] - libcxx/src/thread.cpp [3:4] - libcxx/src/typeinfo.cpp [3:4] - libcxx/src/utility.cpp [3:4] - libcxx/src/valarray.cpp [3:4] - libcxx/src/variant.cpp [3:4] - libcxx/src/vector.cpp [3:4] - Scancode info: - Original SPDX id: LLVM-exception - Score : 100.00 - Match type : NOTICE - Links : http://llvm.org/foundation/relicensing/LICENSE.txt, https://spdx.org/licenses/LLVM-exception - Files with this license: - libcxx/include/__availability [4:5] - libcxx/include/__bit_reference [4:5] - libcxx/include/__bsd_locale_defaults.h [4:5] - libcxx/include/__bsd_locale_fallbacks.h [4:5] - libcxx/include/__config [4:5] - libcxx/include/__config_site.in [3:4] - libcxx/include/__debug [4:5] - libcxx/include/__errc [4:5] - libcxx/include/__functional_03 [4:5] - libcxx/include/__functional_base [4:5] - libcxx/include/__functional_base_03 [4:5] - libcxx/include/__hash_table [4:5] - libcxx/include/__locale [4:5] - libcxx/include/__memory/allocator_traits.h [4:5] - libcxx/include/__memory/base.h [4:5] - libcxx/include/__memory/pointer_traits.h [4:5] - libcxx/include/__memory/utilities.h [4:5] - libcxx/include/__mutex_base [4:5] - libcxx/include/__node_handle [4:5] - libcxx/include/__nullptr [4:5] - libcxx/include/__sso_allocator [4:5] - libcxx/include/__std_stream [4:5] - libcxx/include/__string [4:5] - libcxx/include/__threading_support [4:5] - libcxx/include/__tree [4:5] - libcxx/include/__tuple [4:5] - libcxx/include/__undef_macros [4:5] - libcxx/include/algorithm [4:5] - libcxx/include/any [4:5] - libcxx/include/array [4:5] - libcxx/include/atomic [4:5] - libcxx/include/barrier [4:5] - libcxx/include/bit [4:5] - libcxx/include/bitset [4:5] - libcxx/include/cassert [4:5] - libcxx/include/ccomplex [4:5] - libcxx/include/cctype [4:5] - libcxx/include/cerrno [4:5] - libcxx/include/cfenv [4:5] - libcxx/include/cfloat [4:5] - libcxx/include/charconv [4:5] - libcxx/include/chrono [4:5] - libcxx/include/cinttypes [4:5] - libcxx/include/ciso646 [4:5] - libcxx/include/climits [4:5] - libcxx/include/clocale [4:5] - libcxx/include/cmath [4:5] - libcxx/include/codecvt [4:5] - libcxx/include/compare [4:5] - libcxx/include/complex [4:5] - libcxx/include/complex.h [4:5] - libcxx/include/concepts [4:5] - libcxx/include/condition_variable [4:5] - libcxx/include/csetjmp [4:5] - libcxx/include/csignal [4:5] - libcxx/include/cstdarg [4:5] - libcxx/include/cstdbool [4:5] - libcxx/include/cstddef [4:5] - libcxx/include/cstdint [4:5] - libcxx/include/cstdio [4:5] - libcxx/include/cstdlib [4:5] - libcxx/include/cstring [4:5] - libcxx/include/ctgmath [4:5] - libcxx/include/ctime [4:5] - libcxx/include/ctype.h [4:5] - libcxx/include/cwchar [4:5] - libcxx/include/cwctype [4:5] - libcxx/include/deque [4:5] - libcxx/include/errno.h [4:5] - libcxx/include/exception [4:5] - libcxx/include/execution [4:5] - libcxx/include/experimental/__memory [4:5] - libcxx/include/experimental/algorithm [4:5] - libcxx/include/experimental/coroutine [4:5] - libcxx/include/experimental/deque [4:5] - libcxx/include/experimental/filesystem [4:5] - libcxx/include/experimental/forward_list [4:5] - libcxx/include/experimental/functional [4:5] - libcxx/include/experimental/iterator [4:5] - libcxx/include/experimental/list [4:5] - libcxx/include/experimental/map [4:5] - libcxx/include/experimental/memory_resource [4:5] - libcxx/include/experimental/propagate_const [4:5] - libcxx/include/experimental/regex [4:5] - libcxx/include/experimental/set [4:5] - libcxx/include/experimental/simd [4:5] - libcxx/include/experimental/string [4:5] - libcxx/include/experimental/type_traits [4:5] - libcxx/include/experimental/unordered_map [4:5] - libcxx/include/experimental/unordered_set [4:5] - libcxx/include/experimental/utility [4:5] - libcxx/include/experimental/vector [4:5] - libcxx/include/ext/__hash [4:5] - libcxx/include/ext/hash_map [4:5] - libcxx/include/ext/hash_set [4:5] - libcxx/include/filesystem [4:5] - libcxx/include/float.h [4:5] - libcxx/include/forward_list [4:5] - libcxx/include/fstream [4:5] - libcxx/include/functional [4:5] - libcxx/include/future [4:5] - libcxx/include/initializer_list [4:5] - libcxx/include/inttypes.h [4:5] - libcxx/include/iomanip [4:5] - libcxx/include/ios [4:5] - libcxx/include/iosfwd [4:5] - libcxx/include/iostream [4:5] - libcxx/include/istream [4:5] - libcxx/include/iterator [4:5] - libcxx/include/latch [4:5] - libcxx/include/limits [4:5] - libcxx/include/limits.h [4:5] - libcxx/include/list [4:5] - libcxx/include/locale [4:5] - libcxx/include/locale.h [4:5] - libcxx/include/map [4:5] - libcxx/include/math.h [4:5] - libcxx/include/memory [4:5] - libcxx/include/mutex [4:5] - libcxx/include/new [4:5] - libcxx/include/numbers [4:5] - libcxx/include/numeric [4:5] - libcxx/include/optional [4:5] - libcxx/include/ostream [4:5] - libcxx/include/queue [4:5] - libcxx/include/random [4:5] - libcxx/include/ratio [4:5] - libcxx/include/regex [4:5] - libcxx/include/scoped_allocator [4:5] - libcxx/include/semaphore [4:5] - libcxx/include/set [4:5] - libcxx/include/setjmp.h [4:5] - libcxx/include/shared_mutex [4:5] - libcxx/include/span [4:5] - libcxx/include/sstream [4:5] - libcxx/include/stack [4:5] - libcxx/include/stdbool.h [4:5] - libcxx/include/stddef.h [4:5] - libcxx/include/stdexcept [4:5] - libcxx/include/stdint.h [4:5] - libcxx/include/stdio.h [4:5] - libcxx/include/stdlib.h [4:5] - libcxx/include/streambuf [4:5] - libcxx/include/string [4:5] - libcxx/include/string.h [4:5] - libcxx/include/string_view [4:5] - libcxx/include/strstream [4:5] - libcxx/include/support/android/locale_bionic.h [4:5] - libcxx/include/support/fuchsia/xlocale.h [4:5] - libcxx/include/support/ibm/limits.h [4:5] - libcxx/include/support/ibm/locale_mgmt_aix.h [4:5] - libcxx/include/support/ibm/nanosleep.h [4:5] - libcxx/include/support/ibm/support.h [4:5] - libcxx/include/support/ibm/xlocale.h [4:5] - libcxx/include/support/musl/xlocale.h [4:5] - libcxx/include/support/newlib/xlocale.h [3:4] - libcxx/include/support/nuttx/xlocale.h [4:5] - libcxx/include/support/solaris/floatingpoint.h [3:4] - libcxx/include/support/solaris/wchar.h [3:4] - libcxx/include/support/solaris/xlocale.h [3:4] - libcxx/include/support/win32/limits_msvc_win32.h [4:5] - libcxx/include/support/win32/locale_win32.h [4:5] - libcxx/include/support/xlocale/__nop_locale_mgmt.h [4:5] - libcxx/include/support/xlocale/__posix_l_fallback.h [4:5] - libcxx/include/support/xlocale/__strtonum_fallback.h [4:5] - libcxx/include/system_error [4:5] - libcxx/include/tgmath.h [4:5] - libcxx/include/thread [4:5] - libcxx/include/tuple [4:5] - libcxx/include/type_traits [4:5] - libcxx/include/typeindex [4:5] - libcxx/include/typeinfo [4:5] - libcxx/include/unordered_map [4:5] - libcxx/include/unordered_set [4:5] - libcxx/include/utility [4:5] - libcxx/include/valarray [4:5] - libcxx/include/variant [4:5] - libcxx/include/vector [4:5] - libcxx/include/version [4:5] - libcxx/include/wchar.h [4:5] - libcxx/include/wctype.h [4:5] - libcxx/src/algorithm.cpp [3:4] - libcxx/src/any.cpp [3:4] - libcxx/src/atomic.cpp [3:4] - libcxx/src/barrier.cpp [3:4] - libcxx/src/bind.cpp [3:4] - libcxx/src/charconv.cpp [3:4] - libcxx/src/chrono.cpp [3:4] - libcxx/src/condition_variable.cpp [3:4] - libcxx/src/condition_variable_destructor.cpp [3:4] - libcxx/src/debug.cpp [3:4] - libcxx/src/exception.cpp [3:4] - libcxx/src/experimental/memory_resource.cpp [3:4] - libcxx/src/filesystem/directory_iterator.cpp [3:4] - libcxx/src/filesystem/filesystem_common.h [3:4] - libcxx/src/filesystem/operations.cpp [3:4] - libcxx/src/functional.cpp [3:4] - libcxx/src/future.cpp [3:4] - libcxx/src/hash.cpp [3:4] - libcxx/src/include/apple_availability.h [3:4] - libcxx/src/include/atomic_support.h [3:4] - libcxx/src/include/config_elast.h [3:4] - libcxx/src/include/refstring.h [3:4] - libcxx/src/ios.cpp [3:4] - libcxx/src/ios.instantiations.cpp [3:4] - libcxx/src/iostream.cpp [3:4] - libcxx/src/locale.cpp [3:4] - libcxx/src/memory.cpp [3:4] - libcxx/src/mutex.cpp [3:4] - libcxx/src/mutex_destructor.cpp [3:4] - libcxx/src/new.cpp [3:4] - libcxx/src/optional.cpp [3:4] - libcxx/src/random.cpp [3:4] - libcxx/src/random_shuffle.cpp [3:4] - libcxx/src/regex.cpp [3:4] - libcxx/src/shared_mutex.cpp [3:4] - libcxx/src/stdexcept.cpp [3:4] - libcxx/src/string.cpp [3:4] - libcxx/src/strstream.cpp [3:4] - libcxx/src/support/runtime/exception_fallback.ipp [4:5] - libcxx/src/support/runtime/exception_glibcxx.ipp [4:5] - libcxx/src/support/runtime/exception_libcxxabi.ipp [4:5] - libcxx/src/support/runtime/exception_libcxxrt.ipp [4:5] - libcxx/src/support/runtime/exception_msvc.ipp [4:5] - libcxx/src/support/runtime/exception_pointer_cxxabi.ipp [4:5] - libcxx/src/support/runtime/exception_pointer_glibcxx.ipp [4:5] - libcxx/src/support/runtime/exception_pointer_msvc.ipp [4:5] - libcxx/src/support/runtime/exception_pointer_unimplemented.ipp [4:5] - libcxx/src/support/runtime/new_handler_fallback.ipp [4:5] - libcxx/src/support/runtime/stdexcept_default.ipp [3:4] - libcxx/src/support/runtime/stdexcept_vcruntime.ipp [3:4] - libcxx/src/support/solaris/xlocale.cpp [3:4] - libcxx/src/support/win32/locale_win32.cpp [4:5] - libcxx/src/support/win32/support.cpp [4:5] - libcxx/src/support/win32/thread_win32.cpp [4:5] - libcxx/src/system_error.cpp [3:4] - libcxx/src/thread.cpp [3:4] - libcxx/src/typeinfo.cpp [3:4] - libcxx/src/utility.cpp [3:4] - libcxx/src/valarray.cpp [3:4] - libcxx/src/variant.cpp [3:4] - libcxx/src/vector.cpp [3:4] - -KEEP Apache-2.0 WITH LLVM-exception 8494a9caed330d9a4f40e19cce7dc770 -BELONGS libcxx/ya.make -FILE_INCLUDE libcxx/include/exception found in files: libcxx/LICENSE.TXT at line 210 - Note: matched license text is too long. Read it in the source files. - Scancode info: - Original SPDX id: LLVM-exception - Score : 100.00 - Match type : TEXT - Links : http://llvm.org/foundation/relicensing/LICENSE.txt, https://spdx.org/licenses/LLVM-exception - Files with this license: - libcxx/LICENSE.TXT [208:222] - -KEEP Apache-2.0 WITH LLVM-exception 86617d55e1d949711c543404d91f4cea -BELONGS libcxx/ya.make - License text: - // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception - Scancode info: - Original SPDX id: Apache-2.0 - Score : 100.00 - Match type : TAG - Links : http://www.apache.org/licenses/, http://www.apache.org/licenses/LICENSE-2.0, https://spdx.org/licenses/Apache-2.0 - Files with this license: - libcxx/include/experimental/__config [6:6] - Scancode info: - Original SPDX id: LLVM-exception - Score : 100.00 - Match type : TAG - Links : http://llvm.org/foundation/relicensing/LICENSE.txt, https://spdx.org/licenses/LLVM-exception - Files with this license: - libcxx/include/experimental/__config [6:6] - -KEEP BSD-3-Clause 88f80886d9ea21e0b7205bd3730230e4 -BELONGS libcxxrt/ya.make - License text: - The BSD License - Scancode info: - Original SPDX id: BSD-3-Clause - Score : 99.00 - Match type : REFERENCE - Links : http://www.opensource.org/licenses/BSD-3-Clause, https://spdx.org/licenses/BSD-3-Clause - Files with this license: - libcxxrt/LICENSE [1:1] - -KEEP BSD-2-Clause 8cedb6171c06f89f0e6eefd60e5f79d5 -BELONGS libcxxrt/ya.make -FILE_IGNORE libcxx/include/experimental/list found in files: libcxxrt/auxhelper.cc at line 11, libcxxrt/auxhelper.cc at line 8, libcxxrt/dwarf_eh.h at line 11, libcxxrt/dwarf_eh.h at line 8, libcxxrt/dynamic_cast.cc at line 11, libcxxrt/dynamic_cast.cc at line 8, libcxxrt/guard.cc at line 11, libcxxrt/guard.cc at line 8, libcxxrt/memory.cc at line 11, libcxxrt/memory.cc at line 8, libcxxrt/stdexcept.cc at line 11, libcxxrt/stdexcept.cc at line 8, libcxxrt/stdexcept.h at line 11, libcxxrt/stdexcept.h at line 8, libcxxrt/typeinfo.cc at line 11, libcxxrt/typeinfo.cc at line 8, libcxxrt/typeinfo.h at line 11, libcxxrt/typeinfo.h at line 8 -FILE_IGNORE libcxx/include/list found in files: libcxxrt/auxhelper.cc at line 11, libcxxrt/auxhelper.cc at line 8, libcxxrt/dwarf_eh.h at line 11, libcxxrt/dwarf_eh.h at line 8, libcxxrt/dynamic_cast.cc at line 11, libcxxrt/dynamic_cast.cc at line 8, libcxxrt/guard.cc at line 11, libcxxrt/guard.cc at line 8, libcxxrt/memory.cc at line 11, libcxxrt/memory.cc at line 8, libcxxrt/stdexcept.cc at line 11, libcxxrt/stdexcept.cc at line 8, libcxxrt/stdexcept.h at line 11, libcxxrt/stdexcept.h at line 8, libcxxrt/typeinfo.cc at line 11, libcxxrt/typeinfo.cc at line 8, libcxxrt/typeinfo.h at line 11, libcxxrt/typeinfo.h at line 8 -FILE_INCLUDE libcxxrt/COPYRIGHT found in files: libcxxrt/auxhelper.cc at line 14, libcxxrt/auxhelper.cc at line 17, libcxxrt/dwarf_eh.h at line 14, libcxxrt/dwarf_eh.h at line 17, libcxxrt/dynamic_cast.cc at line 14, libcxxrt/dynamic_cast.cc at line 17, libcxxrt/guard.cc at line 14, libcxxrt/guard.cc at line 17, libcxxrt/memory.cc at line 14, libcxxrt/memory.cc at line 17, libcxxrt/stdexcept.cc at line 14, libcxxrt/stdexcept.cc at line 17, libcxxrt/stdexcept.h at line 14, libcxxrt/stdexcept.h at line 17, libcxxrt/typeinfo.cc at line 14, libcxxrt/typeinfo.cc at line 17, libcxxrt/typeinfo.h at line 14, libcxxrt/typeinfo.h at line 17 - # list - just word, not file reference - Note: matched license text is too long. Read it in the source files. - Scancode info: - Original SPDX id: BSD-2-Clause - Score : 100.00 - Match type : TEXT - Links : http://opensource.org/licenses/bsd-license.php, http://www.opensource.org/licenses/BSD-2-Clause, https://spdx.org/licenses/BSD-2-Clause - Files with this license: - libcxxrt/auxhelper.cc [4:24] - libcxxrt/dwarf_eh.h [4:24] - libcxxrt/dynamic_cast.cc [4:24] - libcxxrt/guard.cc [4:24] - libcxxrt/memory.cc [4:24] - libcxxrt/stdexcept.cc [4:24] - libcxxrt/stdexcept.h [4:24] - libcxxrt/typeinfo.cc [4:24] - libcxxrt/typeinfo.h [4:24] - -KEEP MIT 8ee097b6bcb3429ad39c4dbd5cc0e35e -BELONGS libcxxrt/ya.make -FILE_IGNORE libcxx/include/any found in files: libcxxrt/cxxabi.h at line 4 -FILE_INCLUDE libcxxrt/AUTHORS found in files: libcxxrt/cxxabi.h at line 17 -FILE_INCLUDE libcxxrt/COPYRIGHT found in files: libcxxrt/cxxabi.h at line 17 - # any - just word, not file reference - Note: matched license text is too long. Read it in the source files. - Scancode info: - Original SPDX id: MIT - Score : 100.00 - Match type : TEXT - Links : http://opensource.org/licenses/mit-license.php, https://spdx.org/licenses/MIT - Files with this license: - libcxxrt/cxxabi.h [4:20] - -KEEP Apache-2.0 9ac77f65a898755c7eed97099caded94 -BELONGS libcxx/ya.make -FILE_INCLUDE libcxx/import found in files: libcxx/LICENSE.TXT at line 81 -FILE_IGNORE libcxx/include/any found in files: libcxx/LICENSE.TXT at line 101, libcxx/LICENSE.TXT at line 104, libcxx/LICENSE.TXT at line 107, libcxx/LICENSE.TXT at line 111, libcxx/LICENSE.TXT at line 114, libcxx/LICENSE.TXT at line 130, libcxx/LICENSE.TXT at line 135, libcxx/LICENSE.TXT at line 137, libcxx/LICENSE.TXT at line 139, libcxx/LICENSE.TXT at line 151, libcxx/LICENSE.TXT at line 154, libcxx/LICENSE.TXT at line 160, libcxx/LICENSE.TXT at line 161, libcxx/LICENSE.TXT at line 162, libcxx/LICENSE.TXT at line 165, libcxx/LICENSE.TXT at line 175, libcxx/LICENSE.TXT at line 176, libcxx/LICENSE.TXT at line 178, libcxx/LICENSE.TXT at line 34, libcxx/LICENSE.TXT at line 44, libcxx/LICENSE.TXT at line 52, libcxx/LICENSE.TXT at line 53, libcxx/LICENSE.TXT at line 58, libcxx/LICENSE.TXT at line 66, libcxx/LICENSE.TXT at line 86, libcxx/LICENSE.TXT at line 89, libcxx/LICENSE.TXT at line 94, libcxx/LICENSE.TXT at line 98 -FILE_IGNORE libcxx/include/version found in files: libcxx/LICENSE.TXT at line 53 - # any and version - just words, not file reference - Note: matched license text is too long. Read it in the source files. - Scancode info: - Original SPDX id: Apache-2.0 - Score : 100.00 - Match type : TEXT - Links : http://www.apache.org/licenses/, http://www.apache.org/licenses/LICENSE-2.0, https://spdx.org/licenses/Apache-2.0 - Files with this license: - libcxx/LICENSE.TXT [5:205] - -KEEP NCSA AND MIT 9d5ffd6253d2b406a8bc3bbf3cb4f38b -BELONGS openmp/ya.make -FILE_INCLUDE builtins/LICENSE.txt found in files: openmp/include/30/omp_lib.f.var at line 9, openmp/include/30/omp_lib.f90.var at line 9, openmp/include/30/omp_lib.h.var at line 9, openmp/include/40/omp_lib.f.var at line 9, openmp/include/40/omp_lib.f90.var at line 9, openmp/include/40/omp_lib.h.var at line 9, openmp/include/41/omp_lib.f.var at line 9, openmp/include/41/omp_lib.f90.var at line 9, openmp/include/41/omp_lib.h.var at line 9 - License text: - !// This file is dual licensed under the MIT and the University of Illinois Open - !// Source Licenses. See LICENSE.txt for details. - Scancode info: - Original SPDX id: NCSA - Score : 100.00 - Match type : NOTICE - Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA - Files with this license: - openmp/include/30/omp_lib.f.var [8:9] - openmp/include/30/omp_lib.f90.var [8:9] - openmp/include/30/omp_lib.h.var [8:9] - openmp/include/40/omp_lib.f.var [8:9] - openmp/include/40/omp_lib.f90.var [8:9] - openmp/include/40/omp_lib.h.var [8:9] - openmp/include/41/omp_lib.f.var [8:9] - openmp/include/41/omp_lib.f90.var [8:9] - openmp/include/41/omp_lib.h.var [8:9] - Scancode info: - Original SPDX id: MIT - Score : 100.00 - Match type : NOTICE - Links : http://opensource.org/licenses/mit-license.php, https://spdx.org/licenses/MIT - Files with this license: - openmp/include/30/omp_lib.f.var [8:9] - openmp/include/30/omp_lib.f90.var [8:9] - openmp/include/30/omp_lib.h.var [8:9] - openmp/include/40/omp_lib.f.var [8:9] - openmp/include/40/omp_lib.f90.var [8:9] - openmp/include/40/omp_lib.h.var [8:9] - openmp/include/41/omp_lib.f.var [8:9] - openmp/include/41/omp_lib.f90.var [8:9] - openmp/include/41/omp_lib.h.var [8:9] - -KEEP NCSA b160d8bd561da097b0edd40b062e1c84 -BELONGS libcxx/ya.make -FILE_IGNORE libcxx/include/any found in files: libcxx/LICENSE.TXT at line 264 -FILE_IGNORE libcxx/include/experimental/list found in files: libcxx/LICENSE.TXT at line 272, libcxx/LICENSE.TXT at line 275 -FILE_IGNORE libcxx/include/list found in files: libcxx/LICENSE.TXT at line 272, libcxx/LICENSE.TXT at line 275 -FILE_INCLUDE libcxxrt/COPYRIGHT found in files: libcxx/LICENSE.TXT at line 286 - # any and list - just words, not file reference - Note: matched license text is too long. Read it in the source files. - Scancode info: - Original SPDX id: NCSA - Score : 100.00 - Match type : TEXT - Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA - Files with this license: - libcxx/LICENSE.TXT [264:289] - -KEEP BSD-2-Clause AND MIT b1ce5ac90fd7360272c132242b0d10e9 -BELONGS libcxx/ya.make - License text: - 2-clause BSD license instead of the MIT/UUIC license that the rest of libc++ is - Scancode info: - Original SPDX id: BSD-2-Clause - Score : 100.00 - Match type : REFERENCE - Links : http://opensource.org/licenses/bsd-license.php, http://www.opensource.org/licenses/BSD-2-Clause, https://spdx.org/licenses/BSD-2-Clause - Files with this license: - libcxx/src/support/solaris/README [3:3] - Scancode info: - Original SPDX id: MIT - Score : 75.00 - Match type : REFERENCE - Links : http://opensource.org/licenses/mit-license.php, https://spdx.org/licenses/MIT - Files with this license: - libcxx/src/support/solaris/README [3:3] - -KEEP Apache-2.0 WITH LLVM-exception b4f32daeb289687c0be6afeacb7df231 -BELONGS libcxx/ya.make - License text: - // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. - // See https://llvm.org/LICENSE.txt for license information. - Scancode info: - Original SPDX id: Apache-2.0 - Score : 100.00 - Match type : NOTICE - Links : http://www.apache.org/licenses/, http://www.apache.org/licenses/LICENSE-2.0, https://spdx.org/licenses/Apache-2.0 - Files with this license: - libcxx/include/experimental/__config [4:5] - Scancode info: - Original SPDX id: LLVM-exception - Score : 100.00 - Match type : NOTICE - Links : http://llvm.org/foundation/relicensing/LICENSE.txt, https://spdx.org/licenses/LLVM-exception - Files with this license: - libcxx/include/experimental/__config [4:5] - -KEEP Apache-2.0 WITH LLVM-exception b7566a1930e050e1090162bf1d543650 -BELONGS libcxx/ya.make - License text: - // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception - Scancode info: - Original SPDX id: Apache-2.0 - Score : 100.00 - Match type : TAG - Links : http://www.apache.org/licenses/, http://www.apache.org/licenses/LICENSE-2.0, https://spdx.org/licenses/Apache-2.0 - Files with this license: - libcxx/include/__availability [6:6] - libcxx/include/__bit_reference [6:6] - libcxx/include/__bsd_locale_defaults.h [6:6] - libcxx/include/__bsd_locale_fallbacks.h [6:6] - libcxx/include/__config [6:6] - libcxx/include/__config_site.in [5:5] - libcxx/include/__debug [6:6] - libcxx/include/__errc [6:6] - libcxx/include/__functional_03 [6:6] - libcxx/include/__functional_base [6:6] - libcxx/include/__functional_base_03 [6:6] - libcxx/include/__hash_table [6:6] - libcxx/include/__locale [6:6] - libcxx/include/__memory/allocator_traits.h [6:6] - libcxx/include/__memory/base.h [6:6] - libcxx/include/__memory/pointer_traits.h [6:6] - libcxx/include/__memory/utilities.h [6:6] - libcxx/include/__mutex_base [6:6] - libcxx/include/__node_handle [6:6] - libcxx/include/__nullptr [6:6] - libcxx/include/__sso_allocator [6:6] - libcxx/include/__std_stream [6:6] - libcxx/include/__string [6:6] - libcxx/include/__threading_support [6:6] - libcxx/include/__tree [6:6] - libcxx/include/__tuple [6:6] - libcxx/include/__undef_macros [6:6] - libcxx/include/algorithm [6:6] - libcxx/include/any [6:6] - libcxx/include/array [6:6] - libcxx/include/atomic [6:6] - libcxx/include/barrier [6:6] - libcxx/include/bit [6:6] - libcxx/include/bitset [6:6] - libcxx/include/cassert [6:6] - libcxx/include/ccomplex [6:6] - libcxx/include/cctype [6:6] - libcxx/include/cerrno [6:6] - libcxx/include/cfenv [6:6] - libcxx/include/cfloat [6:6] - libcxx/include/charconv [6:6] - libcxx/include/chrono [6:6] - libcxx/include/cinttypes [6:6] - libcxx/include/ciso646 [6:6] - libcxx/include/climits [6:6] - libcxx/include/clocale [6:6] - libcxx/include/cmath [6:6] - libcxx/include/codecvt [6:6] - libcxx/include/compare [6:6] - libcxx/include/complex [6:6] - libcxx/include/complex.h [6:6] - libcxx/include/concepts [6:6] - libcxx/include/condition_variable [6:6] - libcxx/include/csetjmp [6:6] - libcxx/include/csignal [6:6] - libcxx/include/cstdarg [6:6] - libcxx/include/cstdbool [6:6] - libcxx/include/cstddef [6:6] - libcxx/include/cstdint [6:6] - libcxx/include/cstdio [6:6] - libcxx/include/cstdlib [6:6] - libcxx/include/cstring [6:6] - libcxx/include/ctgmath [6:6] - libcxx/include/ctime [6:6] - libcxx/include/ctype.h [6:6] - libcxx/include/cwchar [6:6] - libcxx/include/cwctype [6:6] - libcxx/include/deque [6:6] - libcxx/include/errno.h [6:6] - libcxx/include/exception [6:6] - libcxx/include/execution [6:6] - libcxx/include/experimental/__memory [6:6] - libcxx/include/experimental/algorithm [6:6] - libcxx/include/experimental/coroutine [6:6] - libcxx/include/experimental/deque [6:6] - libcxx/include/experimental/filesystem [6:6] - libcxx/include/experimental/forward_list [6:6] - libcxx/include/experimental/functional [6:6] - libcxx/include/experimental/iterator [6:6] - libcxx/include/experimental/list [6:6] - libcxx/include/experimental/map [6:6] - libcxx/include/experimental/memory_resource [6:6] - libcxx/include/experimental/propagate_const [6:6] - libcxx/include/experimental/regex [6:6] - libcxx/include/experimental/set [6:6] - libcxx/include/experimental/simd [6:6] - libcxx/include/experimental/string [6:6] - libcxx/include/experimental/type_traits [6:6] - libcxx/include/experimental/unordered_map [6:6] - libcxx/include/experimental/unordered_set [6:6] - libcxx/include/experimental/utility [6:6] - libcxx/include/experimental/vector [6:6] - libcxx/include/ext/__hash [6:6] - libcxx/include/ext/hash_map [6:6] - libcxx/include/ext/hash_set [6:6] - libcxx/include/filesystem [6:6] - libcxx/include/float.h [6:6] - libcxx/include/forward_list [6:6] - libcxx/include/fstream [6:6] - libcxx/include/functional [6:6] - libcxx/include/future [6:6] - libcxx/include/initializer_list [6:6] - libcxx/include/inttypes.h [6:6] - libcxx/include/iomanip [6:6] - libcxx/include/ios [6:6] - libcxx/include/iosfwd [6:6] - libcxx/include/iostream [6:6] - libcxx/include/istream [6:6] - libcxx/include/iterator [6:6] - libcxx/include/latch [6:6] - libcxx/include/limits [6:6] - libcxx/include/limits.h [6:6] - libcxx/include/list [6:6] - libcxx/include/locale [6:6] - libcxx/include/locale.h [6:6] - libcxx/include/map [6:6] - libcxx/include/math.h [6:6] - libcxx/include/memory [6:6] - libcxx/include/mutex [6:6] - libcxx/include/new [6:6] - libcxx/include/numbers [6:6] - libcxx/include/numeric [6:6] - libcxx/include/optional [6:6] - libcxx/include/ostream [6:6] - libcxx/include/queue [6:6] - libcxx/include/random [6:6] - libcxx/include/ratio [6:6] - libcxx/include/regex [6:6] - libcxx/include/scoped_allocator [6:6] - libcxx/include/semaphore [6:6] - libcxx/include/set [6:6] - libcxx/include/setjmp.h [6:6] - libcxx/include/shared_mutex [6:6] - libcxx/include/span [6:6] - libcxx/include/sstream [6:6] - libcxx/include/stack [6:6] - libcxx/include/stdbool.h [6:6] - libcxx/include/stddef.h [6:6] - libcxx/include/stdexcept [6:6] - libcxx/include/stdint.h [6:6] - libcxx/include/stdio.h [6:6] - libcxx/include/stdlib.h [6:6] - libcxx/include/streambuf [6:6] - libcxx/include/string [6:6] - libcxx/include/string.h [6:6] - libcxx/include/string_view [6:6] - libcxx/include/strstream [6:6] - libcxx/include/support/android/locale_bionic.h [6:6] - libcxx/include/support/fuchsia/xlocale.h [6:6] - libcxx/include/support/ibm/limits.h [6:6] - libcxx/include/support/ibm/locale_mgmt_aix.h [6:6] - libcxx/include/support/ibm/nanosleep.h [6:6] - libcxx/include/support/ibm/support.h [6:6] - libcxx/include/support/ibm/xlocale.h [6:6] - libcxx/include/support/musl/xlocale.h [6:6] - libcxx/include/support/newlib/xlocale.h [5:5] - libcxx/include/support/nuttx/xlocale.h [6:6] - libcxx/include/support/solaris/floatingpoint.h [5:5] - libcxx/include/support/solaris/wchar.h [5:5] - libcxx/include/support/solaris/xlocale.h [5:5] - libcxx/include/support/win32/limits_msvc_win32.h [6:6] - libcxx/include/support/win32/locale_win32.h [6:6] - libcxx/include/support/xlocale/__nop_locale_mgmt.h [6:6] - libcxx/include/support/xlocale/__posix_l_fallback.h [6:6] - libcxx/include/support/xlocale/__strtonum_fallback.h [6:6] - libcxx/include/system_error [6:6] - libcxx/include/tgmath.h [6:6] - libcxx/include/thread [6:6] - libcxx/include/tuple [6:6] - libcxx/include/type_traits [6:6] - libcxx/include/typeindex [6:6] - libcxx/include/typeinfo [6:6] - libcxx/include/unordered_map [6:6] - libcxx/include/unordered_set [6:6] - libcxx/include/utility [6:6] - libcxx/include/valarray [6:6] - libcxx/include/variant [6:6] - libcxx/include/vector [6:6] - libcxx/include/version [6:6] - libcxx/include/wchar.h [6:6] - libcxx/include/wctype.h [6:6] - libcxx/src/algorithm.cpp [5:5] - libcxx/src/any.cpp [5:5] - libcxx/src/atomic.cpp [5:5] - libcxx/src/barrier.cpp [5:5] - libcxx/src/bind.cpp [5:5] - libcxx/src/charconv.cpp [5:5] - libcxx/src/chrono.cpp [5:5] - libcxx/src/condition_variable.cpp [5:5] - libcxx/src/condition_variable_destructor.cpp [5:5] - libcxx/src/debug.cpp [5:5] - libcxx/src/exception.cpp [5:5] - libcxx/src/experimental/memory_resource.cpp [5:5] - libcxx/src/filesystem/directory_iterator.cpp [5:5] - libcxx/src/filesystem/filesystem_common.h [5:5] - libcxx/src/filesystem/operations.cpp [5:5] - libcxx/src/functional.cpp [5:5] - libcxx/src/future.cpp [5:5] - libcxx/src/hash.cpp [5:5] - libcxx/src/include/apple_availability.h [5:5] - libcxx/src/include/atomic_support.h [5:5] - libcxx/src/include/config_elast.h [5:5] - libcxx/src/include/refstring.h [5:5] - libcxx/src/ios.cpp [5:5] - libcxx/src/ios.instantiations.cpp [5:5] - libcxx/src/iostream.cpp [5:5] - libcxx/src/locale.cpp [5:5] - libcxx/src/memory.cpp [5:5] - libcxx/src/mutex.cpp [5:5] - libcxx/src/mutex_destructor.cpp [5:5] - libcxx/src/new.cpp [5:5] - libcxx/src/optional.cpp [5:5] - libcxx/src/random.cpp [5:5] - libcxx/src/random_shuffle.cpp [5:5] - libcxx/src/regex.cpp [5:5] - libcxx/src/shared_mutex.cpp [5:5] - libcxx/src/stdexcept.cpp [5:5] - libcxx/src/string.cpp [5:5] - libcxx/src/strstream.cpp [5:5] - libcxx/src/support/runtime/exception_fallback.ipp [6:6] - libcxx/src/support/runtime/exception_glibcxx.ipp [6:6] - libcxx/src/support/runtime/exception_libcxxabi.ipp [6:6] - libcxx/src/support/runtime/exception_libcxxrt.ipp [6:6] - libcxx/src/support/runtime/exception_msvc.ipp [6:6] - libcxx/src/support/runtime/exception_pointer_cxxabi.ipp [6:6] - libcxx/src/support/runtime/exception_pointer_glibcxx.ipp [6:6] - libcxx/src/support/runtime/exception_pointer_msvc.ipp [6:6] - libcxx/src/support/runtime/exception_pointer_unimplemented.ipp [6:6] - libcxx/src/support/runtime/new_handler_fallback.ipp [6:6] - libcxx/src/support/runtime/stdexcept_default.ipp [5:5] - libcxx/src/support/runtime/stdexcept_vcruntime.ipp [5:5] - libcxx/src/support/solaris/xlocale.cpp [5:5] - libcxx/src/support/win32/locale_win32.cpp [6:6] - libcxx/src/support/win32/support.cpp [6:6] - libcxx/src/support/win32/thread_win32.cpp [6:6] - libcxx/src/system_error.cpp [5:5] - libcxx/src/thread.cpp [5:5] - libcxx/src/typeinfo.cpp [5:5] - libcxx/src/utility.cpp [5:5] - libcxx/src/valarray.cpp [5:5] - libcxx/src/variant.cpp [5:5] - libcxx/src/vector.cpp [5:5] - Scancode info: - Original SPDX id: LLVM-exception - Score : 100.00 - Match type : TAG - Links : http://llvm.org/foundation/relicensing/LICENSE.txt, https://spdx.org/licenses/LLVM-exception - Files with this license: - libcxx/include/__availability [6:6] - libcxx/include/__bit_reference [6:6] - libcxx/include/__bsd_locale_defaults.h [6:6] - libcxx/include/__bsd_locale_fallbacks.h [6:6] - libcxx/include/__config [6:6] - libcxx/include/__config_site.in [5:5] - libcxx/include/__debug [6:6] - libcxx/include/__errc [6:6] - libcxx/include/__functional_03 [6:6] - libcxx/include/__functional_base [6:6] - libcxx/include/__functional_base_03 [6:6] - libcxx/include/__hash_table [6:6] - libcxx/include/__locale [6:6] - libcxx/include/__memory/allocator_traits.h [6:6] - libcxx/include/__memory/base.h [6:6] - libcxx/include/__memory/pointer_traits.h [6:6] - libcxx/include/__memory/utilities.h [6:6] - libcxx/include/__mutex_base [6:6] - libcxx/include/__node_handle [6:6] - libcxx/include/__nullptr [6:6] - libcxx/include/__sso_allocator [6:6] - libcxx/include/__std_stream [6:6] - libcxx/include/__string [6:6] - libcxx/include/__threading_support [6:6] - libcxx/include/__tree [6:6] - libcxx/include/__tuple [6:6] - libcxx/include/__undef_macros [6:6] - libcxx/include/algorithm [6:6] - libcxx/include/any [6:6] - libcxx/include/array [6:6] - libcxx/include/atomic [6:6] - libcxx/include/barrier [6:6] - libcxx/include/bit [6:6] - libcxx/include/bitset [6:6] - libcxx/include/cassert [6:6] - libcxx/include/ccomplex [6:6] - libcxx/include/cctype [6:6] - libcxx/include/cerrno [6:6] - libcxx/include/cfenv [6:6] - libcxx/include/cfloat [6:6] - libcxx/include/charconv [6:6] - libcxx/include/chrono [6:6] - libcxx/include/cinttypes [6:6] - libcxx/include/ciso646 [6:6] - libcxx/include/climits [6:6] - libcxx/include/clocale [6:6] - libcxx/include/cmath [6:6] - libcxx/include/codecvt [6:6] - libcxx/include/compare [6:6] - libcxx/include/complex [6:6] - libcxx/include/complex.h [6:6] - libcxx/include/concepts [6:6] - libcxx/include/condition_variable [6:6] - libcxx/include/csetjmp [6:6] - libcxx/include/csignal [6:6] - libcxx/include/cstdarg [6:6] - libcxx/include/cstdbool [6:6] - libcxx/include/cstddef [6:6] - libcxx/include/cstdint [6:6] - libcxx/include/cstdio [6:6] - libcxx/include/cstdlib [6:6] - libcxx/include/cstring [6:6] - libcxx/include/ctgmath [6:6] - libcxx/include/ctime [6:6] - libcxx/include/ctype.h [6:6] - libcxx/include/cwchar [6:6] - libcxx/include/cwctype [6:6] - libcxx/include/deque [6:6] - libcxx/include/errno.h [6:6] - libcxx/include/exception [6:6] - libcxx/include/execution [6:6] - libcxx/include/experimental/__memory [6:6] - libcxx/include/experimental/algorithm [6:6] - libcxx/include/experimental/coroutine [6:6] - libcxx/include/experimental/deque [6:6] - libcxx/include/experimental/filesystem [6:6] - libcxx/include/experimental/forward_list [6:6] - libcxx/include/experimental/functional [6:6] - libcxx/include/experimental/iterator [6:6] - libcxx/include/experimental/list [6:6] - libcxx/include/experimental/map [6:6] - libcxx/include/experimental/memory_resource [6:6] - libcxx/include/experimental/propagate_const [6:6] - libcxx/include/experimental/regex [6:6] - libcxx/include/experimental/set [6:6] - libcxx/include/experimental/simd [6:6] - libcxx/include/experimental/string [6:6] - libcxx/include/experimental/type_traits [6:6] - libcxx/include/experimental/unordered_map [6:6] - libcxx/include/experimental/unordered_set [6:6] - libcxx/include/experimental/utility [6:6] - libcxx/include/experimental/vector [6:6] - libcxx/include/ext/__hash [6:6] - libcxx/include/ext/hash_map [6:6] - libcxx/include/ext/hash_set [6:6] - libcxx/include/filesystem [6:6] - libcxx/include/float.h [6:6] - libcxx/include/forward_list [6:6] - libcxx/include/fstream [6:6] - libcxx/include/functional [6:6] - libcxx/include/future [6:6] - libcxx/include/initializer_list [6:6] - libcxx/include/inttypes.h [6:6] - libcxx/include/iomanip [6:6] - libcxx/include/ios [6:6] - libcxx/include/iosfwd [6:6] - libcxx/include/iostream [6:6] - libcxx/include/istream [6:6] - libcxx/include/iterator [6:6] - libcxx/include/latch [6:6] - libcxx/include/limits [6:6] - libcxx/include/limits.h [6:6] - libcxx/include/list [6:6] - libcxx/include/locale [6:6] - libcxx/include/locale.h [6:6] - libcxx/include/map [6:6] - libcxx/include/math.h [6:6] - libcxx/include/memory [6:6] - libcxx/include/mutex [6:6] - libcxx/include/new [6:6] - libcxx/include/numbers [6:6] - libcxx/include/numeric [6:6] - libcxx/include/optional [6:6] - libcxx/include/ostream [6:6] - libcxx/include/queue [6:6] - libcxx/include/random [6:6] - libcxx/include/ratio [6:6] - libcxx/include/regex [6:6] - libcxx/include/scoped_allocator [6:6] - libcxx/include/semaphore [6:6] - libcxx/include/set [6:6] - libcxx/include/setjmp.h [6:6] - libcxx/include/shared_mutex [6:6] - libcxx/include/span [6:6] - libcxx/include/sstream [6:6] - libcxx/include/stack [6:6] - libcxx/include/stdbool.h [6:6] - libcxx/include/stddef.h [6:6] - libcxx/include/stdexcept [6:6] - libcxx/include/stdint.h [6:6] - libcxx/include/stdio.h [6:6] - libcxx/include/stdlib.h [6:6] - libcxx/include/streambuf [6:6] - libcxx/include/string [6:6] - libcxx/include/string.h [6:6] - libcxx/include/string_view [6:6] - libcxx/include/strstream [6:6] - libcxx/include/support/android/locale_bionic.h [6:6] - libcxx/include/support/fuchsia/xlocale.h [6:6] - libcxx/include/support/ibm/limits.h [6:6] - libcxx/include/support/ibm/locale_mgmt_aix.h [6:6] - libcxx/include/support/ibm/nanosleep.h [6:6] - libcxx/include/support/ibm/support.h [6:6] - libcxx/include/support/ibm/xlocale.h [6:6] - libcxx/include/support/musl/xlocale.h [6:6] - libcxx/include/support/newlib/xlocale.h [5:5] - libcxx/include/support/nuttx/xlocale.h [6:6] - libcxx/include/support/solaris/floatingpoint.h [5:5] - libcxx/include/support/solaris/wchar.h [5:5] - libcxx/include/support/solaris/xlocale.h [5:5] - libcxx/include/support/win32/limits_msvc_win32.h [6:6] - libcxx/include/support/win32/locale_win32.h [6:6] - libcxx/include/support/xlocale/__nop_locale_mgmt.h [6:6] - libcxx/include/support/xlocale/__posix_l_fallback.h [6:6] - libcxx/include/support/xlocale/__strtonum_fallback.h [6:6] - libcxx/include/system_error [6:6] - libcxx/include/tgmath.h [6:6] - libcxx/include/thread [6:6] - libcxx/include/tuple [6:6] - libcxx/include/type_traits [6:6] - libcxx/include/typeindex [6:6] - libcxx/include/typeinfo [6:6] - libcxx/include/unordered_map [6:6] - libcxx/include/unordered_set [6:6] - libcxx/include/utility [6:6] - libcxx/include/valarray [6:6] - libcxx/include/variant [6:6] - libcxx/include/vector [6:6] - libcxx/include/version [6:6] - libcxx/include/wchar.h [6:6] - libcxx/include/wctype.h [6:6] - libcxx/src/algorithm.cpp [5:5] - libcxx/src/any.cpp [5:5] - libcxx/src/atomic.cpp [5:5] - libcxx/src/barrier.cpp [5:5] - libcxx/src/bind.cpp [5:5] - libcxx/src/charconv.cpp [5:5] - libcxx/src/chrono.cpp [5:5] - libcxx/src/condition_variable.cpp [5:5] - libcxx/src/condition_variable_destructor.cpp [5:5] - libcxx/src/debug.cpp [5:5] - libcxx/src/exception.cpp [5:5] - libcxx/src/experimental/memory_resource.cpp [5:5] - libcxx/src/filesystem/directory_iterator.cpp [5:5] - libcxx/src/filesystem/filesystem_common.h [5:5] - libcxx/src/filesystem/operations.cpp [5:5] - libcxx/src/functional.cpp [5:5] - libcxx/src/future.cpp [5:5] - libcxx/src/hash.cpp [5:5] - libcxx/src/include/apple_availability.h [5:5] - libcxx/src/include/atomic_support.h [5:5] - libcxx/src/include/config_elast.h [5:5] - libcxx/src/include/refstring.h [5:5] - libcxx/src/ios.cpp [5:5] - libcxx/src/ios.instantiations.cpp [5:5] - libcxx/src/iostream.cpp [5:5] - libcxx/src/locale.cpp [5:5] - libcxx/src/memory.cpp [5:5] - libcxx/src/mutex.cpp [5:5] - libcxx/src/mutex_destructor.cpp [5:5] - libcxx/src/new.cpp [5:5] - libcxx/src/optional.cpp [5:5] - libcxx/src/random.cpp [5:5] - libcxx/src/random_shuffle.cpp [5:5] - libcxx/src/regex.cpp [5:5] - libcxx/src/shared_mutex.cpp [5:5] - libcxx/src/stdexcept.cpp [5:5] - libcxx/src/string.cpp [5:5] - libcxx/src/strstream.cpp [5:5] - libcxx/src/support/runtime/exception_fallback.ipp [6:6] - libcxx/src/support/runtime/exception_glibcxx.ipp [6:6] - libcxx/src/support/runtime/exception_libcxxabi.ipp [6:6] - libcxx/src/support/runtime/exception_libcxxrt.ipp [6:6] - libcxx/src/support/runtime/exception_msvc.ipp [6:6] - libcxx/src/support/runtime/exception_pointer_cxxabi.ipp [6:6] - libcxx/src/support/runtime/exception_pointer_glibcxx.ipp [6:6] - libcxx/src/support/runtime/exception_pointer_msvc.ipp [6:6] - libcxx/src/support/runtime/exception_pointer_unimplemented.ipp [6:6] - libcxx/src/support/runtime/new_handler_fallback.ipp [6:6] - libcxx/src/support/runtime/stdexcept_default.ipp [5:5] - libcxx/src/support/runtime/stdexcept_vcruntime.ipp [5:5] - libcxx/src/support/solaris/xlocale.cpp [5:5] - libcxx/src/support/win32/locale_win32.cpp [6:6] - libcxx/src/support/win32/support.cpp [6:6] - libcxx/src/support/win32/thread_win32.cpp [6:6] - libcxx/src/system_error.cpp [5:5] - libcxx/src/thread.cpp [5:5] - libcxx/src/typeinfo.cpp [5:5] - libcxx/src/utility.cpp [5:5] - libcxx/src/valarray.cpp [5:5] - libcxx/src/variant.cpp [5:5] - libcxx/src/vector.cpp [5:5] - -KEEP Apache-2.0 WITH LLVM-exception c1e6c6536fcc444f916047679115c618 -BELONGS libcxx/ya.make - License text: - * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception - Scancode info: - Original SPDX id: Apache-2.0 - Score : 100.00 - Match type : TAG - Links : http://www.apache.org/licenses/, http://www.apache.org/licenses/LICENSE-2.0, https://spdx.org/licenses/Apache-2.0 - Files with this license: - libcxx/src/filesystem/int128_builtins.cpp [5:5] - Scancode info: - Original SPDX id: LLVM-exception - Score : 100.00 - Match type : TAG - Links : http://llvm.org/foundation/relicensing/LICENSE.txt, https://spdx.org/licenses/LLVM-exception - Files with this license: - libcxx/src/filesystem/int128_builtins.cpp [5:5] - -KEEP NCSA c26d0b72f92421989c4471ae0acbc943 -BELONGS libcxx/ya.make - License text: - University of Illinois/NCSA - Open Source License - Scancode info: - Original SPDX id: NCSA - Score : 100.00 - Match type : REFERENCE - Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA - Files with this license: - libcxx/LICENSE.TXT [249:250] - -KEEP NCSA AND MIT d2725783fa0a2f24d855943aac3dbdf9 -BELONGS openmp/ya.make -FILE_INCLUDE builtins/LICENSE.txt found in files: openmp/z_Windows_NT-586_asm.asm at line 10 - License text: - ;// This file is dual licensed under the MIT and the University of Illinois Open - ;// Source Licenses. See LICENSE.txt for details. - Scancode info: - Original SPDX id: NCSA - Score : 100.00 - Match type : NOTICE - Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA - Files with this license: - openmp/z_Windows_NT-586_asm.asm [9:10] - Scancode info: - Original SPDX id: MIT - Score : 100.00 - Match type : NOTICE - Links : http://opensource.org/licenses/mit-license.php, https://spdx.org/licenses/MIT - Files with this license: - openmp/z_Windows_NT-586_asm.asm [9:10] - -SKIP LicenseRef-scancode-unknown-license-reference d4fd839c20b32e384ccf02a801e876d1 -BELONGS libcxx/ya.make - # part of bsd-2-clause text - License text: - distributed under. - Scancode info: - Original SPDX id: LicenseRef-scancode-unknown-license-reference - Score : 11.00 - Match type : INTRO - Links : https://github.com/nexB/scancode-toolkit/tree/develop/src/licensedcode/data/licenses/unknown-license-reference.LICENSE - Files with this license: - libcxx/src/support/solaris/README [4:4] - -KEEP Apache-2.0 WITH LLVM-exception df18889e552d44a4679aff552267f802 -BELONGS libcxx/ya.make - License text: - The LLVM Project is under the Apache License v2.0 with LLVM Exceptions: - Scancode info: - Original SPDX id: Apache-2.0 - Score : 100.00 - Match type : NOTICE - Links : http://www.apache.org/licenses/, http://www.apache.org/licenses/LICENSE-2.0, https://spdx.org/licenses/Apache-2.0 - Files with this license: - libcxx/LICENSE.TXT [2:2] - Scancode info: - Original SPDX id: LLVM-exception - Score : 100.00 - Match type : NOTICE - Links : http://llvm.org/foundation/relicensing/LICENSE.txt, https://spdx.org/licenses/LLVM-exception - Files with this license: - libcxx/LICENSE.TXT [2:2] - -KEEP NCSA AND MIT e56769dac6aaa0678164025adda8a1da -BELONGS openmp/ya.make -FILE_INCLUDE builtins/LICENSE.txt found in files: openmp/i18n/en_US.txt at line 9 - License text: - \#// This file is dual licensed under the MIT and the University of Illinois Open - \#// Source Licenses. See LICENSE.txt for details. - Scancode info: - Original SPDX id: NCSA - Score : 100.00 - Match type : NOTICE - Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA - Files with this license: - openmp/i18n/en_US.txt [8:9] - Scancode info: - Original SPDX id: MIT - Score : 100.00 - Match type : NOTICE - Links : http://opensource.org/licenses/mit-license.php, https://spdx.org/licenses/MIT - Files with this license: - openmp/i18n/en_US.txt [8:9] - -KEEP BSD-2-Clause f59cebb43ee786218189ac014af76fbb -BELONGS libcxx/ya.make -FILE_IGNORE libcxx/include/experimental/list found in files: libcxx/src/support/solaris/mbsnrtowcs.inc at line 13, libcxx/src/support/solaris/mbsnrtowcs.inc at line 15, libcxx/src/support/solaris/wcsnrtombs.inc at line 10, libcxx/src/support/solaris/wcsnrtombs.inc at line 8 -FILE_IGNORE libcxx/include/list found in files: libcxx/src/support/solaris/mbsnrtowcs.inc at line 13, libcxx/src/support/solaris/mbsnrtowcs.inc at line 15, libcxx/src/support/solaris/wcsnrtombs.inc at line 10, libcxx/src/support/solaris/wcsnrtombs.inc at line 8 - # list - just word, not file reference - Note: matched license text is too long. Read it in the source files. - Scancode info: - Original SPDX id: BSD-2-Clause - Score : 100.00 - Match type : TEXT - Links : http://opensource.org/licenses/bsd-license.php, http://www.opensource.org/licenses/BSD-2-Clause, https://spdx.org/licenses/BSD-2-Clause - Files with this license: - libcxx/src/support/solaris/mbsnrtowcs.inc [9:28] - libcxx/src/support/solaris/wcsnrtombs.inc [4:23] - -KEEP BSD-2-Clause-Views fa822847a0868c8922cbd110b73455fc -BELONGS libcxxrt/ya.make -FILE_IGNORE libcxx/include/experimental/list found in files: libcxxrt/LICENSE at line 7, libcxxrt/LICENSE at line 8 -FILE_IGNORE libcxx/include/list found in files: libcxxrt/LICENSE at line 7, libcxxrt/LICENSE at line 8 -FILE_INCLUDE libcxxrt/COPYRIGHT found in files: libcxxrt/LICENSE at line 12 - # list - just word, not file reference - Note: matched license text is too long. Read it in the source files. - Scancode info: - Original SPDX id: BSD-2-Clause-Views - Score : 98.16 - Match type : TEXT - Links : https://github.com/protegeproject/protege/blob/master/license.txt, https://spdx.org/licenses/BSD-2-Clause-Views, https://www.freebsd.org/copyright/freebsd-license.html - Files with this license: - libcxxrt/LICENSE [5:14] +# File format ($ symbol means the beginning of a line): +# +# $ # this message +# $ # ======================= +# $ # comments (all commentaries should starts with some number of spaces and # symbol) +# ${action} {license spdx} {license text hash} +# $BELONGS ./ya/make/file/relative/path/1/ya.make ./ya/make/2/ya.make +# ${all_file_action} filename +# $ # user commentaries (many lines) +# $ generated description - files with this license, license text... (some number of lines that starts with some number of spaces, do not modify) +# ${action} {license spdx} {license text hash} +# $BELONGS ./ya/make/file/relative/path/3/ya.make +# ${all_file_action} filename +# $ # user commentaries +# $ generated description +# $ ... +# +# You can modify action, all_file_action and add commentaries +# Available actions: +# keep - keep license in contrib and use in credits +# skip - skip license +# remove - remove all files with this license +# rename - save license text/links into licenses texts file, but not store SPDX into LINCENSE macro. You should store correct license id into devtools.license.spdx.txt file +# +# {all file action} records will be generated when license text contains filename that exists on filesystem (in contrib directory) +# We suppose that that files can contain some license info +# Available all file actions: +# FILE_IGNORE - ignore file (do nothing) +# FILE_INCLUDE - include all file data into licenses text file +# ======================= + +KEEP NCSA AND MIT 0791db4b6d90edd44c715bba1e426f74 +BELONGS openmp/ya.make +FILE_INCLUDE builtins/LICENSE.txt found in files: openmp/extractExternal.cpp at line 11, openmp/include/30/omp.h.var at line 11, openmp/include/40/omp.h.var at line 11, openmp/include/41/omp.h.var at line 11, openmp/kmp.h at line 12, openmp/kmp_affinity.cpp at line 11, openmp/kmp_affinity.h at line 11, openmp/kmp_alloc.c at line 11, openmp/kmp_atomic.c at line 11, openmp/kmp_atomic.h at line 11, openmp/kmp_barrier.cpp at line 11, openmp/kmp_cancel.cpp at line 7, openmp/kmp_config.h at line 9, openmp/kmp_csupport.c at line 11, openmp/kmp_debug.c at line 11, openmp/kmp_debug.h at line 11, openmp/kmp_debugger.c at line 12, openmp/kmp_debugger.h at line 12, openmp/kmp_dispatch.cpp at line 11, openmp/kmp_environment.c at line 11, openmp/kmp_environment.h at line 11, openmp/kmp_error.c at line 11, openmp/kmp_error.h at line 11, openmp/kmp_ftn_cdecl.c at line 11, openmp/kmp_ftn_entry.h at line 11, openmp/kmp_ftn_extra.c at line 11, openmp/kmp_ftn_os.h at line 11, openmp/kmp_ftn_stdcall.c at line 11, openmp/kmp_global.c at line 11, openmp/kmp_gsupport.c at line 11, openmp/kmp_i18n.c at line 11, openmp/kmp_i18n.h at line 11, openmp/kmp_import.c at line 11, openmp/kmp_io.c at line 11, openmp/kmp_io.h at line 11, openmp/kmp_itt.c at line 14, openmp/kmp_itt.h at line 12, openmp/kmp_itt.inl at line 12, openmp/kmp_lock.cpp at line 11, openmp/kmp_lock.h at line 11, openmp/kmp_omp.h at line 13, openmp/kmp_os.h at line 11, openmp/kmp_platform.h at line 10, openmp/kmp_runtime.c at line 11, openmp/kmp_safe_c_api.h at line 7, openmp/kmp_sched.cpp at line 11, openmp/kmp_settings.c at line 11, openmp/kmp_settings.h at line 11, openmp/kmp_stats.cpp at line 11, openmp/kmp_stats.h at line 14, openmp/kmp_stats_timing.cpp at line 11, openmp/kmp_stats_timing.h at line 14, openmp/kmp_str.c at line 11, openmp/kmp_str.h at line 11, openmp/kmp_stub.c at line 11, openmp/kmp_stub.h at line 11, openmp/kmp_taskdeps.cpp at line 11, openmp/kmp_tasking.c at line 11, openmp/kmp_taskq.c at line 11, openmp/kmp_threadprivate.c at line 11, openmp/kmp_utility.c at line 11, openmp/kmp_version.c at line 11, openmp/kmp_version.h at line 11, openmp/kmp_wait_release.cpp at line 11, openmp/kmp_wait_release.h at line 11, openmp/kmp_wrapper_getpid.h at line 11, openmp/kmp_wrapper_malloc.h at line 12, openmp/omp.h at line 11, openmp/test-touch.c at line 9, openmp/thirdparty/ittnotify/disable_warnings.h at line 7, openmp/thirdparty/ittnotify/ittnotify.h at line 7, openmp/thirdparty/ittnotify/ittnotify_config.h at line 7, openmp/thirdparty/ittnotify/ittnotify_static.c at line 7, openmp/thirdparty/ittnotify/ittnotify_types.h at line 7, openmp/thirdparty/ittnotify/legacy/ittnotify.h at line 7, openmp/z_Linux_util.c at line 11, openmp/z_Windows_NT-586_util.c at line 11, openmp/z_Windows_NT_util.c at line 11 + License text: + // This file is dual licensed under the MIT and the University of Illinois Open + // Source Licenses. See LICENSE.txt for details. + Scancode info: + Original SPDX id: NCSA + Score : 100.00 + Match type : NOTICE + Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA + Files with this license: + openmp/extractExternal.cpp [10:11] + openmp/include/30/omp.h.var [10:11] + openmp/include/40/omp.h.var [10:11] + openmp/include/41/omp.h.var [10:11] + openmp/kmp.h [11:12] + openmp/kmp_affinity.cpp [10:11] + openmp/kmp_affinity.h [10:11] + openmp/kmp_alloc.c [10:11] + openmp/kmp_atomic.c [10:11] + openmp/kmp_atomic.h [10:11] + openmp/kmp_barrier.cpp [10:11] + openmp/kmp_cancel.cpp [6:7] + openmp/kmp_config.h [8:9] + openmp/kmp_csupport.c [10:11] + openmp/kmp_debug.c [10:11] + openmp/kmp_debug.h [10:11] + openmp/kmp_debugger.c [11:12] + openmp/kmp_debugger.h [11:12] + openmp/kmp_dispatch.cpp [10:11] + openmp/kmp_environment.c [10:11] + openmp/kmp_environment.h [10:11] + openmp/kmp_error.c [10:11] + openmp/kmp_error.h [10:11] + openmp/kmp_ftn_cdecl.c [10:11] + openmp/kmp_ftn_entry.h [10:11] + openmp/kmp_ftn_extra.c [10:11] + openmp/kmp_ftn_os.h [10:11] + openmp/kmp_ftn_stdcall.c [10:11] + openmp/kmp_global.c [10:11] + openmp/kmp_gsupport.c [10:11] + openmp/kmp_i18n.c [10:11] + openmp/kmp_i18n.h [10:11] + openmp/kmp_import.c [10:11] + openmp/kmp_io.c [10:11] + openmp/kmp_io.h [10:11] + openmp/kmp_itt.c [13:14] + openmp/kmp_itt.h [11:12] + openmp/kmp_itt.inl [11:12] + openmp/kmp_lock.cpp [10:11] + openmp/kmp_lock.h [10:11] + openmp/kmp_omp.h [12:13] + openmp/kmp_os.h [10:11] + openmp/kmp_platform.h [9:10] + openmp/kmp_runtime.c [10:11] + openmp/kmp_safe_c_api.h [6:7] + openmp/kmp_sched.cpp [10:11] + openmp/kmp_settings.c [10:11] + openmp/kmp_settings.h [10:11] + openmp/kmp_stats.cpp [10:11] + openmp/kmp_stats.h [13:14] + openmp/kmp_stats_timing.cpp [10:11] + openmp/kmp_stats_timing.h [13:14] + openmp/kmp_str.c [10:11] + openmp/kmp_str.h [10:11] + openmp/kmp_stub.c [10:11] + openmp/kmp_stub.h [10:11] + openmp/kmp_taskdeps.cpp [10:11] + openmp/kmp_tasking.c [10:11] + openmp/kmp_taskq.c [10:11] + openmp/kmp_threadprivate.c [10:11] + openmp/kmp_utility.c [10:11] + openmp/kmp_version.c [10:11] + openmp/kmp_version.h [10:11] + openmp/kmp_wait_release.cpp [10:11] + openmp/kmp_wait_release.h [10:11] + openmp/kmp_wrapper_getpid.h [10:11] + openmp/kmp_wrapper_malloc.h [11:12] + openmp/omp.h [10:11] + openmp/test-touch.c [8:9] + openmp/thirdparty/ittnotify/disable_warnings.h [6:7] + openmp/thirdparty/ittnotify/ittnotify.h [6:7] + openmp/thirdparty/ittnotify/ittnotify_config.h [6:7] + openmp/thirdparty/ittnotify/ittnotify_static.c [6:7] + openmp/thirdparty/ittnotify/ittnotify_types.h [6:7] + openmp/thirdparty/ittnotify/legacy/ittnotify.h [6:7] + openmp/z_Linux_util.c [10:11] + openmp/z_Windows_NT-586_util.c [10:11] + openmp/z_Windows_NT_util.c [10:11] + Scancode info: + Original SPDX id: MIT + Score : 100.00 + Match type : NOTICE + Links : http://opensource.org/licenses/mit-license.php, https://spdx.org/licenses/MIT + Files with this license: + openmp/extractExternal.cpp [10:11] + openmp/include/30/omp.h.var [10:11] + openmp/include/40/omp.h.var [10:11] + openmp/include/41/omp.h.var [10:11] + openmp/kmp.h [11:12] + openmp/kmp_affinity.cpp [10:11] + openmp/kmp_affinity.h [10:11] + openmp/kmp_alloc.c [10:11] + openmp/kmp_atomic.c [10:11] + openmp/kmp_atomic.h [10:11] + openmp/kmp_barrier.cpp [10:11] + openmp/kmp_cancel.cpp [6:7] + openmp/kmp_config.h [8:9] + openmp/kmp_csupport.c [10:11] + openmp/kmp_debug.c [10:11] + openmp/kmp_debug.h [10:11] + openmp/kmp_debugger.c [11:12] + openmp/kmp_debugger.h [11:12] + openmp/kmp_dispatch.cpp [10:11] + openmp/kmp_environment.c [10:11] + openmp/kmp_environment.h [10:11] + openmp/kmp_error.c [10:11] + openmp/kmp_error.h [10:11] + openmp/kmp_ftn_cdecl.c [10:11] + openmp/kmp_ftn_entry.h [10:11] + openmp/kmp_ftn_extra.c [10:11] + openmp/kmp_ftn_os.h [10:11] + openmp/kmp_ftn_stdcall.c [10:11] + openmp/kmp_global.c [10:11] + openmp/kmp_gsupport.c [10:11] + openmp/kmp_i18n.c [10:11] + openmp/kmp_i18n.h [10:11] + openmp/kmp_import.c [10:11] + openmp/kmp_io.c [10:11] + openmp/kmp_io.h [10:11] + openmp/kmp_itt.c [13:14] + openmp/kmp_itt.h [11:12] + openmp/kmp_itt.inl [11:12] + openmp/kmp_lock.cpp [10:11] + openmp/kmp_lock.h [10:11] + openmp/kmp_omp.h [12:13] + openmp/kmp_os.h [10:11] + openmp/kmp_platform.h [9:10] + openmp/kmp_runtime.c [10:11] + openmp/kmp_safe_c_api.h [6:7] + openmp/kmp_sched.cpp [10:11] + openmp/kmp_settings.c [10:11] + openmp/kmp_settings.h [10:11] + openmp/kmp_stats.cpp [10:11] + openmp/kmp_stats.h [13:14] + openmp/kmp_stats_timing.cpp [10:11] + openmp/kmp_stats_timing.h [13:14] + openmp/kmp_str.c [10:11] + openmp/kmp_str.h [10:11] + openmp/kmp_stub.c [10:11] + openmp/kmp_stub.h [10:11] + openmp/kmp_taskdeps.cpp [10:11] + openmp/kmp_tasking.c [10:11] + openmp/kmp_taskq.c [10:11] + openmp/kmp_threadprivate.c [10:11] + openmp/kmp_utility.c [10:11] + openmp/kmp_version.c [10:11] + openmp/kmp_version.h [10:11] + openmp/kmp_wait_release.cpp [10:11] + openmp/kmp_wait_release.h [10:11] + openmp/kmp_wrapper_getpid.h [10:11] + openmp/kmp_wrapper_malloc.h [11:12] + openmp/omp.h [10:11] + openmp/test-touch.c [8:9] + openmp/thirdparty/ittnotify/disable_warnings.h [6:7] + openmp/thirdparty/ittnotify/ittnotify.h [6:7] + openmp/thirdparty/ittnotify/ittnotify_config.h [6:7] + openmp/thirdparty/ittnotify/ittnotify_static.c [6:7] + openmp/thirdparty/ittnotify/ittnotify_types.h [6:7] + openmp/thirdparty/ittnotify/legacy/ittnotify.h [6:7] + openmp/z_Linux_util.c [10:11] + openmp/z_Windows_NT-586_util.c [10:11] + openmp/z_Windows_NT_util.c [10:11] + +KEEP NCSA AND MIT 1f7e00acb6cda5de868d4d4c1ffe3c2b +BELONGS libcxx/ya.make + Note: matched license text is too long. Read it in the source files. + Scancode info: + Original SPDX id: NCSA + Score : 100.00 + Match type : NOTICE + Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA + Files with this license: + libcxx/LICENSE.TXT [240:245] + Scancode info: + Original SPDX id: MIT + Score : 100.00 + Match type : NOTICE + Links : http://opensource.org/licenses/mit-license.php, https://spdx.org/licenses/MIT + Files with this license: + libcxx/LICENSE.TXT [240:245] + +KEEP NCSA AND MIT 479de2cae020eacfac58212c03d33ab1 +BELONGS openmp/ya.make +FILE_INCLUDE builtins/LICENSE.txt found in files: openmp/thirdparty/ittnotify/ittnotify_static.h at line 7 + License text: + // This file is dual licensed under the MIT and the University of Illinois Open + // Source Licenses. See LICENSE.txt for details. + Scancode info: + Original SPDX id: NCSA + Score : 100.00 + Match type : NOTICE + Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA + Files with this license: + openmp/thirdparty/ittnotify/ittnotify_static.h [6:7] + Scancode info: + Original SPDX id: MIT + Score : 100.00 + Match type : NOTICE + Links : http://opensource.org/licenses/mit-license.php, https://spdx.org/licenses/MIT + Files with this license: + openmp/thirdparty/ittnotify/ittnotify_static.h [6:7] + +KEEP NCSA 5a35b4c0d3b3923cac31a5a371332ca2 +BELONGS libcxx/ya.make + License text: + Legacy LLVM License (https://llvm.org/docs/DeveloperPolicy.html#legacy): + Scancode info: + Original SPDX id: NCSA + Score : 100.00 + Match type : REFERENCE + Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA + Files with this license: + libcxx/LICENSE.TXT [237:237] + +KEEP BSD-2-Clause 5a4c43ebab4641c8f908bfd9c8d25cec +BELONGS libcxxrt/ya.make +FILE_IGNORE libcxx/include/experimental/list found in files: libcxxrt/exception.cc at line 11, libcxxrt/exception.cc at line 8 +FILE_IGNORE libcxx/include/list found in files: libcxxrt/exception.cc at line 11, libcxxrt/exception.cc at line 8 +FILE_INCLUDE libcxxrt/COPYRIGHT found in files: libcxxrt/exception.cc at line 14, libcxxrt/exception.cc at line 17 + # list - just word, not file reference + Note: matched license text is too long. Read it in the source files. + Scancode info: + Original SPDX id: BSD-2-Clause + Score : 100.00 + Match type : TEXT + Links : http://opensource.org/licenses/bsd-license.php, http://www.opensource.org/licenses/BSD-2-Clause, https://spdx.org/licenses/BSD-2-Clause + Files with this license: + libcxxrt/exception.cc [4:24] + +KEEP MIT 5debb370f50e1dfd24ff5144233a2ef6 +BELONGS libcxx/ya.make +FILE_IGNORE libcxx/include/any found in files: libcxx/LICENSE.TXT at line 295 +FILE_INCLUDE libcxxrt/AUTHORS found in files: libcxx/LICENSE.TXT at line 308 +FILE_INCLUDE libcxxrt/COPYRIGHT found in files: libcxx/LICENSE.TXT at line 308 + # any - just word, not file reference + Note: matched license text is too long. Read it in the source files. + Scancode info: + Original SPDX id: MIT + Score : 100.00 + Match type : TEXT + Links : http://opensource.org/licenses/mit-license.php, https://spdx.org/licenses/MIT + Files with this license: + libcxx/LICENSE.TXT [295:311] + +KEEP NCSA AND MIT 61ab203794bd26e0aab2c6b954e30d9a +BELONGS openmp/ya.make +FILE_INCLUDE builtins/LICENSE.txt found in files: openmp/libomp.rc.var at line 9, openmp/z_Linux_asm.s at line 10 + License text: + //// This file is dual licensed under the MIT and the University of Illinois Open + //// Source Licenses. See LICENSE.txt for details. + Scancode info: + Original SPDX id: NCSA + Score : 100.00 + Match type : NOTICE + Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA + Files with this license: + openmp/libomp.rc.var [8:9] + openmp/z_Linux_asm.s [9:10] + Scancode info: + Original SPDX id: MIT + Score : 100.00 + Match type : NOTICE + Links : http://opensource.org/licenses/mit-license.php, https://spdx.org/licenses/MIT + Files with this license: + openmp/libomp.rc.var [8:9] + openmp/z_Linux_asm.s [9:10] + +KEEP Apache-2.0 WITH LLVM-exception 705a75a25bce12b12334e8fc577d8a46 +BELONGS libcxx/ya.make + License text: + * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. + * See https://llvm.org/LICENSE.txt for license information. + Scancode info: + Original SPDX id: Apache-2.0 + Score : 100.00 + Match type : NOTICE + Links : http://www.apache.org/licenses/, http://www.apache.org/licenses/LICENSE-2.0, https://spdx.org/licenses/Apache-2.0 + Files with this license: + libcxx/src/filesystem/int128_builtins.cpp [3:4] + Scancode info: + Original SPDX id: LLVM-exception + Score : 100.00 + Match type : NOTICE + Links : http://llvm.org/foundation/relicensing/LICENSE.txt, https://spdx.org/licenses/LLVM-exception + Files with this license: + libcxx/src/filesystem/int128_builtins.cpp [3:4] + +KEEP Apache-2.0 WITH LLVM-exception 755ab7da3ff8c5d6ae90bdbebd177e49 +BELONGS libcxx/ya.make + License text: + // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. + // See https://llvm.org/LICENSE.txt for license information. + Scancode info: + Original SPDX id: Apache-2.0 + Score : 100.00 + Match type : NOTICE + Links : http://www.apache.org/licenses/, http://www.apache.org/licenses/LICENSE-2.0, https://spdx.org/licenses/Apache-2.0 + Files with this license: + libcxx/include/__availability [4:5] + libcxx/include/__bit_reference [4:5] + libcxx/include/__bsd_locale_defaults.h [4:5] + libcxx/include/__bsd_locale_fallbacks.h [4:5] + libcxx/include/__config [4:5] + libcxx/include/__config_site.in [3:4] + libcxx/include/__debug [4:5] + libcxx/include/__errc [4:5] + libcxx/include/__functional_03 [4:5] + libcxx/include/__functional_base [4:5] + libcxx/include/__functional_base_03 [4:5] + libcxx/include/__hash_table [4:5] + libcxx/include/__locale [4:5] + libcxx/include/__memory/allocator_traits.h [4:5] + libcxx/include/__memory/base.h [4:5] + libcxx/include/__memory/pointer_traits.h [4:5] + libcxx/include/__memory/utilities.h [4:5] + libcxx/include/__mutex_base [4:5] + libcxx/include/__node_handle [4:5] + libcxx/include/__nullptr [4:5] + libcxx/include/__sso_allocator [4:5] + libcxx/include/__std_stream [4:5] + libcxx/include/__string [4:5] + libcxx/include/__threading_support [4:5] + libcxx/include/__tree [4:5] + libcxx/include/__tuple [4:5] + libcxx/include/__undef_macros [4:5] + libcxx/include/algorithm [4:5] + libcxx/include/any [4:5] + libcxx/include/array [4:5] + libcxx/include/atomic [4:5] + libcxx/include/barrier [4:5] + libcxx/include/bit [4:5] + libcxx/include/bitset [4:5] + libcxx/include/cassert [4:5] + libcxx/include/ccomplex [4:5] + libcxx/include/cctype [4:5] + libcxx/include/cerrno [4:5] + libcxx/include/cfenv [4:5] + libcxx/include/cfloat [4:5] + libcxx/include/charconv [4:5] + libcxx/include/chrono [4:5] + libcxx/include/cinttypes [4:5] + libcxx/include/ciso646 [4:5] + libcxx/include/climits [4:5] + libcxx/include/clocale [4:5] + libcxx/include/cmath [4:5] + libcxx/include/codecvt [4:5] + libcxx/include/compare [4:5] + libcxx/include/complex [4:5] + libcxx/include/complex.h [4:5] + libcxx/include/concepts [4:5] + libcxx/include/condition_variable [4:5] + libcxx/include/csetjmp [4:5] + libcxx/include/csignal [4:5] + libcxx/include/cstdarg [4:5] + libcxx/include/cstdbool [4:5] + libcxx/include/cstddef [4:5] + libcxx/include/cstdint [4:5] + libcxx/include/cstdio [4:5] + libcxx/include/cstdlib [4:5] + libcxx/include/cstring [4:5] + libcxx/include/ctgmath [4:5] + libcxx/include/ctime [4:5] + libcxx/include/ctype.h [4:5] + libcxx/include/cwchar [4:5] + libcxx/include/cwctype [4:5] + libcxx/include/deque [4:5] + libcxx/include/errno.h [4:5] + libcxx/include/exception [4:5] + libcxx/include/execution [4:5] + libcxx/include/experimental/__memory [4:5] + libcxx/include/experimental/algorithm [4:5] + libcxx/include/experimental/coroutine [4:5] + libcxx/include/experimental/deque [4:5] + libcxx/include/experimental/filesystem [4:5] + libcxx/include/experimental/forward_list [4:5] + libcxx/include/experimental/functional [4:5] + libcxx/include/experimental/iterator [4:5] + libcxx/include/experimental/list [4:5] + libcxx/include/experimental/map [4:5] + libcxx/include/experimental/memory_resource [4:5] + libcxx/include/experimental/propagate_const [4:5] + libcxx/include/experimental/regex [4:5] + libcxx/include/experimental/set [4:5] + libcxx/include/experimental/simd [4:5] + libcxx/include/experimental/string [4:5] + libcxx/include/experimental/type_traits [4:5] + libcxx/include/experimental/unordered_map [4:5] + libcxx/include/experimental/unordered_set [4:5] + libcxx/include/experimental/utility [4:5] + libcxx/include/experimental/vector [4:5] + libcxx/include/ext/__hash [4:5] + libcxx/include/ext/hash_map [4:5] + libcxx/include/ext/hash_set [4:5] + libcxx/include/filesystem [4:5] + libcxx/include/float.h [4:5] + libcxx/include/forward_list [4:5] + libcxx/include/fstream [4:5] + libcxx/include/functional [4:5] + libcxx/include/future [4:5] + libcxx/include/initializer_list [4:5] + libcxx/include/inttypes.h [4:5] + libcxx/include/iomanip [4:5] + libcxx/include/ios [4:5] + libcxx/include/iosfwd [4:5] + libcxx/include/iostream [4:5] + libcxx/include/istream [4:5] + libcxx/include/iterator [4:5] + libcxx/include/latch [4:5] + libcxx/include/limits [4:5] + libcxx/include/limits.h [4:5] + libcxx/include/list [4:5] + libcxx/include/locale [4:5] + libcxx/include/locale.h [4:5] + libcxx/include/map [4:5] + libcxx/include/math.h [4:5] + libcxx/include/memory [4:5] + libcxx/include/mutex [4:5] + libcxx/include/new [4:5] + libcxx/include/numbers [4:5] + libcxx/include/numeric [4:5] + libcxx/include/optional [4:5] + libcxx/include/ostream [4:5] + libcxx/include/queue [4:5] + libcxx/include/random [4:5] + libcxx/include/ratio [4:5] + libcxx/include/regex [4:5] + libcxx/include/scoped_allocator [4:5] + libcxx/include/semaphore [4:5] + libcxx/include/set [4:5] + libcxx/include/setjmp.h [4:5] + libcxx/include/shared_mutex [4:5] + libcxx/include/span [4:5] + libcxx/include/sstream [4:5] + libcxx/include/stack [4:5] + libcxx/include/stdbool.h [4:5] + libcxx/include/stddef.h [4:5] + libcxx/include/stdexcept [4:5] + libcxx/include/stdint.h [4:5] + libcxx/include/stdio.h [4:5] + libcxx/include/stdlib.h [4:5] + libcxx/include/streambuf [4:5] + libcxx/include/string [4:5] + libcxx/include/string.h [4:5] + libcxx/include/string_view [4:5] + libcxx/include/strstream [4:5] + libcxx/include/support/android/locale_bionic.h [4:5] + libcxx/include/support/fuchsia/xlocale.h [4:5] + libcxx/include/support/ibm/limits.h [4:5] + libcxx/include/support/ibm/locale_mgmt_aix.h [4:5] + libcxx/include/support/ibm/nanosleep.h [4:5] + libcxx/include/support/ibm/support.h [4:5] + libcxx/include/support/ibm/xlocale.h [4:5] + libcxx/include/support/musl/xlocale.h [4:5] + libcxx/include/support/newlib/xlocale.h [3:4] + libcxx/include/support/nuttx/xlocale.h [4:5] + libcxx/include/support/solaris/floatingpoint.h [3:4] + libcxx/include/support/solaris/wchar.h [3:4] + libcxx/include/support/solaris/xlocale.h [3:4] + libcxx/include/support/win32/limits_msvc_win32.h [4:5] + libcxx/include/support/win32/locale_win32.h [4:5] + libcxx/include/support/xlocale/__nop_locale_mgmt.h [4:5] + libcxx/include/support/xlocale/__posix_l_fallback.h [4:5] + libcxx/include/support/xlocale/__strtonum_fallback.h [4:5] + libcxx/include/system_error [4:5] + libcxx/include/tgmath.h [4:5] + libcxx/include/thread [4:5] + libcxx/include/tuple [4:5] + libcxx/include/type_traits [4:5] + libcxx/include/typeindex [4:5] + libcxx/include/typeinfo [4:5] + libcxx/include/unordered_map [4:5] + libcxx/include/unordered_set [4:5] + libcxx/include/utility [4:5] + libcxx/include/valarray [4:5] + libcxx/include/variant [4:5] + libcxx/include/vector [4:5] + libcxx/include/version [4:5] + libcxx/include/wchar.h [4:5] + libcxx/include/wctype.h [4:5] + libcxx/src/algorithm.cpp [3:4] + libcxx/src/any.cpp [3:4] + libcxx/src/atomic.cpp [3:4] + libcxx/src/barrier.cpp [3:4] + libcxx/src/bind.cpp [3:4] + libcxx/src/charconv.cpp [3:4] + libcxx/src/chrono.cpp [3:4] + libcxx/src/condition_variable.cpp [3:4] + libcxx/src/condition_variable_destructor.cpp [3:4] + libcxx/src/debug.cpp [3:4] + libcxx/src/exception.cpp [3:4] + libcxx/src/experimental/memory_resource.cpp [3:4] + libcxx/src/filesystem/directory_iterator.cpp [3:4] + libcxx/src/filesystem/filesystem_common.h [3:4] + libcxx/src/filesystem/operations.cpp [3:4] + libcxx/src/functional.cpp [3:4] + libcxx/src/future.cpp [3:4] + libcxx/src/hash.cpp [3:4] + libcxx/src/include/apple_availability.h [3:4] + libcxx/src/include/atomic_support.h [3:4] + libcxx/src/include/config_elast.h [3:4] + libcxx/src/include/refstring.h [3:4] + libcxx/src/ios.cpp [3:4] + libcxx/src/ios.instantiations.cpp [3:4] + libcxx/src/iostream.cpp [3:4] + libcxx/src/locale.cpp [3:4] + libcxx/src/memory.cpp [3:4] + libcxx/src/mutex.cpp [3:4] + libcxx/src/mutex_destructor.cpp [3:4] + libcxx/src/new.cpp [3:4] + libcxx/src/optional.cpp [3:4] + libcxx/src/random.cpp [3:4] + libcxx/src/random_shuffle.cpp [3:4] + libcxx/src/regex.cpp [3:4] + libcxx/src/shared_mutex.cpp [3:4] + libcxx/src/stdexcept.cpp [3:4] + libcxx/src/string.cpp [3:4] + libcxx/src/strstream.cpp [3:4] + libcxx/src/support/runtime/exception_fallback.ipp [4:5] + libcxx/src/support/runtime/exception_glibcxx.ipp [4:5] + libcxx/src/support/runtime/exception_libcxxabi.ipp [4:5] + libcxx/src/support/runtime/exception_libcxxrt.ipp [4:5] + libcxx/src/support/runtime/exception_msvc.ipp [4:5] + libcxx/src/support/runtime/exception_pointer_cxxabi.ipp [4:5] + libcxx/src/support/runtime/exception_pointer_glibcxx.ipp [4:5] + libcxx/src/support/runtime/exception_pointer_msvc.ipp [4:5] + libcxx/src/support/runtime/exception_pointer_unimplemented.ipp [4:5] + libcxx/src/support/runtime/new_handler_fallback.ipp [4:5] + libcxx/src/support/runtime/stdexcept_default.ipp [3:4] + libcxx/src/support/runtime/stdexcept_vcruntime.ipp [3:4] + libcxx/src/support/solaris/xlocale.cpp [3:4] + libcxx/src/support/win32/locale_win32.cpp [4:5] + libcxx/src/support/win32/support.cpp [4:5] + libcxx/src/support/win32/thread_win32.cpp [4:5] + libcxx/src/system_error.cpp [3:4] + libcxx/src/thread.cpp [3:4] + libcxx/src/typeinfo.cpp [3:4] + libcxx/src/utility.cpp [3:4] + libcxx/src/valarray.cpp [3:4] + libcxx/src/variant.cpp [3:4] + libcxx/src/vector.cpp [3:4] + Scancode info: + Original SPDX id: LLVM-exception + Score : 100.00 + Match type : NOTICE + Links : http://llvm.org/foundation/relicensing/LICENSE.txt, https://spdx.org/licenses/LLVM-exception + Files with this license: + libcxx/include/__availability [4:5] + libcxx/include/__bit_reference [4:5] + libcxx/include/__bsd_locale_defaults.h [4:5] + libcxx/include/__bsd_locale_fallbacks.h [4:5] + libcxx/include/__config [4:5] + libcxx/include/__config_site.in [3:4] + libcxx/include/__debug [4:5] + libcxx/include/__errc [4:5] + libcxx/include/__functional_03 [4:5] + libcxx/include/__functional_base [4:5] + libcxx/include/__functional_base_03 [4:5] + libcxx/include/__hash_table [4:5] + libcxx/include/__locale [4:5] + libcxx/include/__memory/allocator_traits.h [4:5] + libcxx/include/__memory/base.h [4:5] + libcxx/include/__memory/pointer_traits.h [4:5] + libcxx/include/__memory/utilities.h [4:5] + libcxx/include/__mutex_base [4:5] + libcxx/include/__node_handle [4:5] + libcxx/include/__nullptr [4:5] + libcxx/include/__sso_allocator [4:5] + libcxx/include/__std_stream [4:5] + libcxx/include/__string [4:5] + libcxx/include/__threading_support [4:5] + libcxx/include/__tree [4:5] + libcxx/include/__tuple [4:5] + libcxx/include/__undef_macros [4:5] + libcxx/include/algorithm [4:5] + libcxx/include/any [4:5] + libcxx/include/array [4:5] + libcxx/include/atomic [4:5] + libcxx/include/barrier [4:5] + libcxx/include/bit [4:5] + libcxx/include/bitset [4:5] + libcxx/include/cassert [4:5] + libcxx/include/ccomplex [4:5] + libcxx/include/cctype [4:5] + libcxx/include/cerrno [4:5] + libcxx/include/cfenv [4:5] + libcxx/include/cfloat [4:5] + libcxx/include/charconv [4:5] + libcxx/include/chrono [4:5] + libcxx/include/cinttypes [4:5] + libcxx/include/ciso646 [4:5] + libcxx/include/climits [4:5] + libcxx/include/clocale [4:5] + libcxx/include/cmath [4:5] + libcxx/include/codecvt [4:5] + libcxx/include/compare [4:5] + libcxx/include/complex [4:5] + libcxx/include/complex.h [4:5] + libcxx/include/concepts [4:5] + libcxx/include/condition_variable [4:5] + libcxx/include/csetjmp [4:5] + libcxx/include/csignal [4:5] + libcxx/include/cstdarg [4:5] + libcxx/include/cstdbool [4:5] + libcxx/include/cstddef [4:5] + libcxx/include/cstdint [4:5] + libcxx/include/cstdio [4:5] + libcxx/include/cstdlib [4:5] + libcxx/include/cstring [4:5] + libcxx/include/ctgmath [4:5] + libcxx/include/ctime [4:5] + libcxx/include/ctype.h [4:5] + libcxx/include/cwchar [4:5] + libcxx/include/cwctype [4:5] + libcxx/include/deque [4:5] + libcxx/include/errno.h [4:5] + libcxx/include/exception [4:5] + libcxx/include/execution [4:5] + libcxx/include/experimental/__memory [4:5] + libcxx/include/experimental/algorithm [4:5] + libcxx/include/experimental/coroutine [4:5] + libcxx/include/experimental/deque [4:5] + libcxx/include/experimental/filesystem [4:5] + libcxx/include/experimental/forward_list [4:5] + libcxx/include/experimental/functional [4:5] + libcxx/include/experimental/iterator [4:5] + libcxx/include/experimental/list [4:5] + libcxx/include/experimental/map [4:5] + libcxx/include/experimental/memory_resource [4:5] + libcxx/include/experimental/propagate_const [4:5] + libcxx/include/experimental/regex [4:5] + libcxx/include/experimental/set [4:5] + libcxx/include/experimental/simd [4:5] + libcxx/include/experimental/string [4:5] + libcxx/include/experimental/type_traits [4:5] + libcxx/include/experimental/unordered_map [4:5] + libcxx/include/experimental/unordered_set [4:5] + libcxx/include/experimental/utility [4:5] + libcxx/include/experimental/vector [4:5] + libcxx/include/ext/__hash [4:5] + libcxx/include/ext/hash_map [4:5] + libcxx/include/ext/hash_set [4:5] + libcxx/include/filesystem [4:5] + libcxx/include/float.h [4:5] + libcxx/include/forward_list [4:5] + libcxx/include/fstream [4:5] + libcxx/include/functional [4:5] + libcxx/include/future [4:5] + libcxx/include/initializer_list [4:5] + libcxx/include/inttypes.h [4:5] + libcxx/include/iomanip [4:5] + libcxx/include/ios [4:5] + libcxx/include/iosfwd [4:5] + libcxx/include/iostream [4:5] + libcxx/include/istream [4:5] + libcxx/include/iterator [4:5] + libcxx/include/latch [4:5] + libcxx/include/limits [4:5] + libcxx/include/limits.h [4:5] + libcxx/include/list [4:5] + libcxx/include/locale [4:5] + libcxx/include/locale.h [4:5] + libcxx/include/map [4:5] + libcxx/include/math.h [4:5] + libcxx/include/memory [4:5] + libcxx/include/mutex [4:5] + libcxx/include/new [4:5] + libcxx/include/numbers [4:5] + libcxx/include/numeric [4:5] + libcxx/include/optional [4:5] + libcxx/include/ostream [4:5] + libcxx/include/queue [4:5] + libcxx/include/random [4:5] + libcxx/include/ratio [4:5] + libcxx/include/regex [4:5] + libcxx/include/scoped_allocator [4:5] + libcxx/include/semaphore [4:5] + libcxx/include/set [4:5] + libcxx/include/setjmp.h [4:5] + libcxx/include/shared_mutex [4:5] + libcxx/include/span [4:5] + libcxx/include/sstream [4:5] + libcxx/include/stack [4:5] + libcxx/include/stdbool.h [4:5] + libcxx/include/stddef.h [4:5] + libcxx/include/stdexcept [4:5] + libcxx/include/stdint.h [4:5] + libcxx/include/stdio.h [4:5] + libcxx/include/stdlib.h [4:5] + libcxx/include/streambuf [4:5] + libcxx/include/string [4:5] + libcxx/include/string.h [4:5] + libcxx/include/string_view [4:5] + libcxx/include/strstream [4:5] + libcxx/include/support/android/locale_bionic.h [4:5] + libcxx/include/support/fuchsia/xlocale.h [4:5] + libcxx/include/support/ibm/limits.h [4:5] + libcxx/include/support/ibm/locale_mgmt_aix.h [4:5] + libcxx/include/support/ibm/nanosleep.h [4:5] + libcxx/include/support/ibm/support.h [4:5] + libcxx/include/support/ibm/xlocale.h [4:5] + libcxx/include/support/musl/xlocale.h [4:5] + libcxx/include/support/newlib/xlocale.h [3:4] + libcxx/include/support/nuttx/xlocale.h [4:5] + libcxx/include/support/solaris/floatingpoint.h [3:4] + libcxx/include/support/solaris/wchar.h [3:4] + libcxx/include/support/solaris/xlocale.h [3:4] + libcxx/include/support/win32/limits_msvc_win32.h [4:5] + libcxx/include/support/win32/locale_win32.h [4:5] + libcxx/include/support/xlocale/__nop_locale_mgmt.h [4:5] + libcxx/include/support/xlocale/__posix_l_fallback.h [4:5] + libcxx/include/support/xlocale/__strtonum_fallback.h [4:5] + libcxx/include/system_error [4:5] + libcxx/include/tgmath.h [4:5] + libcxx/include/thread [4:5] + libcxx/include/tuple [4:5] + libcxx/include/type_traits [4:5] + libcxx/include/typeindex [4:5] + libcxx/include/typeinfo [4:5] + libcxx/include/unordered_map [4:5] + libcxx/include/unordered_set [4:5] + libcxx/include/utility [4:5] + libcxx/include/valarray [4:5] + libcxx/include/variant [4:5] + libcxx/include/vector [4:5] + libcxx/include/version [4:5] + libcxx/include/wchar.h [4:5] + libcxx/include/wctype.h [4:5] + libcxx/src/algorithm.cpp [3:4] + libcxx/src/any.cpp [3:4] + libcxx/src/atomic.cpp [3:4] + libcxx/src/barrier.cpp [3:4] + libcxx/src/bind.cpp [3:4] + libcxx/src/charconv.cpp [3:4] + libcxx/src/chrono.cpp [3:4] + libcxx/src/condition_variable.cpp [3:4] + libcxx/src/condition_variable_destructor.cpp [3:4] + libcxx/src/debug.cpp [3:4] + libcxx/src/exception.cpp [3:4] + libcxx/src/experimental/memory_resource.cpp [3:4] + libcxx/src/filesystem/directory_iterator.cpp [3:4] + libcxx/src/filesystem/filesystem_common.h [3:4] + libcxx/src/filesystem/operations.cpp [3:4] + libcxx/src/functional.cpp [3:4] + libcxx/src/future.cpp [3:4] + libcxx/src/hash.cpp [3:4] + libcxx/src/include/apple_availability.h [3:4] + libcxx/src/include/atomic_support.h [3:4] + libcxx/src/include/config_elast.h [3:4] + libcxx/src/include/refstring.h [3:4] + libcxx/src/ios.cpp [3:4] + libcxx/src/ios.instantiations.cpp [3:4] + libcxx/src/iostream.cpp [3:4] + libcxx/src/locale.cpp [3:4] + libcxx/src/memory.cpp [3:4] + libcxx/src/mutex.cpp [3:4] + libcxx/src/mutex_destructor.cpp [3:4] + libcxx/src/new.cpp [3:4] + libcxx/src/optional.cpp [3:4] + libcxx/src/random.cpp [3:4] + libcxx/src/random_shuffle.cpp [3:4] + libcxx/src/regex.cpp [3:4] + libcxx/src/shared_mutex.cpp [3:4] + libcxx/src/stdexcept.cpp [3:4] + libcxx/src/string.cpp [3:4] + libcxx/src/strstream.cpp [3:4] + libcxx/src/support/runtime/exception_fallback.ipp [4:5] + libcxx/src/support/runtime/exception_glibcxx.ipp [4:5] + libcxx/src/support/runtime/exception_libcxxabi.ipp [4:5] + libcxx/src/support/runtime/exception_libcxxrt.ipp [4:5] + libcxx/src/support/runtime/exception_msvc.ipp [4:5] + libcxx/src/support/runtime/exception_pointer_cxxabi.ipp [4:5] + libcxx/src/support/runtime/exception_pointer_glibcxx.ipp [4:5] + libcxx/src/support/runtime/exception_pointer_msvc.ipp [4:5] + libcxx/src/support/runtime/exception_pointer_unimplemented.ipp [4:5] + libcxx/src/support/runtime/new_handler_fallback.ipp [4:5] + libcxx/src/support/runtime/stdexcept_default.ipp [3:4] + libcxx/src/support/runtime/stdexcept_vcruntime.ipp [3:4] + libcxx/src/support/solaris/xlocale.cpp [3:4] + libcxx/src/support/win32/locale_win32.cpp [4:5] + libcxx/src/support/win32/support.cpp [4:5] + libcxx/src/support/win32/thread_win32.cpp [4:5] + libcxx/src/system_error.cpp [3:4] + libcxx/src/thread.cpp [3:4] + libcxx/src/typeinfo.cpp [3:4] + libcxx/src/utility.cpp [3:4] + libcxx/src/valarray.cpp [3:4] + libcxx/src/variant.cpp [3:4] + libcxx/src/vector.cpp [3:4] + +KEEP Apache-2.0 WITH LLVM-exception 8494a9caed330d9a4f40e19cce7dc770 +BELONGS libcxx/ya.make +FILE_INCLUDE libcxx/include/exception found in files: libcxx/LICENSE.TXT at line 210 + Note: matched license text is too long. Read it in the source files. + Scancode info: + Original SPDX id: LLVM-exception + Score : 100.00 + Match type : TEXT + Links : http://llvm.org/foundation/relicensing/LICENSE.txt, https://spdx.org/licenses/LLVM-exception + Files with this license: + libcxx/LICENSE.TXT [208:222] + +KEEP Apache-2.0 WITH LLVM-exception 86617d55e1d949711c543404d91f4cea +BELONGS libcxx/ya.make + License text: + // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + Scancode info: + Original SPDX id: Apache-2.0 + Score : 100.00 + Match type : TAG + Links : http://www.apache.org/licenses/, http://www.apache.org/licenses/LICENSE-2.0, https://spdx.org/licenses/Apache-2.0 + Files with this license: + libcxx/include/experimental/__config [6:6] + Scancode info: + Original SPDX id: LLVM-exception + Score : 100.00 + Match type : TAG + Links : http://llvm.org/foundation/relicensing/LICENSE.txt, https://spdx.org/licenses/LLVM-exception + Files with this license: + libcxx/include/experimental/__config [6:6] + +KEEP BSD-3-Clause 88f80886d9ea21e0b7205bd3730230e4 +BELONGS libcxxrt/ya.make + License text: + The BSD License + Scancode info: + Original SPDX id: BSD-3-Clause + Score : 99.00 + Match type : REFERENCE + Links : http://www.opensource.org/licenses/BSD-3-Clause, https://spdx.org/licenses/BSD-3-Clause + Files with this license: + libcxxrt/LICENSE [1:1] + +KEEP BSD-2-Clause 8cedb6171c06f89f0e6eefd60e5f79d5 +BELONGS libcxxrt/ya.make +FILE_IGNORE libcxx/include/experimental/list found in files: libcxxrt/auxhelper.cc at line 11, libcxxrt/auxhelper.cc at line 8, libcxxrt/dwarf_eh.h at line 11, libcxxrt/dwarf_eh.h at line 8, libcxxrt/dynamic_cast.cc at line 11, libcxxrt/dynamic_cast.cc at line 8, libcxxrt/guard.cc at line 11, libcxxrt/guard.cc at line 8, libcxxrt/memory.cc at line 11, libcxxrt/memory.cc at line 8, libcxxrt/stdexcept.cc at line 11, libcxxrt/stdexcept.cc at line 8, libcxxrt/stdexcept.h at line 11, libcxxrt/stdexcept.h at line 8, libcxxrt/typeinfo.cc at line 11, libcxxrt/typeinfo.cc at line 8, libcxxrt/typeinfo.h at line 11, libcxxrt/typeinfo.h at line 8 +FILE_IGNORE libcxx/include/list found in files: libcxxrt/auxhelper.cc at line 11, libcxxrt/auxhelper.cc at line 8, libcxxrt/dwarf_eh.h at line 11, libcxxrt/dwarf_eh.h at line 8, libcxxrt/dynamic_cast.cc at line 11, libcxxrt/dynamic_cast.cc at line 8, libcxxrt/guard.cc at line 11, libcxxrt/guard.cc at line 8, libcxxrt/memory.cc at line 11, libcxxrt/memory.cc at line 8, libcxxrt/stdexcept.cc at line 11, libcxxrt/stdexcept.cc at line 8, libcxxrt/stdexcept.h at line 11, libcxxrt/stdexcept.h at line 8, libcxxrt/typeinfo.cc at line 11, libcxxrt/typeinfo.cc at line 8, libcxxrt/typeinfo.h at line 11, libcxxrt/typeinfo.h at line 8 +FILE_INCLUDE libcxxrt/COPYRIGHT found in files: libcxxrt/auxhelper.cc at line 14, libcxxrt/auxhelper.cc at line 17, libcxxrt/dwarf_eh.h at line 14, libcxxrt/dwarf_eh.h at line 17, libcxxrt/dynamic_cast.cc at line 14, libcxxrt/dynamic_cast.cc at line 17, libcxxrt/guard.cc at line 14, libcxxrt/guard.cc at line 17, libcxxrt/memory.cc at line 14, libcxxrt/memory.cc at line 17, libcxxrt/stdexcept.cc at line 14, libcxxrt/stdexcept.cc at line 17, libcxxrt/stdexcept.h at line 14, libcxxrt/stdexcept.h at line 17, libcxxrt/typeinfo.cc at line 14, libcxxrt/typeinfo.cc at line 17, libcxxrt/typeinfo.h at line 14, libcxxrt/typeinfo.h at line 17 + # list - just word, not file reference + Note: matched license text is too long. Read it in the source files. + Scancode info: + Original SPDX id: BSD-2-Clause + Score : 100.00 + Match type : TEXT + Links : http://opensource.org/licenses/bsd-license.php, http://www.opensource.org/licenses/BSD-2-Clause, https://spdx.org/licenses/BSD-2-Clause + Files with this license: + libcxxrt/auxhelper.cc [4:24] + libcxxrt/dwarf_eh.h [4:24] + libcxxrt/dynamic_cast.cc [4:24] + libcxxrt/guard.cc [4:24] + libcxxrt/memory.cc [4:24] + libcxxrt/stdexcept.cc [4:24] + libcxxrt/stdexcept.h [4:24] + libcxxrt/typeinfo.cc [4:24] + libcxxrt/typeinfo.h [4:24] + +KEEP MIT 8ee097b6bcb3429ad39c4dbd5cc0e35e +BELONGS libcxxrt/ya.make +FILE_IGNORE libcxx/include/any found in files: libcxxrt/cxxabi.h at line 4 +FILE_INCLUDE libcxxrt/AUTHORS found in files: libcxxrt/cxxabi.h at line 17 +FILE_INCLUDE libcxxrt/COPYRIGHT found in files: libcxxrt/cxxabi.h at line 17 + # any - just word, not file reference + Note: matched license text is too long. Read it in the source files. + Scancode info: + Original SPDX id: MIT + Score : 100.00 + Match type : TEXT + Links : http://opensource.org/licenses/mit-license.php, https://spdx.org/licenses/MIT + Files with this license: + libcxxrt/cxxabi.h [4:20] + +KEEP Apache-2.0 9ac77f65a898755c7eed97099caded94 +BELONGS libcxx/ya.make +FILE_INCLUDE libcxx/import found in files: libcxx/LICENSE.TXT at line 81 +FILE_IGNORE libcxx/include/any found in files: libcxx/LICENSE.TXT at line 101, libcxx/LICENSE.TXT at line 104, libcxx/LICENSE.TXT at line 107, libcxx/LICENSE.TXT at line 111, libcxx/LICENSE.TXT at line 114, libcxx/LICENSE.TXT at line 130, libcxx/LICENSE.TXT at line 135, libcxx/LICENSE.TXT at line 137, libcxx/LICENSE.TXT at line 139, libcxx/LICENSE.TXT at line 151, libcxx/LICENSE.TXT at line 154, libcxx/LICENSE.TXT at line 160, libcxx/LICENSE.TXT at line 161, libcxx/LICENSE.TXT at line 162, libcxx/LICENSE.TXT at line 165, libcxx/LICENSE.TXT at line 175, libcxx/LICENSE.TXT at line 176, libcxx/LICENSE.TXT at line 178, libcxx/LICENSE.TXT at line 34, libcxx/LICENSE.TXT at line 44, libcxx/LICENSE.TXT at line 52, libcxx/LICENSE.TXT at line 53, libcxx/LICENSE.TXT at line 58, libcxx/LICENSE.TXT at line 66, libcxx/LICENSE.TXT at line 86, libcxx/LICENSE.TXT at line 89, libcxx/LICENSE.TXT at line 94, libcxx/LICENSE.TXT at line 98 +FILE_IGNORE libcxx/include/version found in files: libcxx/LICENSE.TXT at line 53 + # any and version - just words, not file reference + Note: matched license text is too long. Read it in the source files. + Scancode info: + Original SPDX id: Apache-2.0 + Score : 100.00 + Match type : TEXT + Links : http://www.apache.org/licenses/, http://www.apache.org/licenses/LICENSE-2.0, https://spdx.org/licenses/Apache-2.0 + Files with this license: + libcxx/LICENSE.TXT [5:205] + +KEEP NCSA AND MIT 9d5ffd6253d2b406a8bc3bbf3cb4f38b +BELONGS openmp/ya.make +FILE_INCLUDE builtins/LICENSE.txt found in files: openmp/include/30/omp_lib.f.var at line 9, openmp/include/30/omp_lib.f90.var at line 9, openmp/include/30/omp_lib.h.var at line 9, openmp/include/40/omp_lib.f.var at line 9, openmp/include/40/omp_lib.f90.var at line 9, openmp/include/40/omp_lib.h.var at line 9, openmp/include/41/omp_lib.f.var at line 9, openmp/include/41/omp_lib.f90.var at line 9, openmp/include/41/omp_lib.h.var at line 9 + License text: + !// This file is dual licensed under the MIT and the University of Illinois Open + !// Source Licenses. See LICENSE.txt for details. + Scancode info: + Original SPDX id: NCSA + Score : 100.00 + Match type : NOTICE + Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA + Files with this license: + openmp/include/30/omp_lib.f.var [8:9] + openmp/include/30/omp_lib.f90.var [8:9] + openmp/include/30/omp_lib.h.var [8:9] + openmp/include/40/omp_lib.f.var [8:9] + openmp/include/40/omp_lib.f90.var [8:9] + openmp/include/40/omp_lib.h.var [8:9] + openmp/include/41/omp_lib.f.var [8:9] + openmp/include/41/omp_lib.f90.var [8:9] + openmp/include/41/omp_lib.h.var [8:9] + Scancode info: + Original SPDX id: MIT + Score : 100.00 + Match type : NOTICE + Links : http://opensource.org/licenses/mit-license.php, https://spdx.org/licenses/MIT + Files with this license: + openmp/include/30/omp_lib.f.var [8:9] + openmp/include/30/omp_lib.f90.var [8:9] + openmp/include/30/omp_lib.h.var [8:9] + openmp/include/40/omp_lib.f.var [8:9] + openmp/include/40/omp_lib.f90.var [8:9] + openmp/include/40/omp_lib.h.var [8:9] + openmp/include/41/omp_lib.f.var [8:9] + openmp/include/41/omp_lib.f90.var [8:9] + openmp/include/41/omp_lib.h.var [8:9] + +KEEP NCSA b160d8bd561da097b0edd40b062e1c84 +BELONGS libcxx/ya.make +FILE_IGNORE libcxx/include/any found in files: libcxx/LICENSE.TXT at line 264 +FILE_IGNORE libcxx/include/experimental/list found in files: libcxx/LICENSE.TXT at line 272, libcxx/LICENSE.TXT at line 275 +FILE_IGNORE libcxx/include/list found in files: libcxx/LICENSE.TXT at line 272, libcxx/LICENSE.TXT at line 275 +FILE_INCLUDE libcxxrt/COPYRIGHT found in files: libcxx/LICENSE.TXT at line 286 + # any and list - just words, not file reference + Note: matched license text is too long. Read it in the source files. + Scancode info: + Original SPDX id: NCSA + Score : 100.00 + Match type : TEXT + Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA + Files with this license: + libcxx/LICENSE.TXT [264:289] + +KEEP BSD-2-Clause AND MIT b1ce5ac90fd7360272c132242b0d10e9 +BELONGS libcxx/ya.make + License text: + 2-clause BSD license instead of the MIT/UUIC license that the rest of libc++ is + Scancode info: + Original SPDX id: BSD-2-Clause + Score : 100.00 + Match type : REFERENCE + Links : http://opensource.org/licenses/bsd-license.php, http://www.opensource.org/licenses/BSD-2-Clause, https://spdx.org/licenses/BSD-2-Clause + Files with this license: + libcxx/src/support/solaris/README [3:3] + Scancode info: + Original SPDX id: MIT + Score : 75.00 + Match type : REFERENCE + Links : http://opensource.org/licenses/mit-license.php, https://spdx.org/licenses/MIT + Files with this license: + libcxx/src/support/solaris/README [3:3] + +KEEP Apache-2.0 WITH LLVM-exception b4f32daeb289687c0be6afeacb7df231 +BELONGS libcxx/ya.make + License text: + // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. + // See https://llvm.org/LICENSE.txt for license information. + Scancode info: + Original SPDX id: Apache-2.0 + Score : 100.00 + Match type : NOTICE + Links : http://www.apache.org/licenses/, http://www.apache.org/licenses/LICENSE-2.0, https://spdx.org/licenses/Apache-2.0 + Files with this license: + libcxx/include/experimental/__config [4:5] + Scancode info: + Original SPDX id: LLVM-exception + Score : 100.00 + Match type : NOTICE + Links : http://llvm.org/foundation/relicensing/LICENSE.txt, https://spdx.org/licenses/LLVM-exception + Files with this license: + libcxx/include/experimental/__config [4:5] + +KEEP Apache-2.0 WITH LLVM-exception b7566a1930e050e1090162bf1d543650 +BELONGS libcxx/ya.make + License text: + // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + Scancode info: + Original SPDX id: Apache-2.0 + Score : 100.00 + Match type : TAG + Links : http://www.apache.org/licenses/, http://www.apache.org/licenses/LICENSE-2.0, https://spdx.org/licenses/Apache-2.0 + Files with this license: + libcxx/include/__availability [6:6] + libcxx/include/__bit_reference [6:6] + libcxx/include/__bsd_locale_defaults.h [6:6] + libcxx/include/__bsd_locale_fallbacks.h [6:6] + libcxx/include/__config [6:6] + libcxx/include/__config_site.in [5:5] + libcxx/include/__debug [6:6] + libcxx/include/__errc [6:6] + libcxx/include/__functional_03 [6:6] + libcxx/include/__functional_base [6:6] + libcxx/include/__functional_base_03 [6:6] + libcxx/include/__hash_table [6:6] + libcxx/include/__locale [6:6] + libcxx/include/__memory/allocator_traits.h [6:6] + libcxx/include/__memory/base.h [6:6] + libcxx/include/__memory/pointer_traits.h [6:6] + libcxx/include/__memory/utilities.h [6:6] + libcxx/include/__mutex_base [6:6] + libcxx/include/__node_handle [6:6] + libcxx/include/__nullptr [6:6] + libcxx/include/__sso_allocator [6:6] + libcxx/include/__std_stream [6:6] + libcxx/include/__string [6:6] + libcxx/include/__threading_support [6:6] + libcxx/include/__tree [6:6] + libcxx/include/__tuple [6:6] + libcxx/include/__undef_macros [6:6] + libcxx/include/algorithm [6:6] + libcxx/include/any [6:6] + libcxx/include/array [6:6] + libcxx/include/atomic [6:6] + libcxx/include/barrier [6:6] + libcxx/include/bit [6:6] + libcxx/include/bitset [6:6] + libcxx/include/cassert [6:6] + libcxx/include/ccomplex [6:6] + libcxx/include/cctype [6:6] + libcxx/include/cerrno [6:6] + libcxx/include/cfenv [6:6] + libcxx/include/cfloat [6:6] + libcxx/include/charconv [6:6] + libcxx/include/chrono [6:6] + libcxx/include/cinttypes [6:6] + libcxx/include/ciso646 [6:6] + libcxx/include/climits [6:6] + libcxx/include/clocale [6:6] + libcxx/include/cmath [6:6] + libcxx/include/codecvt [6:6] + libcxx/include/compare [6:6] + libcxx/include/complex [6:6] + libcxx/include/complex.h [6:6] + libcxx/include/concepts [6:6] + libcxx/include/condition_variable [6:6] + libcxx/include/csetjmp [6:6] + libcxx/include/csignal [6:6] + libcxx/include/cstdarg [6:6] + libcxx/include/cstdbool [6:6] + libcxx/include/cstddef [6:6] + libcxx/include/cstdint [6:6] + libcxx/include/cstdio [6:6] + libcxx/include/cstdlib [6:6] + libcxx/include/cstring [6:6] + libcxx/include/ctgmath [6:6] + libcxx/include/ctime [6:6] + libcxx/include/ctype.h [6:6] + libcxx/include/cwchar [6:6] + libcxx/include/cwctype [6:6] + libcxx/include/deque [6:6] + libcxx/include/errno.h [6:6] + libcxx/include/exception [6:6] + libcxx/include/execution [6:6] + libcxx/include/experimental/__memory [6:6] + libcxx/include/experimental/algorithm [6:6] + libcxx/include/experimental/coroutine [6:6] + libcxx/include/experimental/deque [6:6] + libcxx/include/experimental/filesystem [6:6] + libcxx/include/experimental/forward_list [6:6] + libcxx/include/experimental/functional [6:6] + libcxx/include/experimental/iterator [6:6] + libcxx/include/experimental/list [6:6] + libcxx/include/experimental/map [6:6] + libcxx/include/experimental/memory_resource [6:6] + libcxx/include/experimental/propagate_const [6:6] + libcxx/include/experimental/regex [6:6] + libcxx/include/experimental/set [6:6] + libcxx/include/experimental/simd [6:6] + libcxx/include/experimental/string [6:6] + libcxx/include/experimental/type_traits [6:6] + libcxx/include/experimental/unordered_map [6:6] + libcxx/include/experimental/unordered_set [6:6] + libcxx/include/experimental/utility [6:6] + libcxx/include/experimental/vector [6:6] + libcxx/include/ext/__hash [6:6] + libcxx/include/ext/hash_map [6:6] + libcxx/include/ext/hash_set [6:6] + libcxx/include/filesystem [6:6] + libcxx/include/float.h [6:6] + libcxx/include/forward_list [6:6] + libcxx/include/fstream [6:6] + libcxx/include/functional [6:6] + libcxx/include/future [6:6] + libcxx/include/initializer_list [6:6] + libcxx/include/inttypes.h [6:6] + libcxx/include/iomanip [6:6] + libcxx/include/ios [6:6] + libcxx/include/iosfwd [6:6] + libcxx/include/iostream [6:6] + libcxx/include/istream [6:6] + libcxx/include/iterator [6:6] + libcxx/include/latch [6:6] + libcxx/include/limits [6:6] + libcxx/include/limits.h [6:6] + libcxx/include/list [6:6] + libcxx/include/locale [6:6] + libcxx/include/locale.h [6:6] + libcxx/include/map [6:6] + libcxx/include/math.h [6:6] + libcxx/include/memory [6:6] + libcxx/include/mutex [6:6] + libcxx/include/new [6:6] + libcxx/include/numbers [6:6] + libcxx/include/numeric [6:6] + libcxx/include/optional [6:6] + libcxx/include/ostream [6:6] + libcxx/include/queue [6:6] + libcxx/include/random [6:6] + libcxx/include/ratio [6:6] + libcxx/include/regex [6:6] + libcxx/include/scoped_allocator [6:6] + libcxx/include/semaphore [6:6] + libcxx/include/set [6:6] + libcxx/include/setjmp.h [6:6] + libcxx/include/shared_mutex [6:6] + libcxx/include/span [6:6] + libcxx/include/sstream [6:6] + libcxx/include/stack [6:6] + libcxx/include/stdbool.h [6:6] + libcxx/include/stddef.h [6:6] + libcxx/include/stdexcept [6:6] + libcxx/include/stdint.h [6:6] + libcxx/include/stdio.h [6:6] + libcxx/include/stdlib.h [6:6] + libcxx/include/streambuf [6:6] + libcxx/include/string [6:6] + libcxx/include/string.h [6:6] + libcxx/include/string_view [6:6] + libcxx/include/strstream [6:6] + libcxx/include/support/android/locale_bionic.h [6:6] + libcxx/include/support/fuchsia/xlocale.h [6:6] + libcxx/include/support/ibm/limits.h [6:6] + libcxx/include/support/ibm/locale_mgmt_aix.h [6:6] + libcxx/include/support/ibm/nanosleep.h [6:6] + libcxx/include/support/ibm/support.h [6:6] + libcxx/include/support/ibm/xlocale.h [6:6] + libcxx/include/support/musl/xlocale.h [6:6] + libcxx/include/support/newlib/xlocale.h [5:5] + libcxx/include/support/nuttx/xlocale.h [6:6] + libcxx/include/support/solaris/floatingpoint.h [5:5] + libcxx/include/support/solaris/wchar.h [5:5] + libcxx/include/support/solaris/xlocale.h [5:5] + libcxx/include/support/win32/limits_msvc_win32.h [6:6] + libcxx/include/support/win32/locale_win32.h [6:6] + libcxx/include/support/xlocale/__nop_locale_mgmt.h [6:6] + libcxx/include/support/xlocale/__posix_l_fallback.h [6:6] + libcxx/include/support/xlocale/__strtonum_fallback.h [6:6] + libcxx/include/system_error [6:6] + libcxx/include/tgmath.h [6:6] + libcxx/include/thread [6:6] + libcxx/include/tuple [6:6] + libcxx/include/type_traits [6:6] + libcxx/include/typeindex [6:6] + libcxx/include/typeinfo [6:6] + libcxx/include/unordered_map [6:6] + libcxx/include/unordered_set [6:6] + libcxx/include/utility [6:6] + libcxx/include/valarray [6:6] + libcxx/include/variant [6:6] + libcxx/include/vector [6:6] + libcxx/include/version [6:6] + libcxx/include/wchar.h [6:6] + libcxx/include/wctype.h [6:6] + libcxx/src/algorithm.cpp [5:5] + libcxx/src/any.cpp [5:5] + libcxx/src/atomic.cpp [5:5] + libcxx/src/barrier.cpp [5:5] + libcxx/src/bind.cpp [5:5] + libcxx/src/charconv.cpp [5:5] + libcxx/src/chrono.cpp [5:5] + libcxx/src/condition_variable.cpp [5:5] + libcxx/src/condition_variable_destructor.cpp [5:5] + libcxx/src/debug.cpp [5:5] + libcxx/src/exception.cpp [5:5] + libcxx/src/experimental/memory_resource.cpp [5:5] + libcxx/src/filesystem/directory_iterator.cpp [5:5] + libcxx/src/filesystem/filesystem_common.h [5:5] + libcxx/src/filesystem/operations.cpp [5:5] + libcxx/src/functional.cpp [5:5] + libcxx/src/future.cpp [5:5] + libcxx/src/hash.cpp [5:5] + libcxx/src/include/apple_availability.h [5:5] + libcxx/src/include/atomic_support.h [5:5] + libcxx/src/include/config_elast.h [5:5] + libcxx/src/include/refstring.h [5:5] + libcxx/src/ios.cpp [5:5] + libcxx/src/ios.instantiations.cpp [5:5] + libcxx/src/iostream.cpp [5:5] + libcxx/src/locale.cpp [5:5] + libcxx/src/memory.cpp [5:5] + libcxx/src/mutex.cpp [5:5] + libcxx/src/mutex_destructor.cpp [5:5] + libcxx/src/new.cpp [5:5] + libcxx/src/optional.cpp [5:5] + libcxx/src/random.cpp [5:5] + libcxx/src/random_shuffle.cpp [5:5] + libcxx/src/regex.cpp [5:5] + libcxx/src/shared_mutex.cpp [5:5] + libcxx/src/stdexcept.cpp [5:5] + libcxx/src/string.cpp [5:5] + libcxx/src/strstream.cpp [5:5] + libcxx/src/support/runtime/exception_fallback.ipp [6:6] + libcxx/src/support/runtime/exception_glibcxx.ipp [6:6] + libcxx/src/support/runtime/exception_libcxxabi.ipp [6:6] + libcxx/src/support/runtime/exception_libcxxrt.ipp [6:6] + libcxx/src/support/runtime/exception_msvc.ipp [6:6] + libcxx/src/support/runtime/exception_pointer_cxxabi.ipp [6:6] + libcxx/src/support/runtime/exception_pointer_glibcxx.ipp [6:6] + libcxx/src/support/runtime/exception_pointer_msvc.ipp [6:6] + libcxx/src/support/runtime/exception_pointer_unimplemented.ipp [6:6] + libcxx/src/support/runtime/new_handler_fallback.ipp [6:6] + libcxx/src/support/runtime/stdexcept_default.ipp [5:5] + libcxx/src/support/runtime/stdexcept_vcruntime.ipp [5:5] + libcxx/src/support/solaris/xlocale.cpp [5:5] + libcxx/src/support/win32/locale_win32.cpp [6:6] + libcxx/src/support/win32/support.cpp [6:6] + libcxx/src/support/win32/thread_win32.cpp [6:6] + libcxx/src/system_error.cpp [5:5] + libcxx/src/thread.cpp [5:5] + libcxx/src/typeinfo.cpp [5:5] + libcxx/src/utility.cpp [5:5] + libcxx/src/valarray.cpp [5:5] + libcxx/src/variant.cpp [5:5] + libcxx/src/vector.cpp [5:5] + Scancode info: + Original SPDX id: LLVM-exception + Score : 100.00 + Match type : TAG + Links : http://llvm.org/foundation/relicensing/LICENSE.txt, https://spdx.org/licenses/LLVM-exception + Files with this license: + libcxx/include/__availability [6:6] + libcxx/include/__bit_reference [6:6] + libcxx/include/__bsd_locale_defaults.h [6:6] + libcxx/include/__bsd_locale_fallbacks.h [6:6] + libcxx/include/__config [6:6] + libcxx/include/__config_site.in [5:5] + libcxx/include/__debug [6:6] + libcxx/include/__errc [6:6] + libcxx/include/__functional_03 [6:6] + libcxx/include/__functional_base [6:6] + libcxx/include/__functional_base_03 [6:6] + libcxx/include/__hash_table [6:6] + libcxx/include/__locale [6:6] + libcxx/include/__memory/allocator_traits.h [6:6] + libcxx/include/__memory/base.h [6:6] + libcxx/include/__memory/pointer_traits.h [6:6] + libcxx/include/__memory/utilities.h [6:6] + libcxx/include/__mutex_base [6:6] + libcxx/include/__node_handle [6:6] + libcxx/include/__nullptr [6:6] + libcxx/include/__sso_allocator [6:6] + libcxx/include/__std_stream [6:6] + libcxx/include/__string [6:6] + libcxx/include/__threading_support [6:6] + libcxx/include/__tree [6:6] + libcxx/include/__tuple [6:6] + libcxx/include/__undef_macros [6:6] + libcxx/include/algorithm [6:6] + libcxx/include/any [6:6] + libcxx/include/array [6:6] + libcxx/include/atomic [6:6] + libcxx/include/barrier [6:6] + libcxx/include/bit [6:6] + libcxx/include/bitset [6:6] + libcxx/include/cassert [6:6] + libcxx/include/ccomplex [6:6] + libcxx/include/cctype [6:6] + libcxx/include/cerrno [6:6] + libcxx/include/cfenv [6:6] + libcxx/include/cfloat [6:6] + libcxx/include/charconv [6:6] + libcxx/include/chrono [6:6] + libcxx/include/cinttypes [6:6] + libcxx/include/ciso646 [6:6] + libcxx/include/climits [6:6] + libcxx/include/clocale [6:6] + libcxx/include/cmath [6:6] + libcxx/include/codecvt [6:6] + libcxx/include/compare [6:6] + libcxx/include/complex [6:6] + libcxx/include/complex.h [6:6] + libcxx/include/concepts [6:6] + libcxx/include/condition_variable [6:6] + libcxx/include/csetjmp [6:6] + libcxx/include/csignal [6:6] + libcxx/include/cstdarg [6:6] + libcxx/include/cstdbool [6:6] + libcxx/include/cstddef [6:6] + libcxx/include/cstdint [6:6] + libcxx/include/cstdio [6:6] + libcxx/include/cstdlib [6:6] + libcxx/include/cstring [6:6] + libcxx/include/ctgmath [6:6] + libcxx/include/ctime [6:6] + libcxx/include/ctype.h [6:6] + libcxx/include/cwchar [6:6] + libcxx/include/cwctype [6:6] + libcxx/include/deque [6:6] + libcxx/include/errno.h [6:6] + libcxx/include/exception [6:6] + libcxx/include/execution [6:6] + libcxx/include/experimental/__memory [6:6] + libcxx/include/experimental/algorithm [6:6] + libcxx/include/experimental/coroutine [6:6] + libcxx/include/experimental/deque [6:6] + libcxx/include/experimental/filesystem [6:6] + libcxx/include/experimental/forward_list [6:6] + libcxx/include/experimental/functional [6:6] + libcxx/include/experimental/iterator [6:6] + libcxx/include/experimental/list [6:6] + libcxx/include/experimental/map [6:6] + libcxx/include/experimental/memory_resource [6:6] + libcxx/include/experimental/propagate_const [6:6] + libcxx/include/experimental/regex [6:6] + libcxx/include/experimental/set [6:6] + libcxx/include/experimental/simd [6:6] + libcxx/include/experimental/string [6:6] + libcxx/include/experimental/type_traits [6:6] + libcxx/include/experimental/unordered_map [6:6] + libcxx/include/experimental/unordered_set [6:6] + libcxx/include/experimental/utility [6:6] + libcxx/include/experimental/vector [6:6] + libcxx/include/ext/__hash [6:6] + libcxx/include/ext/hash_map [6:6] + libcxx/include/ext/hash_set [6:6] + libcxx/include/filesystem [6:6] + libcxx/include/float.h [6:6] + libcxx/include/forward_list [6:6] + libcxx/include/fstream [6:6] + libcxx/include/functional [6:6] + libcxx/include/future [6:6] + libcxx/include/initializer_list [6:6] + libcxx/include/inttypes.h [6:6] + libcxx/include/iomanip [6:6] + libcxx/include/ios [6:6] + libcxx/include/iosfwd [6:6] + libcxx/include/iostream [6:6] + libcxx/include/istream [6:6] + libcxx/include/iterator [6:6] + libcxx/include/latch [6:6] + libcxx/include/limits [6:6] + libcxx/include/limits.h [6:6] + libcxx/include/list [6:6] + libcxx/include/locale [6:6] + libcxx/include/locale.h [6:6] + libcxx/include/map [6:6] + libcxx/include/math.h [6:6] + libcxx/include/memory [6:6] + libcxx/include/mutex [6:6] + libcxx/include/new [6:6] + libcxx/include/numbers [6:6] + libcxx/include/numeric [6:6] + libcxx/include/optional [6:6] + libcxx/include/ostream [6:6] + libcxx/include/queue [6:6] + libcxx/include/random [6:6] + libcxx/include/ratio [6:6] + libcxx/include/regex [6:6] + libcxx/include/scoped_allocator [6:6] + libcxx/include/semaphore [6:6] + libcxx/include/set [6:6] + libcxx/include/setjmp.h [6:6] + libcxx/include/shared_mutex [6:6] + libcxx/include/span [6:6] + libcxx/include/sstream [6:6] + libcxx/include/stack [6:6] + libcxx/include/stdbool.h [6:6] + libcxx/include/stddef.h [6:6] + libcxx/include/stdexcept [6:6] + libcxx/include/stdint.h [6:6] + libcxx/include/stdio.h [6:6] + libcxx/include/stdlib.h [6:6] + libcxx/include/streambuf [6:6] + libcxx/include/string [6:6] + libcxx/include/string.h [6:6] + libcxx/include/string_view [6:6] + libcxx/include/strstream [6:6] + libcxx/include/support/android/locale_bionic.h [6:6] + libcxx/include/support/fuchsia/xlocale.h [6:6] + libcxx/include/support/ibm/limits.h [6:6] + libcxx/include/support/ibm/locale_mgmt_aix.h [6:6] + libcxx/include/support/ibm/nanosleep.h [6:6] + libcxx/include/support/ibm/support.h [6:6] + libcxx/include/support/ibm/xlocale.h [6:6] + libcxx/include/support/musl/xlocale.h [6:6] + libcxx/include/support/newlib/xlocale.h [5:5] + libcxx/include/support/nuttx/xlocale.h [6:6] + libcxx/include/support/solaris/floatingpoint.h [5:5] + libcxx/include/support/solaris/wchar.h [5:5] + libcxx/include/support/solaris/xlocale.h [5:5] + libcxx/include/support/win32/limits_msvc_win32.h [6:6] + libcxx/include/support/win32/locale_win32.h [6:6] + libcxx/include/support/xlocale/__nop_locale_mgmt.h [6:6] + libcxx/include/support/xlocale/__posix_l_fallback.h [6:6] + libcxx/include/support/xlocale/__strtonum_fallback.h [6:6] + libcxx/include/system_error [6:6] + libcxx/include/tgmath.h [6:6] + libcxx/include/thread [6:6] + libcxx/include/tuple [6:6] + libcxx/include/type_traits [6:6] + libcxx/include/typeindex [6:6] + libcxx/include/typeinfo [6:6] + libcxx/include/unordered_map [6:6] + libcxx/include/unordered_set [6:6] + libcxx/include/utility [6:6] + libcxx/include/valarray [6:6] + libcxx/include/variant [6:6] + libcxx/include/vector [6:6] + libcxx/include/version [6:6] + libcxx/include/wchar.h [6:6] + libcxx/include/wctype.h [6:6] + libcxx/src/algorithm.cpp [5:5] + libcxx/src/any.cpp [5:5] + libcxx/src/atomic.cpp [5:5] + libcxx/src/barrier.cpp [5:5] + libcxx/src/bind.cpp [5:5] + libcxx/src/charconv.cpp [5:5] + libcxx/src/chrono.cpp [5:5] + libcxx/src/condition_variable.cpp [5:5] + libcxx/src/condition_variable_destructor.cpp [5:5] + libcxx/src/debug.cpp [5:5] + libcxx/src/exception.cpp [5:5] + libcxx/src/experimental/memory_resource.cpp [5:5] + libcxx/src/filesystem/directory_iterator.cpp [5:5] + libcxx/src/filesystem/filesystem_common.h [5:5] + libcxx/src/filesystem/operations.cpp [5:5] + libcxx/src/functional.cpp [5:5] + libcxx/src/future.cpp [5:5] + libcxx/src/hash.cpp [5:5] + libcxx/src/include/apple_availability.h [5:5] + libcxx/src/include/atomic_support.h [5:5] + libcxx/src/include/config_elast.h [5:5] + libcxx/src/include/refstring.h [5:5] + libcxx/src/ios.cpp [5:5] + libcxx/src/ios.instantiations.cpp [5:5] + libcxx/src/iostream.cpp [5:5] + libcxx/src/locale.cpp [5:5] + libcxx/src/memory.cpp [5:5] + libcxx/src/mutex.cpp [5:5] + libcxx/src/mutex_destructor.cpp [5:5] + libcxx/src/new.cpp [5:5] + libcxx/src/optional.cpp [5:5] + libcxx/src/random.cpp [5:5] + libcxx/src/random_shuffle.cpp [5:5] + libcxx/src/regex.cpp [5:5] + libcxx/src/shared_mutex.cpp [5:5] + libcxx/src/stdexcept.cpp [5:5] + libcxx/src/string.cpp [5:5] + libcxx/src/strstream.cpp [5:5] + libcxx/src/support/runtime/exception_fallback.ipp [6:6] + libcxx/src/support/runtime/exception_glibcxx.ipp [6:6] + libcxx/src/support/runtime/exception_libcxxabi.ipp [6:6] + libcxx/src/support/runtime/exception_libcxxrt.ipp [6:6] + libcxx/src/support/runtime/exception_msvc.ipp [6:6] + libcxx/src/support/runtime/exception_pointer_cxxabi.ipp [6:6] + libcxx/src/support/runtime/exception_pointer_glibcxx.ipp [6:6] + libcxx/src/support/runtime/exception_pointer_msvc.ipp [6:6] + libcxx/src/support/runtime/exception_pointer_unimplemented.ipp [6:6] + libcxx/src/support/runtime/new_handler_fallback.ipp [6:6] + libcxx/src/support/runtime/stdexcept_default.ipp [5:5] + libcxx/src/support/runtime/stdexcept_vcruntime.ipp [5:5] + libcxx/src/support/solaris/xlocale.cpp [5:5] + libcxx/src/support/win32/locale_win32.cpp [6:6] + libcxx/src/support/win32/support.cpp [6:6] + libcxx/src/support/win32/thread_win32.cpp [6:6] + libcxx/src/system_error.cpp [5:5] + libcxx/src/thread.cpp [5:5] + libcxx/src/typeinfo.cpp [5:5] + libcxx/src/utility.cpp [5:5] + libcxx/src/valarray.cpp [5:5] + libcxx/src/variant.cpp [5:5] + libcxx/src/vector.cpp [5:5] + +KEEP Apache-2.0 WITH LLVM-exception c1e6c6536fcc444f916047679115c618 +BELONGS libcxx/ya.make + License text: + * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + Scancode info: + Original SPDX id: Apache-2.0 + Score : 100.00 + Match type : TAG + Links : http://www.apache.org/licenses/, http://www.apache.org/licenses/LICENSE-2.0, https://spdx.org/licenses/Apache-2.0 + Files with this license: + libcxx/src/filesystem/int128_builtins.cpp [5:5] + Scancode info: + Original SPDX id: LLVM-exception + Score : 100.00 + Match type : TAG + Links : http://llvm.org/foundation/relicensing/LICENSE.txt, https://spdx.org/licenses/LLVM-exception + Files with this license: + libcxx/src/filesystem/int128_builtins.cpp [5:5] + +KEEP NCSA c26d0b72f92421989c4471ae0acbc943 +BELONGS libcxx/ya.make + License text: + University of Illinois/NCSA + Open Source License + Scancode info: + Original SPDX id: NCSA + Score : 100.00 + Match type : REFERENCE + Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA + Files with this license: + libcxx/LICENSE.TXT [249:250] + +KEEP NCSA AND MIT d2725783fa0a2f24d855943aac3dbdf9 +BELONGS openmp/ya.make +FILE_INCLUDE builtins/LICENSE.txt found in files: openmp/z_Windows_NT-586_asm.asm at line 10 + License text: + ;// This file is dual licensed under the MIT and the University of Illinois Open + ;// Source Licenses. See LICENSE.txt for details. + Scancode info: + Original SPDX id: NCSA + Score : 100.00 + Match type : NOTICE + Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA + Files with this license: + openmp/z_Windows_NT-586_asm.asm [9:10] + Scancode info: + Original SPDX id: MIT + Score : 100.00 + Match type : NOTICE + Links : http://opensource.org/licenses/mit-license.php, https://spdx.org/licenses/MIT + Files with this license: + openmp/z_Windows_NT-586_asm.asm [9:10] + +SKIP LicenseRef-scancode-unknown-license-reference d4fd839c20b32e384ccf02a801e876d1 +BELONGS libcxx/ya.make + # part of bsd-2-clause text + License text: + distributed under. + Scancode info: + Original SPDX id: LicenseRef-scancode-unknown-license-reference + Score : 11.00 + Match type : INTRO + Links : https://github.com/nexB/scancode-toolkit/tree/develop/src/licensedcode/data/licenses/unknown-license-reference.LICENSE + Files with this license: + libcxx/src/support/solaris/README [4:4] + +KEEP Apache-2.0 WITH LLVM-exception df18889e552d44a4679aff552267f802 +BELONGS libcxx/ya.make + License text: + The LLVM Project is under the Apache License v2.0 with LLVM Exceptions: + Scancode info: + Original SPDX id: Apache-2.0 + Score : 100.00 + Match type : NOTICE + Links : http://www.apache.org/licenses/, http://www.apache.org/licenses/LICENSE-2.0, https://spdx.org/licenses/Apache-2.0 + Files with this license: + libcxx/LICENSE.TXT [2:2] + Scancode info: + Original SPDX id: LLVM-exception + Score : 100.00 + Match type : NOTICE + Links : http://llvm.org/foundation/relicensing/LICENSE.txt, https://spdx.org/licenses/LLVM-exception + Files with this license: + libcxx/LICENSE.TXT [2:2] + +KEEP NCSA AND MIT e56769dac6aaa0678164025adda8a1da +BELONGS openmp/ya.make +FILE_INCLUDE builtins/LICENSE.txt found in files: openmp/i18n/en_US.txt at line 9 + License text: + \#// This file is dual licensed under the MIT and the University of Illinois Open + \#// Source Licenses. See LICENSE.txt for details. + Scancode info: + Original SPDX id: NCSA + Score : 100.00 + Match type : NOTICE + Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA + Files with this license: + openmp/i18n/en_US.txt [8:9] + Scancode info: + Original SPDX id: MIT + Score : 100.00 + Match type : NOTICE + Links : http://opensource.org/licenses/mit-license.php, https://spdx.org/licenses/MIT + Files with this license: + openmp/i18n/en_US.txt [8:9] + +KEEP BSD-2-Clause f59cebb43ee786218189ac014af76fbb +BELONGS libcxx/ya.make +FILE_IGNORE libcxx/include/experimental/list found in files: libcxx/src/support/solaris/mbsnrtowcs.inc at line 13, libcxx/src/support/solaris/mbsnrtowcs.inc at line 15, libcxx/src/support/solaris/wcsnrtombs.inc at line 10, libcxx/src/support/solaris/wcsnrtombs.inc at line 8 +FILE_IGNORE libcxx/include/list found in files: libcxx/src/support/solaris/mbsnrtowcs.inc at line 13, libcxx/src/support/solaris/mbsnrtowcs.inc at line 15, libcxx/src/support/solaris/wcsnrtombs.inc at line 10, libcxx/src/support/solaris/wcsnrtombs.inc at line 8 + # list - just word, not file reference + Note: matched license text is too long. Read it in the source files. + Scancode info: + Original SPDX id: BSD-2-Clause + Score : 100.00 + Match type : TEXT + Links : http://opensource.org/licenses/bsd-license.php, http://www.opensource.org/licenses/BSD-2-Clause, https://spdx.org/licenses/BSD-2-Clause + Files with this license: + libcxx/src/support/solaris/mbsnrtowcs.inc [9:28] + libcxx/src/support/solaris/wcsnrtombs.inc [4:23] + +KEEP BSD-2-Clause-Views fa822847a0868c8922cbd110b73455fc +BELONGS libcxxrt/ya.make +FILE_IGNORE libcxx/include/experimental/list found in files: libcxxrt/LICENSE at line 7, libcxxrt/LICENSE at line 8 +FILE_IGNORE libcxx/include/list found in files: libcxxrt/LICENSE at line 7, libcxxrt/LICENSE at line 8 +FILE_INCLUDE libcxxrt/COPYRIGHT found in files: libcxxrt/LICENSE at line 12 + # list - just word, not file reference + Note: matched license text is too long. Read it in the source files. + Scancode info: + Original SPDX id: BSD-2-Clause-Views + Score : 98.16 + Match type : TEXT + Links : https://github.com/protegeproject/protege/blob/master/license.txt, https://spdx.org/licenses/BSD-2-Clause-Views, https://www.freebsd.org/copyright/freebsd-license.html + Files with this license: + libcxxrt/LICENSE [5:14] diff --git a/contrib/libs/cxxsupp/builtins/.yandex_meta/devtools.copyrights.report b/contrib/libs/cxxsupp/builtins/.yandex_meta/devtools.copyrights.report index 3a00c42eca..7af1809040 100644 --- a/contrib/libs/cxxsupp/builtins/.yandex_meta/devtools.copyrights.report +++ b/contrib/libs/cxxsupp/builtins/.yandex_meta/devtools.copyrights.report @@ -1,67 +1,67 @@ -# File format ($ symbol means the beginning of a line): -# -# $ # this message -# $ # ======================= -# $ # comments (all commentaries should starts with some number of spaces and # symbol) -# ${action} {license id} {license text hash} -# $BELONGS ./ya/make/file/relative/path/1/ya.make ./ya/make/2/ya.make -# ${all_file_action} filename -# $ # user commentaries (many lines) -# $ generated description - files with this license, license text... (some number of lines that starts with some number of spaces, do not modify) -# ${action} {license spdx} {license text hash} -# $BELONGS ./ya/make/file/relative/path/3/ya.make -# ${all_file_action} filename -# $ # user commentaries -# $ generated description -# $ ... -# -# You can modify action, all_file_action and add commentaries -# Available actions: -# keep - keep license in contrib and use in credits -# skip - skip license -# remove - remove all files with this license -# rename - save license text/links into licenses texts file, but not store SPDX into LINCENSE macro. You should store correct license id into devtools.license.spdx.txt file -# -# {all file action} records will be generated when license text contains filename that exists on filesystem (in contrib directory) -# We suppose that that files can contain some license info -# Available all file actions: -# FILE_IGNORE - ignore file (do nothing) -# FILE_INCLUDE - include all file data into licenses text file -# ======================= - +# File format ($ symbol means the beginning of a line): +# +# $ # this message +# $ # ======================= +# $ # comments (all commentaries should starts with some number of spaces and # symbol) +# ${action} {license id} {license text hash} +# $BELONGS ./ya/make/file/relative/path/1/ya.make ./ya/make/2/ya.make +# ${all_file_action} filename +# $ # user commentaries (many lines) +# $ generated description - files with this license, license text... (some number of lines that starts with some number of spaces, do not modify) +# ${action} {license spdx} {license text hash} +# $BELONGS ./ya/make/file/relative/path/3/ya.make +# ${all_file_action} filename +# $ # user commentaries +# $ generated description +# $ ... +# +# You can modify action, all_file_action and add commentaries +# Available actions: +# keep - keep license in contrib and use in credits +# skip - skip license +# remove - remove all files with this license +# rename - save license text/links into licenses texts file, but not store SPDX into LINCENSE macro. You should store correct license id into devtools.license.spdx.txt file +# +# {all file action} records will be generated when license text contains filename that exists on filesystem (in contrib directory) +# We suppose that that files can contain some license info +# Available all file actions: +# FILE_IGNORE - ignore file (do nothing) +# FILE_INCLUDE - include all file data into licenses text file +# ======================= + KEEP COPYRIGHT_SERVICE_LABEL 6abb44b35108cb004d9a12213d837344 BELONGS ya.make - License text: + License text: Copyright (c) 2009-2018 by the contributors listed in CREDITS.TXT - Scancode info: - Original SPDX id: COPYRIGHT_SERVICE_LABEL - Score : 100.00 - Match type : COPYRIGHT - Files with this license: + Scancode info: + Original SPDX id: COPYRIGHT_SERVICE_LABEL + Score : 100.00 + Match type : COPYRIGHT + Files with this license: LICENSE.os_version_check.c.txt [17:17] - + KEEP COPYRIGHT_SERVICE_LABEL debfce3edcb19585edc08c5b1d986c0b BELONGS ya.make - License text: + License text: Copyright (c) 2009-2015 by the contributors listed in CREDITS.TXT - Scancode info: - Original SPDX id: COPYRIGHT_SERVICE_LABEL - Score : 100.00 - Match type : COPYRIGHT - Files with this license: + Scancode info: + Original SPDX id: COPYRIGHT_SERVICE_LABEL + Score : 100.00 + Match type : COPYRIGHT + Files with this license: LICENSE.os_version_check.c.patch.txt [293:293] LICENSE.os_version_check.c.txt [58:58] LICENSE.txt [17:17] LICENSE.txt [58:58] - -KEEP COPYRIGHT_SERVICE_LABEL ebc015cad7377d32e7b2fc0ae5293aa1 + +KEEP COPYRIGHT_SERVICE_LABEL ebc015cad7377d32e7b2fc0ae5293aa1 BELONGS ya.make - # libcxxabi/CREDITS.TXT included in libcxxabi - License text: - Copyright (c) 2009-2019 by the contributors listed in CREDITS.TXT - Scancode info: - Original SPDX id: COPYRIGHT_SERVICE_LABEL - Score : 100.00 - Match type : COPYRIGHT - Files with this license: + # libcxxabi/CREDITS.TXT included in libcxxabi + License text: + Copyright (c) 2009-2019 by the contributors listed in CREDITS.TXT + Scancode info: + Original SPDX id: COPYRIGHT_SERVICE_LABEL + Score : 100.00 + Match type : COPYRIGHT + Files with this license: LICENSE.os_version_check.c.patch.txt [252:252] diff --git a/contrib/libs/cxxsupp/builtins/.yandex_meta/devtools.licenses.report b/contrib/libs/cxxsupp/builtins/.yandex_meta/devtools.licenses.report index c9cfdfa9d4..f5ffcbd816 100644 --- a/contrib/libs/cxxsupp/builtins/.yandex_meta/devtools.licenses.report +++ b/contrib/libs/cxxsupp/builtins/.yandex_meta/devtools.licenses.report @@ -1,63 +1,63 @@ -# File format ($ symbol means the beginning of a line): -# -# $ # this message -# $ # ======================= -# $ # comments (all commentaries should starts with some number of spaces and # symbol) -# ${action} {license spdx} {license text hash} -# $BELONGS ./ya/make/file/relative/path/1/ya.make ./ya/make/2/ya.make -# ${all_file_action} filename -# $ # user commentaries (many lines) -# $ generated description - files with this license, license text... (some number of lines that starts with some number of spaces, do not modify) -# ${action} {license spdx} {license text hash} -# $BELONGS ./ya/make/file/relative/path/3/ya.make -# ${all_file_action} filename -# $ # user commentaries -# $ generated description -# $ ... -# -# You can modify action, all_file_action and add commentaries -# Available actions: -# keep - keep license in contrib and use in credits -# skip - skip license -# remove - remove all files with this license -# rename - save license text/links into licenses texts file, but not store SPDX into LINCENSE macro. You should store correct license id into devtools.license.spdx.txt file -# -# {all file action} records will be generated when license text contains filename that exists on filesystem (in contrib directory) -# We suppose that that files can contain some license info -# Available all file actions: -# FILE_IGNORE - ignore file (do nothing) -# FILE_INCLUDE - include all file data into licenses text file -# ======================= - +# File format ($ symbol means the beginning of a line): +# +# $ # this message +# $ # ======================= +# $ # comments (all commentaries should starts with some number of spaces and # symbol) +# ${action} {license spdx} {license text hash} +# $BELONGS ./ya/make/file/relative/path/1/ya.make ./ya/make/2/ya.make +# ${all_file_action} filename +# $ # user commentaries (many lines) +# $ generated description - files with this license, license text... (some number of lines that starts with some number of spaces, do not modify) +# ${action} {license spdx} {license text hash} +# $BELONGS ./ya/make/file/relative/path/3/ya.make +# ${all_file_action} filename +# $ # user commentaries +# $ generated description +# $ ... +# +# You can modify action, all_file_action and add commentaries +# Available actions: +# keep - keep license in contrib and use in credits +# skip - skip license +# remove - remove all files with this license +# rename - save license text/links into licenses texts file, but not store SPDX into LINCENSE macro. You should store correct license id into devtools.license.spdx.txt file +# +# {all file action} records will be generated when license text contains filename that exists on filesystem (in contrib directory) +# We suppose that that files can contain some license info +# Available all file actions: +# FILE_IGNORE - ignore file (do nothing) +# FILE_INCLUDE - include all file data into licenses text file +# ======================= + KEEP NCSA 1975f079a20b2f4a333fa0d9e510d9fa BELONGS ya.make - License text: + License text: \# This file is distributed under the University of Illinois Open Source \# License. See LICENSE.TXT for details. - Scancode info: - Original SPDX id: NCSA + Scancode info: + Original SPDX id: NCSA Score : 94.00 - Match type : NOTICE - Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA - Files with this license: + Match type : NOTICE + Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA + Files with this license: arm/Makefile.mk [5:6] arm64/Makefile.mk [5:6] armv6m/Makefile.mk [5:6] i386/Makefile.mk [5:6] ppc/Makefile.mk [5:6] x86_64/Makefile.mk [5:6] - + KEEP NCSA AND MIT 27a91d3feda74cb7f51826c55ccf86e1 BELONGS ya.make License text: * This file is dual licensed under the MIT and the University of Illinois Open * Source Licenses. See LICENSE.TXT for details. - Scancode info: - Original SPDX id: NCSA - Score : 100.00 - Match type : NOTICE - Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA - Files with this license: + Scancode info: + Original SPDX id: NCSA + Score : 100.00 + Match type : NOTICE + Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA + Files with this license: absvdi2.c [5:6] absvsi2.c [5:6] absvti2.c [5:6] @@ -220,12 +220,12 @@ BELONGS ya.make umoddi3.c [5:6] umodsi3.c [5:6] umodti3.c [5:6] - Scancode info: - Original SPDX id: MIT - Score : 100.00 - Match type : NOTICE - Links : http://opensource.org/licenses/mit-license.php, https://spdx.org/licenses/MIT - Files with this license: + Scancode info: + Original SPDX id: MIT + Score : 100.00 + Match type : NOTICE + Links : http://opensource.org/licenses/mit-license.php, https://spdx.org/licenses/MIT + Files with this license: absvdi2.c [5:6] absvsi2.c [5:6] absvti2.c [5:6] @@ -388,70 +388,70 @@ BELONGS ya.make umoddi3.c [5:6] umodsi3.c [5:6] umodti3.c [5:6] - + KEEP NCSA 281d1ec07e86b61c925d7c514deecb25 BELONGS ya.make FILE_INCLUDE LICENSE.txt found in files: README.txt at line 8 - License text: + License text: Compiler-RT is open source software. You may freely distribute it under the terms of the license agreement found in LICENSE.txt. - Scancode info: - Original SPDX id: NCSA - Score : 100.00 - Match type : NOTICE - Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA - Files with this license: + Scancode info: + Original SPDX id: NCSA + Score : 100.00 + Match type : NOTICE + Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA + Files with this license: README.txt [7:8] - -KEEP NCSA 5a35b4c0d3b3923cac31a5a371332ca2 + +KEEP NCSA 5a35b4c0d3b3923cac31a5a371332ca2 BELONGS ya.make - License text: - Legacy LLVM License (https://llvm.org/docs/DeveloperPolicy.html#legacy): - Scancode info: - Original SPDX id: NCSA - Score : 100.00 - Match type : REFERENCE - Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA - Files with this license: + License text: + Legacy LLVM License (https://llvm.org/docs/DeveloperPolicy.html#legacy): + Scancode info: + Original SPDX id: NCSA + Score : 100.00 + Match type : REFERENCE + Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA + Files with this license: LICENSE.os_version_check.c.patch.txt [237:237] - + KEEP NCSA 5b89aaa4f22bc812b081b9e1de7d0a13 BELONGS ya.make - Note: matched license text is too long. Read it in the source files. - Scancode info: + Note: matched license text is too long. Read it in the source files. + Scancode info: Original SPDX id: NCSA - Score : 100.00 + Score : 100.00 Match type : REFERENCE Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA - Files with this license: + Files with this license: LICENSE.os_version_check.c.txt [81:90] LICENSE.txt [81:90] - -KEEP MIT 5debb370f50e1dfd24ff5144233a2ef6 + +KEEP MIT 5debb370f50e1dfd24ff5144233a2ef6 BELONGS ya.make - # any - just word, not file reference - Note: matched license text is too long. Read it in the source files. - Scancode info: - Original SPDX id: MIT - Score : 100.00 - Match type : TEXT - Links : http://opensource.org/licenses/mit-license.php, https://spdx.org/licenses/MIT - Files with this license: + # any - just word, not file reference + Note: matched license text is too long. Read it in the source files. + Scancode info: + Original SPDX id: MIT + Score : 100.00 + Match type : TEXT + Links : http://opensource.org/licenses/mit-license.php, https://spdx.org/licenses/MIT + Files with this license: LICENSE.os_version_check.c.patch.txt [295:311] LICENSE.os_version_check.c.txt [60:76] LICENSE.txt [60:76] - + KEEP NCSA AND MIT 72d4e9e6f06ffb6f0c77cb800c3ac442 BELONGS ya.make - License text: + License text: // This file is dual licensed under the MIT and the University of Illinois Open // Source Licenses. See LICENSE.TXT for details. - Scancode info: - Original SPDX id: NCSA - Score : 100.00 - Match type : NOTICE - Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA - Files with this license: + Scancode info: + Original SPDX id: NCSA + Score : 100.00 + Match type : NOTICE + Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA + Files with this license: adddf3.c [5:6] addsf3.c [5:6] addtf3.c [5:6] @@ -578,12 +578,12 @@ BELONGS ya.make x86_64/floatundidf.S [5:6] x86_64/floatundisf.S [1:2] x86_64/floatundixf.S [1:2] - Scancode info: - Original SPDX id: MIT - Score : 100.00 - Match type : NOTICE - Links : http://opensource.org/licenses/mit-license.php, https://spdx.org/licenses/MIT - Files with this license: + Scancode info: + Original SPDX id: MIT + Score : 100.00 + Match type : NOTICE + Links : http://opensource.org/licenses/mit-license.php, https://spdx.org/licenses/MIT + Files with this license: adddf3.c [5:6] addsf3.c [5:6] addtf3.c [5:6] @@ -710,29 +710,29 @@ BELONGS ya.make x86_64/floatundidf.S [5:6] x86_64/floatundisf.S [1:2] x86_64/floatundixf.S [1:2] - -KEEP Apache-2.0 WITH LLVM-exception 8494a9caed330d9a4f40e19cce7dc770 + +KEEP Apache-2.0 WITH LLVM-exception 8494a9caed330d9a4f40e19cce7dc770 BELONGS ya.make - Note: matched license text is too long. Read it in the source files. - Scancode info: - Original SPDX id: LLVM-exception - Score : 100.00 - Match type : TEXT - Links : http://llvm.org/foundation/relicensing/LICENSE.txt, https://spdx.org/licenses/LLVM-exception - Files with this license: + Note: matched license text is too long. Read it in the source files. + Scancode info: + Original SPDX id: LLVM-exception + Score : 100.00 + Match type : TEXT + Links : http://llvm.org/foundation/relicensing/LICENSE.txt, https://spdx.org/licenses/LLVM-exception + Files with this license: LICENSE.os_version_check.c.patch.txt [208:222] - + KEEP NCSA 866c17e668b5e51841e1c1979de94aa1 BELONGS ya.make - License text: + License text: /* This file is distributed under the University of Illinois Open Source * License. See LICENSE.TXT for details. - Scancode info: + Scancode info: Original SPDX id: NCSA Score : 94.00 Match type : NOTICE Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA - Files with this license: + Files with this license: ppc/divtc3.c [1:2] ppc/fixtfdi.c [1:2] ppc/fixunstfdi.c [1:2] @@ -745,98 +745,98 @@ BELONGS ya.make x86_64/floatdidf.c [1:2] x86_64/floatdisf.c [1:2] x86_64/floatdixf.c [1:2] - -KEEP Apache-2.0 9ac77f65a898755c7eed97099caded94 + +KEEP Apache-2.0 9ac77f65a898755c7eed97099caded94 BELONGS ya.make - # any and version - just words, not file reference - Note: matched license text is too long. Read it in the source files. - Scancode info: - Original SPDX id: Apache-2.0 - Score : 100.00 - Match type : TEXT - Links : http://www.apache.org/licenses/, http://www.apache.org/licenses/LICENSE-2.0, https://spdx.org/licenses/Apache-2.0 - Files with this license: + # any and version - just words, not file reference + Note: matched license text is too long. Read it in the source files. + Scancode info: + Original SPDX id: Apache-2.0 + Score : 100.00 + Match type : TEXT + Links : http://www.apache.org/licenses/, http://www.apache.org/licenses/LICENSE-2.0, https://spdx.org/licenses/Apache-2.0 + Files with this license: LICENSE.os_version_check.c.patch.txt [5:205] - + KEEP NCSA AND MIT acaf5a1ddffd6829f7ebecb9e50c6c5f BELONGS ya.make Note: matched license text is too long. Read it in the source files. - Scancode info: - Original SPDX id: NCSA - Score : 100.00 - Match type : NOTICE - Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA - Files with this license: + Scancode info: + Original SPDX id: NCSA + Score : 100.00 + Match type : NOTICE + Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA + Files with this license: LICENSE.os_version_check.c.patch.txt [240:245] LICENSE.os_version_check.c.txt [5:10] LICENSE.txt [5:10] - Scancode info: - Original SPDX id: MIT - Score : 100.00 - Match type : NOTICE - Links : http://opensource.org/licenses/mit-license.php, https://spdx.org/licenses/MIT - Files with this license: + Scancode info: + Original SPDX id: MIT + Score : 100.00 + Match type : NOTICE + Links : http://opensource.org/licenses/mit-license.php, https://spdx.org/licenses/MIT + Files with this license: LICENSE.os_version_check.c.patch.txt [240:245] LICENSE.os_version_check.c.txt [5:10] LICENSE.txt [5:10] - -KEEP NCSA b160d8bd561da097b0edd40b062e1c84 + +KEEP NCSA b160d8bd561da097b0edd40b062e1c84 BELONGS ya.make - # any and list - just words, not file reference - Note: matched license text is too long. Read it in the source files. - Scancode info: - Original SPDX id: NCSA - Score : 100.00 - Match type : TEXT - Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA - Files with this license: + # any and list - just words, not file reference + Note: matched license text is too long. Read it in the source files. + Scancode info: + Original SPDX id: NCSA + Score : 100.00 + Match type : TEXT + Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA + Files with this license: LICENSE.os_version_check.c.patch.txt [264:289] LICENSE.os_version_check.c.txt [29:54] LICENSE.txt [29:54] - -KEEP NCSA c26d0b72f92421989c4471ae0acbc943 + +KEEP NCSA c26d0b72f92421989c4471ae0acbc943 BELONGS ya.make - License text: - University of Illinois/NCSA - Open Source License - Scancode info: - Original SPDX id: NCSA - Score : 100.00 - Match type : REFERENCE - Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA - Files with this license: + License text: + University of Illinois/NCSA + Open Source License + Scancode info: + Original SPDX id: NCSA + Score : 100.00 + Match type : REFERENCE + Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA + Files with this license: LICENSE.os_version_check.c.patch.txt [249:250] LICENSE.os_version_check.c.txt [14:15] LICENSE.txt [14:15] - -KEEP Apache-2.0 WITH LLVM-exception df18889e552d44a4679aff552267f802 + +KEEP Apache-2.0 WITH LLVM-exception df18889e552d44a4679aff552267f802 BELONGS ya.make - License text: - The LLVM Project is under the Apache License v2.0 with LLVM Exceptions: - Scancode info: - Original SPDX id: Apache-2.0 - Score : 100.00 - Match type : NOTICE - Links : http://www.apache.org/licenses/, http://www.apache.org/licenses/LICENSE-2.0, https://spdx.org/licenses/Apache-2.0 - Files with this license: + License text: + The LLVM Project is under the Apache License v2.0 with LLVM Exceptions: + Scancode info: + Original SPDX id: Apache-2.0 + Score : 100.00 + Match type : NOTICE + Links : http://www.apache.org/licenses/, http://www.apache.org/licenses/LICENSE-2.0, https://spdx.org/licenses/Apache-2.0 + Files with this license: LICENSE.os_version_check.c.patch.txt [2:2] - Scancode info: - Original SPDX id: LLVM-exception - Score : 100.00 - Match type : NOTICE - Links : http://llvm.org/foundation/relicensing/LICENSE.txt, https://spdx.org/licenses/LLVM-exception - Files with this license: + Scancode info: + Original SPDX id: LLVM-exception + Score : 100.00 + Match type : NOTICE + Links : http://llvm.org/foundation/relicensing/LICENSE.txt, https://spdx.org/licenses/LLVM-exception + Files with this license: LICENSE.os_version_check.c.patch.txt [2:2] - + KEEP NCSA efa7c9a4e646ac38725d00250dd0b1a5 BELONGS ya.make - License text: + License text: /* This file is distributed under the University of Illinois Open Source * License. See LICENSE.TXT for details. - Scancode info: - Original SPDX id: NCSA + Scancode info: + Original SPDX id: NCSA Score : 94.00 - Match type : NOTICE - Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA - Files with this license: + Match type : NOTICE + Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA + Files with this license: ppc/gcc_qadd.c [1:2] diff --git a/contrib/libs/cxxsupp/builtins/.yandex_meta/licenses.list.txt b/contrib/libs/cxxsupp/builtins/.yandex_meta/licenses.list.txt index ee63781e18..b0bad74577 100644 --- a/contrib/libs/cxxsupp/builtins/.yandex_meta/licenses.list.txt +++ b/contrib/libs/cxxsupp/builtins/.yandex_meta/licenses.list.txt @@ -1,289 +1,289 @@ ====================Apache-2.0==================== - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - -====================Apache-2.0 WITH LLVM-exception==================== ----- LLVM Exceptions to the Apache 2.0 License ---- - -As an exception, if, as a result of your compiling your source code, portions -of this Software are embedded into an Object form of such source code, you -may redistribute such embedded portions in such Object form without complying -with the conditions of Sections 4(a), 4(b) and 4(d) of the License. - -In addition, if you combine or link compiled forms of this Software with -software that is licensed under the GPLv2 ("Combined Software") and if a -court of competent jurisdiction determines that the patent provision (Section -3), the indemnity provision (Section 9) or other Section of the License -conflicts with the conditions of the GPLv2, you may retroactively and -prospectively choose to deem waived or otherwise exclude such Section(s) of -the License, but only in their entirety and only with respect to the Combined -Software. - - -====================Apache-2.0 WITH LLVM-exception==================== + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +====================Apache-2.0 WITH LLVM-exception==================== +---- LLVM Exceptions to the Apache 2.0 License ---- + +As an exception, if, as a result of your compiling your source code, portions +of this Software are embedded into an Object form of such source code, you +may redistribute such embedded portions in such Object form without complying +with the conditions of Sections 4(a), 4(b) and 4(d) of the License. + +In addition, if you combine or link compiled forms of this Software with +software that is licensed under the GPLv2 ("Combined Software") and if a +court of competent jurisdiction determines that the patent provision (Section +3), the indemnity provision (Section 9) or other Section of the License +conflicts with the conditions of the GPLv2, you may retroactively and +prospectively choose to deem waived or otherwise exclude such Section(s) of +the License, but only in their entirety and only with respect to the Combined +Software. + + +====================Apache-2.0 WITH LLVM-exception==================== The LLVM Project is under the Apache License v2.0 with LLVM Exceptions: - - + + ====================COPYRIGHT==================== Copyright (c) 2009-2015 by the contributors listed in CREDITS.TXT - - -====================COPYRIGHT==================== + + +====================COPYRIGHT==================== Copyright (c) 2009-2018 by the contributors listed in CREDITS.TXT - - -====================COPYRIGHT==================== -Copyright (c) 2009-2019 by the contributors listed in CREDITS.TXT - - + + +====================COPYRIGHT==================== +Copyright (c) 2009-2019 by the contributors listed in CREDITS.TXT + + ====================File: LICENSE.txt==================== ============================================================================== compiler_rt License ============================================================================== - + The compiler_rt library is dual licensed under both the University of Illinois "BSD-Like" license and the MIT license. As a user of this code you may choose to use it under either license. As a contributor, you agree to allow your code to be used under both. - + Full text of the relevant licenses is included below. - + ============================================================================== - + University of Illinois/NCSA Open Source License - + Copyright (c) 2009-2015 by the contributors listed in CREDITS.TXT - + All rights reserved. - + Developed by: - + LLVM Team - + University of Illinois at Urbana-Champaign - + http://llvm.org - + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal with the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - + * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimers. - + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimers in the documentation and/or other materials provided with the distribution. - + * Neither the names of the LLVM Team, University of Illinois at Urbana-Champaign, nor the names of its contributors may be used to endorse or promote products derived from this Software without specific prior written permission. - + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE @@ -291,18 +291,18 @@ CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE SOFTWARE. - + ============================================================================== - + Copyright (c) 2009-2015 by the contributors listed in CREDITS.TXT - + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - + The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. @@ -330,26 +330,26 @@ Software. -====================MIT==================== -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -====================NCSA==================== +====================MIT==================== +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +====================NCSA==================== # This file is distributed under the University of Illinois Open Source # License. See LICENSE.TXT for details. @@ -370,39 +370,39 @@ terms of the license agreement found in LICENSE.txt. ====================NCSA==================== -Legacy LLVM License (https://llvm.org/docs/DeveloperPolicy.html#legacy): - - -====================NCSA==================== -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal with -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimers. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimers in the - documentation and/or other materials provided with the distribution. - - * Neither the names of the LLVM Team, University of Illinois at - Urbana-Champaign, nor the names of its contributors may be used to - endorse or promote products derived from this Software without specific - prior written permission. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE -SOFTWARE. - - -====================NCSA==================== +Legacy LLVM License (https://llvm.org/docs/DeveloperPolicy.html#legacy): + + +====================NCSA==================== +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal with +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimers. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimers in the + documentation and/or other materials provided with the distribution. + + * Neither the names of the LLVM Team, University of Illinois at + Urbana-Champaign, nor the names of its contributors may be used to + endorse or promote products derived from this Software without specific + prior written permission. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE +SOFTWARE. + + +====================NCSA==================== The LLVM software contains code written by third parties. Such software will have its own individual LICENSE.TXT file in the directory in which it appears. This file will describe the copyrights, license, and restrictions which apply @@ -416,11 +416,11 @@ Software. ====================NCSA==================== -University of Illinois/NCSA -Open Source License - - -====================NCSA AND MIT==================== +University of Illinois/NCSA +Open Source License + + +====================NCSA AND MIT==================== * This file is dual licensed under the MIT and the University of Illinois Open * Source Licenses. See LICENSE.TXT for details. @@ -432,8 +432,8 @@ Open Source License ====================NCSA AND MIT==================== The compiler_rt library is dual licensed under both the University of Illinois -"BSD-Like" license and the MIT license. As a user of this code you may choose -to use it under either license. As a contributor, you agree to allow your code -to be used under both. - -Full text of the relevant licenses is included below. +"BSD-Like" license and the MIT license. As a user of this code you may choose +to use it under either license. As a contributor, you agree to allow your code +to be used under both. + +Full text of the relevant licenses is included below. diff --git a/contrib/libs/cxxsupp/builtins/os_version_check.c b/contrib/libs/cxxsupp/builtins/os_version_check.c index a3cb63886d..85b2161f3a 100644 --- a/contrib/libs/cxxsupp/builtins/os_version_check.c +++ b/contrib/libs/cxxsupp/builtins/os_version_check.c @@ -1,32 +1,32 @@ -/* ===-- os_version_check.c - OS version checking -------------------------=== - * - * The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements the function __isOSVersionAtLeast, used by - * Objective-C's @available - * - * ===----------------------------------------------------------------------=== - */ - -#ifdef __APPLE__ - -#include <TargetConditionals.h> -#include <dispatch/dispatch.h> -#include <dlfcn.h> -#include <stdint.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -/* These three variables hold the host's OS version. */ -static int32_t GlobalMajor, GlobalMinor, GlobalSubminor; -static dispatch_once_t DispatchOnceCounter; - +/* ===-- os_version_check.c - OS version checking -------------------------=== + * + * The LLVM Compiler Infrastructure + * + * This file is dual licensed under the MIT and the University of Illinois Open + * Source Licenses. See LICENSE.TXT for details. + * + * ===----------------------------------------------------------------------=== + * + * This file implements the function __isOSVersionAtLeast, used by + * Objective-C's @available + * + * ===----------------------------------------------------------------------=== + */ + +#ifdef __APPLE__ + +#include <TargetConditionals.h> +#include <dispatch/dispatch.h> +#include <dlfcn.h> +#include <stdint.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +/* These three variables hold the host's OS version. */ +static int32_t GlobalMajor, GlobalMinor, GlobalSubminor; +static dispatch_once_t DispatchOnceCounter; + // _availability_version_check darwin API support. typedef uint32_t dyld_platform_t; @@ -40,56 +40,56 @@ typedef bool (*AvailabilityVersionCheckFuncTy)(uint32_t count, static AvailabilityVersionCheckFuncTy AvailabilityVersionCheck; -/* We can't include <CoreFoundation/CoreFoundation.h> directly from here, so - * just forward declare everything that we need from it. */ - -typedef const void *CFDataRef, *CFAllocatorRef, *CFPropertyListRef, - *CFStringRef, *CFDictionaryRef, *CFTypeRef, *CFErrorRef; - -#if __LLP64__ -typedef unsigned long long CFTypeID; -typedef unsigned long long CFOptionFlags; -typedef signed long long CFIndex; -#else -typedef unsigned long CFTypeID; -typedef unsigned long CFOptionFlags; -typedef signed long CFIndex; -#endif - -typedef unsigned char UInt8; -typedef _Bool Boolean; -typedef CFIndex CFPropertyListFormat; -typedef uint32_t CFStringEncoding; - -/* kCFStringEncodingASCII analog. */ -#define CF_STRING_ENCODING_ASCII 0x0600 -/* kCFStringEncodingUTF8 analog. */ -#define CF_STRING_ENCODING_UTF8 0x08000100 -#define CF_PROPERTY_LIST_IMMUTABLE 0 - -typedef CFDataRef (*CFDataCreateWithBytesNoCopyFuncTy)(CFAllocatorRef, - const UInt8 *, CFIndex, - CFAllocatorRef); -typedef CFPropertyListRef (*CFPropertyListCreateWithDataFuncTy)( - CFAllocatorRef, CFDataRef, CFOptionFlags, CFPropertyListFormat *, - CFErrorRef *); -typedef CFPropertyListRef (*CFPropertyListCreateFromXMLDataFuncTy)( - CFAllocatorRef, CFDataRef, CFOptionFlags, CFStringRef *); -typedef CFStringRef (*CFStringCreateWithCStringNoCopyFuncTy)(CFAllocatorRef, - const char *, - CFStringEncoding, - CFAllocatorRef); -typedef const void *(*CFDictionaryGetValueFuncTy)(CFDictionaryRef, - const void *); -typedef CFTypeID (*CFGetTypeIDFuncTy)(CFTypeRef); -typedef CFTypeID (*CFStringGetTypeIDFuncTy)(void); -typedef Boolean (*CFStringGetCStringFuncTy)(CFStringRef, char *, CFIndex, - CFStringEncoding); -typedef void (*CFReleaseFuncTy)(CFTypeRef); - -/* Find and parse the SystemVersion.plist file. */ +/* We can't include <CoreFoundation/CoreFoundation.h> directly from here, so + * just forward declare everything that we need from it. */ + +typedef const void *CFDataRef, *CFAllocatorRef, *CFPropertyListRef, + *CFStringRef, *CFDictionaryRef, *CFTypeRef, *CFErrorRef; + +#if __LLP64__ +typedef unsigned long long CFTypeID; +typedef unsigned long long CFOptionFlags; +typedef signed long long CFIndex; +#else +typedef unsigned long CFTypeID; +typedef unsigned long CFOptionFlags; +typedef signed long CFIndex; +#endif + +typedef unsigned char UInt8; +typedef _Bool Boolean; +typedef CFIndex CFPropertyListFormat; +typedef uint32_t CFStringEncoding; + +/* kCFStringEncodingASCII analog. */ +#define CF_STRING_ENCODING_ASCII 0x0600 +/* kCFStringEncodingUTF8 analog. */ +#define CF_STRING_ENCODING_UTF8 0x08000100 +#define CF_PROPERTY_LIST_IMMUTABLE 0 + +typedef CFDataRef (*CFDataCreateWithBytesNoCopyFuncTy)(CFAllocatorRef, + const UInt8 *, CFIndex, + CFAllocatorRef); +typedef CFPropertyListRef (*CFPropertyListCreateWithDataFuncTy)( + CFAllocatorRef, CFDataRef, CFOptionFlags, CFPropertyListFormat *, + CFErrorRef *); +typedef CFPropertyListRef (*CFPropertyListCreateFromXMLDataFuncTy)( + CFAllocatorRef, CFDataRef, CFOptionFlags, CFStringRef *); +typedef CFStringRef (*CFStringCreateWithCStringNoCopyFuncTy)(CFAllocatorRef, + const char *, + CFStringEncoding, + CFAllocatorRef); +typedef const void *(*CFDictionaryGetValueFuncTy)(CFDictionaryRef, + const void *); +typedef CFTypeID (*CFGetTypeIDFuncTy)(CFTypeRef); +typedef CFTypeID (*CFStringGetTypeIDFuncTy)(void); +typedef Boolean (*CFStringGetCStringFuncTy)(CFStringRef, char *, CFIndex, + CFStringEncoding); +typedef void (*CFReleaseFuncTy)(CFTypeRef); + +/* Find and parse the SystemVersion.plist file. */ static void initializeAvailabilityCheck(void *Unused) { - (void)Unused; + (void)Unused; // Use the new API if it's is available. Still load the PLIST to ensure that the // existing calls to __isOSVersionAtLeast still work even with new @@ -97,150 +97,150 @@ static void initializeAvailabilityCheck(void *Unused) { AvailabilityVersionCheck = (AvailabilityVersionCheckFuncTy)dlsym( RTLD_DEFAULT, "_availability_version_check"); - /* Load CoreFoundation dynamically */ - const void *NullAllocator = dlsym(RTLD_DEFAULT, "kCFAllocatorNull"); - if (!NullAllocator) - return; - const CFAllocatorRef AllocatorNull = *(const CFAllocatorRef *)NullAllocator; - CFDataCreateWithBytesNoCopyFuncTy CFDataCreateWithBytesNoCopyFunc = - (CFDataCreateWithBytesNoCopyFuncTy)dlsym(RTLD_DEFAULT, - "CFDataCreateWithBytesNoCopy"); - if (!CFDataCreateWithBytesNoCopyFunc) - return; - CFPropertyListCreateWithDataFuncTy CFPropertyListCreateWithDataFunc = - (CFPropertyListCreateWithDataFuncTy)dlsym( - RTLD_DEFAULT, "CFPropertyListCreateWithData"); -/* CFPropertyListCreateWithData was introduced only in macOS 10.6+, so it - * will be NULL on earlier OS versions. */ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" - CFPropertyListCreateFromXMLDataFuncTy CFPropertyListCreateFromXMLDataFunc = - (CFPropertyListCreateFromXMLDataFuncTy)dlsym( - RTLD_DEFAULT, "CFPropertyListCreateFromXMLData"); -#pragma clang diagnostic pop - /* CFPropertyListCreateFromXMLDataFunc is deprecated in macOS 10.10, so it - * might be NULL in future OS versions. */ - if (!CFPropertyListCreateWithDataFunc && !CFPropertyListCreateFromXMLDataFunc) - return; - CFStringCreateWithCStringNoCopyFuncTy CFStringCreateWithCStringNoCopyFunc = - (CFStringCreateWithCStringNoCopyFuncTy)dlsym( - RTLD_DEFAULT, "CFStringCreateWithCStringNoCopy"); - if (!CFStringCreateWithCStringNoCopyFunc) - return; - CFDictionaryGetValueFuncTy CFDictionaryGetValueFunc = - (CFDictionaryGetValueFuncTy)dlsym(RTLD_DEFAULT, "CFDictionaryGetValue"); - if (!CFDictionaryGetValueFunc) - return; - CFGetTypeIDFuncTy CFGetTypeIDFunc = - (CFGetTypeIDFuncTy)dlsym(RTLD_DEFAULT, "CFGetTypeID"); - if (!CFGetTypeIDFunc) - return; - CFStringGetTypeIDFuncTy CFStringGetTypeIDFunc = - (CFStringGetTypeIDFuncTy)dlsym(RTLD_DEFAULT, "CFStringGetTypeID"); - if (!CFStringGetTypeIDFunc) - return; - CFStringGetCStringFuncTy CFStringGetCStringFunc = - (CFStringGetCStringFuncTy)dlsym(RTLD_DEFAULT, "CFStringGetCString"); - if (!CFStringGetCStringFunc) - return; - CFReleaseFuncTy CFReleaseFunc = - (CFReleaseFuncTy)dlsym(RTLD_DEFAULT, "CFRelease"); - if (!CFReleaseFunc) - return; - - char *PListPath = "/System/Library/CoreServices/SystemVersion.plist"; - -#if TARGET_OS_SIMULATOR - char *PListPathPrefix = getenv("IPHONE_SIMULATOR_ROOT"); - if (!PListPathPrefix) - return; - char FullPath[strlen(PListPathPrefix) + strlen(PListPath) + 1]; - strcpy(FullPath, PListPathPrefix); - strcat(FullPath, PListPath); - PListPath = FullPath; -#endif - FILE *PropertyList = fopen(PListPath, "r"); - if (!PropertyList) - return; - - /* Dynamically allocated stuff. */ - CFDictionaryRef PListRef = NULL; - CFDataRef FileContentsRef = NULL; - UInt8 *PListBuf = NULL; - - fseek(PropertyList, 0, SEEK_END); - long PListFileSize = ftell(PropertyList); - if (PListFileSize < 0) - goto Fail; - rewind(PropertyList); - - PListBuf = malloc((size_t)PListFileSize); - if (!PListBuf) - goto Fail; - - size_t NumRead = fread(PListBuf, 1, (size_t)PListFileSize, PropertyList); - if (NumRead != (size_t)PListFileSize) - goto Fail; - - /* Get the file buffer into CF's format. We pass in a null allocator here * - * because we free PListBuf ourselves */ - FileContentsRef = (*CFDataCreateWithBytesNoCopyFunc)( - NULL, PListBuf, (CFIndex)NumRead, AllocatorNull); - if (!FileContentsRef) - goto Fail; - - if (CFPropertyListCreateWithDataFunc) - PListRef = (*CFPropertyListCreateWithDataFunc)( - NULL, FileContentsRef, CF_PROPERTY_LIST_IMMUTABLE, NULL, NULL); - else - PListRef = (*CFPropertyListCreateFromXMLDataFunc)( - NULL, FileContentsRef, CF_PROPERTY_LIST_IMMUTABLE, NULL); - if (!PListRef) - goto Fail; - - CFStringRef ProductVersion = (*CFStringCreateWithCStringNoCopyFunc)( - NULL, "ProductVersion", CF_STRING_ENCODING_ASCII, AllocatorNull); - if (!ProductVersion) - goto Fail; - CFTypeRef OpaqueValue = (*CFDictionaryGetValueFunc)(PListRef, ProductVersion); - (*CFReleaseFunc)(ProductVersion); - if (!OpaqueValue || - (*CFGetTypeIDFunc)(OpaqueValue) != (*CFStringGetTypeIDFunc)()) - goto Fail; - - char VersionStr[32]; - if (!(*CFStringGetCStringFunc)((CFStringRef)OpaqueValue, VersionStr, - sizeof(VersionStr), CF_STRING_ENCODING_UTF8)) - goto Fail; - sscanf(VersionStr, "%d.%d.%d", &GlobalMajor, &GlobalMinor, &GlobalSubminor); - -Fail: - if (PListRef) - (*CFReleaseFunc)(PListRef); - if (FileContentsRef) - (*CFReleaseFunc)(FileContentsRef); - free(PListBuf); - fclose(PropertyList); -} - + /* Load CoreFoundation dynamically */ + const void *NullAllocator = dlsym(RTLD_DEFAULT, "kCFAllocatorNull"); + if (!NullAllocator) + return; + const CFAllocatorRef AllocatorNull = *(const CFAllocatorRef *)NullAllocator; + CFDataCreateWithBytesNoCopyFuncTy CFDataCreateWithBytesNoCopyFunc = + (CFDataCreateWithBytesNoCopyFuncTy)dlsym(RTLD_DEFAULT, + "CFDataCreateWithBytesNoCopy"); + if (!CFDataCreateWithBytesNoCopyFunc) + return; + CFPropertyListCreateWithDataFuncTy CFPropertyListCreateWithDataFunc = + (CFPropertyListCreateWithDataFuncTy)dlsym( + RTLD_DEFAULT, "CFPropertyListCreateWithData"); +/* CFPropertyListCreateWithData was introduced only in macOS 10.6+, so it + * will be NULL on earlier OS versions. */ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + CFPropertyListCreateFromXMLDataFuncTy CFPropertyListCreateFromXMLDataFunc = + (CFPropertyListCreateFromXMLDataFuncTy)dlsym( + RTLD_DEFAULT, "CFPropertyListCreateFromXMLData"); +#pragma clang diagnostic pop + /* CFPropertyListCreateFromXMLDataFunc is deprecated in macOS 10.10, so it + * might be NULL in future OS versions. */ + if (!CFPropertyListCreateWithDataFunc && !CFPropertyListCreateFromXMLDataFunc) + return; + CFStringCreateWithCStringNoCopyFuncTy CFStringCreateWithCStringNoCopyFunc = + (CFStringCreateWithCStringNoCopyFuncTy)dlsym( + RTLD_DEFAULT, "CFStringCreateWithCStringNoCopy"); + if (!CFStringCreateWithCStringNoCopyFunc) + return; + CFDictionaryGetValueFuncTy CFDictionaryGetValueFunc = + (CFDictionaryGetValueFuncTy)dlsym(RTLD_DEFAULT, "CFDictionaryGetValue"); + if (!CFDictionaryGetValueFunc) + return; + CFGetTypeIDFuncTy CFGetTypeIDFunc = + (CFGetTypeIDFuncTy)dlsym(RTLD_DEFAULT, "CFGetTypeID"); + if (!CFGetTypeIDFunc) + return; + CFStringGetTypeIDFuncTy CFStringGetTypeIDFunc = + (CFStringGetTypeIDFuncTy)dlsym(RTLD_DEFAULT, "CFStringGetTypeID"); + if (!CFStringGetTypeIDFunc) + return; + CFStringGetCStringFuncTy CFStringGetCStringFunc = + (CFStringGetCStringFuncTy)dlsym(RTLD_DEFAULT, "CFStringGetCString"); + if (!CFStringGetCStringFunc) + return; + CFReleaseFuncTy CFReleaseFunc = + (CFReleaseFuncTy)dlsym(RTLD_DEFAULT, "CFRelease"); + if (!CFReleaseFunc) + return; + + char *PListPath = "/System/Library/CoreServices/SystemVersion.plist"; + +#if TARGET_OS_SIMULATOR + char *PListPathPrefix = getenv("IPHONE_SIMULATOR_ROOT"); + if (!PListPathPrefix) + return; + char FullPath[strlen(PListPathPrefix) + strlen(PListPath) + 1]; + strcpy(FullPath, PListPathPrefix); + strcat(FullPath, PListPath); + PListPath = FullPath; +#endif + FILE *PropertyList = fopen(PListPath, "r"); + if (!PropertyList) + return; + + /* Dynamically allocated stuff. */ + CFDictionaryRef PListRef = NULL; + CFDataRef FileContentsRef = NULL; + UInt8 *PListBuf = NULL; + + fseek(PropertyList, 0, SEEK_END); + long PListFileSize = ftell(PropertyList); + if (PListFileSize < 0) + goto Fail; + rewind(PropertyList); + + PListBuf = malloc((size_t)PListFileSize); + if (!PListBuf) + goto Fail; + + size_t NumRead = fread(PListBuf, 1, (size_t)PListFileSize, PropertyList); + if (NumRead != (size_t)PListFileSize) + goto Fail; + + /* Get the file buffer into CF's format. We pass in a null allocator here * + * because we free PListBuf ourselves */ + FileContentsRef = (*CFDataCreateWithBytesNoCopyFunc)( + NULL, PListBuf, (CFIndex)NumRead, AllocatorNull); + if (!FileContentsRef) + goto Fail; + + if (CFPropertyListCreateWithDataFunc) + PListRef = (*CFPropertyListCreateWithDataFunc)( + NULL, FileContentsRef, CF_PROPERTY_LIST_IMMUTABLE, NULL, NULL); + else + PListRef = (*CFPropertyListCreateFromXMLDataFunc)( + NULL, FileContentsRef, CF_PROPERTY_LIST_IMMUTABLE, NULL); + if (!PListRef) + goto Fail; + + CFStringRef ProductVersion = (*CFStringCreateWithCStringNoCopyFunc)( + NULL, "ProductVersion", CF_STRING_ENCODING_ASCII, AllocatorNull); + if (!ProductVersion) + goto Fail; + CFTypeRef OpaqueValue = (*CFDictionaryGetValueFunc)(PListRef, ProductVersion); + (*CFReleaseFunc)(ProductVersion); + if (!OpaqueValue || + (*CFGetTypeIDFunc)(OpaqueValue) != (*CFStringGetTypeIDFunc)()) + goto Fail; + + char VersionStr[32]; + if (!(*CFStringGetCStringFunc)((CFStringRef)OpaqueValue, VersionStr, + sizeof(VersionStr), CF_STRING_ENCODING_UTF8)) + goto Fail; + sscanf(VersionStr, "%d.%d.%d", &GlobalMajor, &GlobalMinor, &GlobalSubminor); + +Fail: + if (PListRef) + (*CFReleaseFunc)(PListRef); + if (FileContentsRef) + (*CFReleaseFunc)(FileContentsRef); + free(PListBuf); + fclose(PropertyList); +} + // This old API entry point is no longer used by Clang. We still need to keep it // around to ensure that object files that reference it are still usable when // linked with new compiler-rt. -int32_t __isOSVersionAtLeast(int32_t Major, int32_t Minor, int32_t Subminor) { - /* Populate the global version variables, if they haven't already. */ +int32_t __isOSVersionAtLeast(int32_t Major, int32_t Minor, int32_t Subminor) { + /* Populate the global version variables, if they haven't already. */ dispatch_once_f(&DispatchOnceCounter, NULL, initializeAvailabilityCheck); - - if (Major < GlobalMajor) - return 1; - if (Major > GlobalMajor) - return 0; - if (Minor < GlobalMinor) - return 1; - if (Minor > GlobalMinor) - return 0; - return Subminor <= GlobalSubminor; -} - + + if (Major < GlobalMajor) + return 1; + if (Major > GlobalMajor) + return 0; + if (Minor < GlobalMinor) + return 1; + if (Minor > GlobalMinor) + return 0; + return Subminor <= GlobalSubminor; +} + static inline uint32_t ConstructVersion(uint32_t Major, uint32_t Minor, uint32_t Subminor) { return ((Major & 0xffff) << 16) | ((Minor & 0xff) << 8) | (Subminor & 0xff); @@ -258,9 +258,9 @@ int32_t __isPlatformVersionAtLeast(uint32_t Platform, uint32_t Major, return AvailabilityVersionCheck(1, Versions); } -#else - -/* Silence an empty translation unit warning. */ -typedef int unused; - -#endif +#else + +/* Silence an empty translation unit warning. */ +typedef int unused; + +#endif diff --git a/contrib/libs/cxxsupp/builtins/ya.make b/contrib/libs/cxxsupp/builtins/ya.make index d2c319c927..dc3c2c326b 100644 --- a/contrib/libs/cxxsupp/builtins/ya.make +++ b/contrib/libs/cxxsupp/builtins/ya.make @@ -11,22 +11,22 @@ LIBRARY() LICENSE( Apache-2.0 AND - Apache-2.0 WITH LLVM-exception AND - MIT AND - NCSA + Apache-2.0 WITH LLVM-exception AND + MIT AND + NCSA ) -LICENSE_TEXTS(.yandex_meta/licenses.list.txt) - +LICENSE_TEXTS(.yandex_meta/licenses.list.txt) + VERSION(2016-03-03-08f0372c351a57b01afee6c64066961203da28c5) ORIGINAL_SOURCE(https://github.com/llvm/llvm-project) OWNER( - pg - somov - g:contrib - g:cpp-contrib + pg + somov + g:contrib + g:cpp-contrib ) # Check MUSL before NO_PLATFORM() disables it. @@ -44,11 +44,11 @@ IF (MUSL) ENDIF() NO_UTIL() - + NO_RUNTIME() - + NO_PLATFORM() - + NO_COMPILER_WARNINGS() IF (GCC OR CLANG) @@ -82,7 +82,7 @@ SRCS( fixunssfti.c fixunstfdi.c fixunstfsi.c - fixunstfti.c + fixunstfti.c fixunsxfti.c floatditf.c floatsitf.c @@ -111,11 +111,11 @@ SRCS( ) IF (OS_DARWIN OR OS_IOS) - SRCS( - os_version_check.c - ) -ENDIF() - + SRCS( + os_version_check.c + ) +ENDIF() + IF (ARCH_ARM) SRCS( clear_cache.c diff --git a/contrib/libs/cxxsupp/libcxx/.yandex_meta/devtools.copyrights.report b/contrib/libs/cxxsupp/libcxx/.yandex_meta/devtools.copyrights.report index 59ae986224..e5b18cf6f6 100644 --- a/contrib/libs/cxxsupp/libcxx/.yandex_meta/devtools.copyrights.report +++ b/contrib/libs/cxxsupp/libcxx/.yandex_meta/devtools.copyrights.report @@ -1,70 +1,70 @@ -# File format ($ symbol means the beginning of a line): -# -# $ # this message -# $ # ======================= -# $ # comments (all commentaries should starts with some number of spaces and # symbol) -# ${action} {license id} {license text hash} -# $BELONGS ./ya/make/file/relative/path/1/ya.make ./ya/make/2/ya.make -# ${all_file_action} filename -# $ # user commentaries (many lines) -# $ generated description - files with this license, license text... (some number of lines that starts with some number of spaces, do not modify) -# ${action} {license spdx} {license text hash} -# $BELONGS ./ya/make/file/relative/path/3/ya.make -# ${all_file_action} filename -# $ # user commentaries -# $ generated description -# $ ... -# -# You can modify action, all_file_action and add commentaries -# Available actions: -# keep - keep license in contrib and use in credits -# skip - skip license -# remove - remove all files with this license -# rename - save license text/links into licenses texts file, but not store SPDX into LINCENSE macro. You should store correct license id into devtools.license.spdx.txt file -# -# {all file action} records will be generated when license text contains filename that exists on filesystem (in contrib directory) -# We suppose that that files can contain some license info -# Available all file actions: -# FILE_IGNORE - ignore file (do nothing) -# FILE_INCLUDE - include all file data into licenses text file -# ======================= - -KEEP COPYRIGHT_SERVICE_LABEL 7e6a182a2f65f965d96f2755976c1829 +# File format ($ symbol means the beginning of a line): +# +# $ # this message +# $ # ======================= +# $ # comments (all commentaries should starts with some number of spaces and # symbol) +# ${action} {license id} {license text hash} +# $BELONGS ./ya/make/file/relative/path/1/ya.make ./ya/make/2/ya.make +# ${all_file_action} filename +# $ # user commentaries (many lines) +# $ generated description - files with this license, license text... (some number of lines that starts with some number of spaces, do not modify) +# ${action} {license spdx} {license text hash} +# $BELONGS ./ya/make/file/relative/path/3/ya.make +# ${all_file_action} filename +# $ # user commentaries +# $ generated description +# $ ... +# +# You can modify action, all_file_action and add commentaries +# Available actions: +# keep - keep license in contrib and use in credits +# skip - skip license +# remove - remove all files with this license +# rename - save license text/links into licenses texts file, but not store SPDX into LINCENSE macro. You should store correct license id into devtools.license.spdx.txt file +# +# {all file action} records will be generated when license text contains filename that exists on filesystem (in contrib directory) +# We suppose that that files can contain some license info +# Available all file actions: +# FILE_IGNORE - ignore file (do nothing) +# FILE_INCLUDE - include all file data into licenses text file +# ======================= + +KEEP COPYRIGHT_SERVICE_LABEL 7e6a182a2f65f965d96f2755976c1829 BELONGS ya.make - License text: - * FreeBSD libc. These are covered by the following copyright: - * - * Copyright (c) 2002-2004 Tim J. Robbins. - Scancode info: - Original SPDX id: COPYRIGHT_SERVICE_LABEL - Score : 100.00 - Match type : COPYRIGHT - Files with this license: + License text: + * FreeBSD libc. These are covered by the following copyright: + * + * Copyright (c) 2002-2004 Tim J. Robbins. + Scancode info: + Original SPDX id: COPYRIGHT_SERVICE_LABEL + Score : 100.00 + Match type : COPYRIGHT + Files with this license: src/support/solaris/mbsnrtowcs.inc [5:7] src/support/solaris/wcsnrtombs.inc [2:2] - -KEEP COPYRIGHT_SERVICE_LABEL ebc015cad7377d32e7b2fc0ae5293aa1 + +KEEP COPYRIGHT_SERVICE_LABEL ebc015cad7377d32e7b2fc0ae5293aa1 BELONGS ya.make FILE_INCLUDE CREDITS.TXT found in files: LICENSE.TXT at line 252 - # libcxxabi/CREDITS.TXT included in libcxxabi - License text: - Copyright (c) 2009-2019 by the contributors listed in CREDITS.TXT - Scancode info: - Original SPDX id: COPYRIGHT_SERVICE_LABEL - Score : 100.00 - Match type : COPYRIGHT - Files with this license: + # libcxxabi/CREDITS.TXT included in libcxxabi + License text: + Copyright (c) 2009-2019 by the contributors listed in CREDITS.TXT + Scancode info: + Original SPDX id: COPYRIGHT_SERVICE_LABEL + Score : 100.00 + Match type : COPYRIGHT + Files with this license: LICENSE.TXT [252:252] - -KEEP COPYRIGHT_SERVICE_LABEL f52c727d32a7eaf5a8de6bc96b82797c + +KEEP COPYRIGHT_SERVICE_LABEL f52c727d32a7eaf5a8de6bc96b82797c BELONGS ya.make FILE_INCLUDE CREDITS.TXT found in files: LICENSE.TXT at line 293 - # libcxxabi/CREDITS.TXT included in libcxxabi - License text: - Copyright (c) 2009-2014 by the contributors listed in CREDITS.TXT - Scancode info: - Original SPDX id: COPYRIGHT_SERVICE_LABEL - Score : 100.00 - Match type : COPYRIGHT - Files with this license: + # libcxxabi/CREDITS.TXT included in libcxxabi + License text: + Copyright (c) 2009-2014 by the contributors listed in CREDITS.TXT + Scancode info: + Original SPDX id: COPYRIGHT_SERVICE_LABEL + Score : 100.00 + Match type : COPYRIGHT + Files with this license: LICENSE.TXT [293:293] diff --git a/contrib/libs/cxxsupp/libcxx/.yandex_meta/devtools.licenses.report b/contrib/libs/cxxsupp/libcxx/.yandex_meta/devtools.licenses.report index 179b442913..f8513ee004 100644 --- a/contrib/libs/cxxsupp/libcxx/.yandex_meta/devtools.licenses.report +++ b/contrib/libs/cxxsupp/libcxx/.yandex_meta/devtools.licenses.report @@ -1,108 +1,108 @@ -# File format ($ symbol means the beginning of a line): -# -# $ # this message -# $ # ======================= -# $ # comments (all commentaries should starts with some number of spaces and # symbol) -# ${action} {license spdx} {license text hash} -# $BELONGS ./ya/make/file/relative/path/1/ya.make ./ya/make/2/ya.make -# ${all_file_action} filename -# $ # user commentaries (many lines) -# $ generated description - files with this license, license text... (some number of lines that starts with some number of spaces, do not modify) -# ${action} {license spdx} {license text hash} -# $BELONGS ./ya/make/file/relative/path/3/ya.make -# ${all_file_action} filename -# $ # user commentaries -# $ generated description -# $ ... -# -# You can modify action, all_file_action and add commentaries -# Available actions: -# keep - keep license in contrib and use in credits -# skip - skip license -# remove - remove all files with this license -# rename - save license text/links into licenses texts file, but not store SPDX into LINCENSE macro. You should store correct license id into devtools.license.spdx.txt file -# -# {all file action} records will be generated when license text contains filename that exists on filesystem (in contrib directory) -# We suppose that that files can contain some license info -# Available all file actions: -# FILE_IGNORE - ignore file (do nothing) -# FILE_INCLUDE - include all file data into licenses text file -# ======================= - -KEEP NCSA AND MIT 1f7e00acb6cda5de868d4d4c1ffe3c2b +# File format ($ symbol means the beginning of a line): +# +# $ # this message +# $ # ======================= +# $ # comments (all commentaries should starts with some number of spaces and # symbol) +# ${action} {license spdx} {license text hash} +# $BELONGS ./ya/make/file/relative/path/1/ya.make ./ya/make/2/ya.make +# ${all_file_action} filename +# $ # user commentaries (many lines) +# $ generated description - files with this license, license text... (some number of lines that starts with some number of spaces, do not modify) +# ${action} {license spdx} {license text hash} +# $BELONGS ./ya/make/file/relative/path/3/ya.make +# ${all_file_action} filename +# $ # user commentaries +# $ generated description +# $ ... +# +# You can modify action, all_file_action and add commentaries +# Available actions: +# keep - keep license in contrib and use in credits +# skip - skip license +# remove - remove all files with this license +# rename - save license text/links into licenses texts file, but not store SPDX into LINCENSE macro. You should store correct license id into devtools.license.spdx.txt file +# +# {all file action} records will be generated when license text contains filename that exists on filesystem (in contrib directory) +# We suppose that that files can contain some license info +# Available all file actions: +# FILE_IGNORE - ignore file (do nothing) +# FILE_INCLUDE - include all file data into licenses text file +# ======================= + +KEEP NCSA AND MIT 1f7e00acb6cda5de868d4d4c1ffe3c2b BELONGS ya.make - Note: matched license text is too long. Read it in the source files. - Scancode info: - Original SPDX id: NCSA - Score : 100.00 - Match type : NOTICE - Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA - Files with this license: + Note: matched license text is too long. Read it in the source files. + Scancode info: + Original SPDX id: NCSA + Score : 100.00 + Match type : NOTICE + Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA + Files with this license: LICENSE.TXT [240:245] - Scancode info: - Original SPDX id: MIT - Score : 100.00 - Match type : NOTICE - Links : http://opensource.org/licenses/mit-license.php, https://spdx.org/licenses/MIT - Files with this license: + Scancode info: + Original SPDX id: MIT + Score : 100.00 + Match type : NOTICE + Links : http://opensource.org/licenses/mit-license.php, https://spdx.org/licenses/MIT + Files with this license: LICENSE.TXT [240:245] - -KEEP NCSA 5a35b4c0d3b3923cac31a5a371332ca2 + +KEEP NCSA 5a35b4c0d3b3923cac31a5a371332ca2 BELONGS ya.make - License text: - Legacy LLVM License (https://llvm.org/docs/DeveloperPolicy.html#legacy): - Scancode info: - Original SPDX id: NCSA - Score : 100.00 - Match type : REFERENCE - Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA - Files with this license: + License text: + Legacy LLVM License (https://llvm.org/docs/DeveloperPolicy.html#legacy): + Scancode info: + Original SPDX id: NCSA + Score : 100.00 + Match type : REFERENCE + Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA + Files with this license: LICENSE.TXT [237:237] - -KEEP MIT 5debb370f50e1dfd24ff5144233a2ef6 + +KEEP MIT 5debb370f50e1dfd24ff5144233a2ef6 BELONGS ya.make FILE_INCLUDE include/any found in files: LICENSE.TXT at line 295 - # any - just word, not file reference - Note: matched license text is too long. Read it in the source files. - Scancode info: - Original SPDX id: MIT - Score : 100.00 - Match type : TEXT - Links : http://opensource.org/licenses/mit-license.php, https://spdx.org/licenses/MIT - Files with this license: + # any - just word, not file reference + Note: matched license text is too long. Read it in the source files. + Scancode info: + Original SPDX id: MIT + Score : 100.00 + Match type : TEXT + Links : http://opensource.org/licenses/mit-license.php, https://spdx.org/licenses/MIT + Files with this license: LICENSE.TXT [295:311] - -KEEP Apache-2.0 WITH LLVM-exception 705a75a25bce12b12334e8fc577d8a46 + +KEEP Apache-2.0 WITH LLVM-exception 705a75a25bce12b12334e8fc577d8a46 BELONGS ya.make - License text: - * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. - * See https://llvm.org/LICENSE.txt for license information. - Scancode info: - Original SPDX id: Apache-2.0 - Score : 100.00 - Match type : NOTICE - Links : http://www.apache.org/licenses/, http://www.apache.org/licenses/LICENSE-2.0, https://spdx.org/licenses/Apache-2.0 - Files with this license: + License text: + * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. + * See https://llvm.org/LICENSE.txt for license information. + Scancode info: + Original SPDX id: Apache-2.0 + Score : 100.00 + Match type : NOTICE + Links : http://www.apache.org/licenses/, http://www.apache.org/licenses/LICENSE-2.0, https://spdx.org/licenses/Apache-2.0 + Files with this license: src/filesystem/int128_builtins.cpp [3:4] - Scancode info: - Original SPDX id: LLVM-exception - Score : 100.00 - Match type : NOTICE - Links : http://llvm.org/foundation/relicensing/LICENSE.txt, https://spdx.org/licenses/LLVM-exception - Files with this license: + Scancode info: + Original SPDX id: LLVM-exception + Score : 100.00 + Match type : NOTICE + Links : http://llvm.org/foundation/relicensing/LICENSE.txt, https://spdx.org/licenses/LLVM-exception + Files with this license: src/filesystem/int128_builtins.cpp [3:4] - -KEEP Apache-2.0 WITH LLVM-exception 755ab7da3ff8c5d6ae90bdbebd177e49 + +KEEP Apache-2.0 WITH LLVM-exception 755ab7da3ff8c5d6ae90bdbebd177e49 BELONGS ya.make - License text: - // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. - // See https://llvm.org/LICENSE.txt for license information. - Scancode info: - Original SPDX id: Apache-2.0 - Score : 100.00 - Match type : NOTICE - Links : http://www.apache.org/licenses/, http://www.apache.org/licenses/LICENSE-2.0, https://spdx.org/licenses/Apache-2.0 - Files with this license: + License text: + // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. + // See https://llvm.org/LICENSE.txt for license information. + Scancode info: + Original SPDX id: Apache-2.0 + Score : 100.00 + Match type : NOTICE + Links : http://www.apache.org/licenses/, http://www.apache.org/licenses/LICENSE-2.0, https://spdx.org/licenses/Apache-2.0 + Files with this license: include/__algorithm/adjacent_find.h [4:5] include/__algorithm/all_of.h [4:5] include/__algorithm/any_of.h [4:5] @@ -598,12 +598,12 @@ BELONGS ya.make src/valarray.cpp [3:4] src/variant.cpp [3:4] src/vector.cpp [3:4] - Scancode info: - Original SPDX id: LLVM-exception - Score : 100.00 - Match type : NOTICE - Links : http://llvm.org/foundation/relicensing/LICENSE.txt, https://spdx.org/licenses/LLVM-exception - Files with this license: + Scancode info: + Original SPDX id: LLVM-exception + Score : 100.00 + Match type : NOTICE + Links : http://llvm.org/foundation/relicensing/LICENSE.txt, https://spdx.org/licenses/LLVM-exception + Files with this license: include/__algorithm/adjacent_find.h [4:5] include/__algorithm/all_of.h [4:5] include/__algorithm/any_of.h [4:5] @@ -1099,118 +1099,118 @@ BELONGS ya.make src/valarray.cpp [3:4] src/variant.cpp [3:4] src/vector.cpp [3:4] - -KEEP Apache-2.0 WITH LLVM-exception 8494a9caed330d9a4f40e19cce7dc770 + +KEEP Apache-2.0 WITH LLVM-exception 8494a9caed330d9a4f40e19cce7dc770 BELONGS ya.make FILE_INCLUDE include/exception found in files: LICENSE.TXT at line 210 - Note: matched license text is too long. Read it in the source files. - Scancode info: - Original SPDX id: LLVM-exception - Score : 100.00 - Match type : TEXT - Links : http://llvm.org/foundation/relicensing/LICENSE.txt, https://spdx.org/licenses/LLVM-exception - Files with this license: + Note: matched license text is too long. Read it in the source files. + Scancode info: + Original SPDX id: LLVM-exception + Score : 100.00 + Match type : TEXT + Links : http://llvm.org/foundation/relicensing/LICENSE.txt, https://spdx.org/licenses/LLVM-exception + Files with this license: LICENSE.TXT [208:222] - -KEEP Apache-2.0 WITH LLVM-exception 86617d55e1d949711c543404d91f4cea + +KEEP Apache-2.0 WITH LLVM-exception 86617d55e1d949711c543404d91f4cea BELONGS ya.make - License text: - // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception - Scancode info: - Original SPDX id: Apache-2.0 - Score : 100.00 - Match type : TAG - Links : http://www.apache.org/licenses/, http://www.apache.org/licenses/LICENSE-2.0, https://spdx.org/licenses/Apache-2.0 - Files with this license: + License text: + // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + Scancode info: + Original SPDX id: Apache-2.0 + Score : 100.00 + Match type : TAG + Links : http://www.apache.org/licenses/, http://www.apache.org/licenses/LICENSE-2.0, https://spdx.org/licenses/Apache-2.0 + Files with this license: include/experimental/__config [6:6] - Scancode info: - Original SPDX id: LLVM-exception - Score : 100.00 - Match type : TAG - Links : http://llvm.org/foundation/relicensing/LICENSE.txt, https://spdx.org/licenses/LLVM-exception - Files with this license: + Scancode info: + Original SPDX id: LLVM-exception + Score : 100.00 + Match type : TAG + Links : http://llvm.org/foundation/relicensing/LICENSE.txt, https://spdx.org/licenses/LLVM-exception + Files with this license: include/experimental/__config [6:6] - -KEEP Apache-2.0 9ac77f65a898755c7eed97099caded94 + +KEEP Apache-2.0 9ac77f65a898755c7eed97099caded94 BELONGS ya.make FILE_INCLUDE import found in files: LICENSE.TXT at line 81 FILE_INCLUDE include/any found in files: LICENSE.TXT at line 101, LICENSE.TXT at line 104, LICENSE.TXT at line 107, LICENSE.TXT at line 111, LICENSE.TXT at line 114, LICENSE.TXT at line 130, LICENSE.TXT at line 135, LICENSE.TXT at line 137, LICENSE.TXT at line 139, LICENSE.TXT at line 151, LICENSE.TXT at line 154, LICENSE.TXT at line 160, LICENSE.TXT at line 161, LICENSE.TXT at line 162, LICENSE.TXT at line 165, LICENSE.TXT at line 175, LICENSE.TXT at line 176, LICENSE.TXT at line 178, LICENSE.TXT at line 34, LICENSE.TXT at line 44, LICENSE.TXT at line 52, LICENSE.TXT at line 53, LICENSE.TXT at line 58, LICENSE.TXT at line 66, LICENSE.TXT at line 86, LICENSE.TXT at line 89, LICENSE.TXT at line 94, LICENSE.TXT at line 98 FILE_INCLUDE include/format found in files: LICENSE.TXT at line 188 FILE_INCLUDE include/version found in files: LICENSE.TXT at line 53 - # any and version - just words, not file reference - Note: matched license text is too long. Read it in the source files. - Scancode info: - Original SPDX id: Apache-2.0 - Score : 100.00 - Match type : TEXT - Links : http://www.apache.org/licenses/, http://www.apache.org/licenses/LICENSE-2.0, https://spdx.org/licenses/Apache-2.0 - Files with this license: + # any and version - just words, not file reference + Note: matched license text is too long. Read it in the source files. + Scancode info: + Original SPDX id: Apache-2.0 + Score : 100.00 + Match type : TEXT + Links : http://www.apache.org/licenses/, http://www.apache.org/licenses/LICENSE-2.0, https://spdx.org/licenses/Apache-2.0 + Files with this license: LICENSE.TXT [5:205] - -KEEP NCSA b160d8bd561da097b0edd40b062e1c84 + +KEEP NCSA b160d8bd561da097b0edd40b062e1c84 BELONGS ya.make FILE_INCLUDE include/any found in files: LICENSE.TXT at line 264 FILE_INCLUDE include/experimental/list found in files: LICENSE.TXT at line 272, LICENSE.TXT at line 275 FILE_INCLUDE include/list found in files: LICENSE.TXT at line 272, LICENSE.TXT at line 275 - # any and list - just words, not file reference - Note: matched license text is too long. Read it in the source files. - Scancode info: - Original SPDX id: NCSA - Score : 100.00 - Match type : TEXT - Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA - Files with this license: + # any and list - just words, not file reference + Note: matched license text is too long. Read it in the source files. + Scancode info: + Original SPDX id: NCSA + Score : 100.00 + Match type : TEXT + Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA + Files with this license: LICENSE.TXT [264:289] - -KEEP BSD-2-Clause AND MIT b1ce5ac90fd7360272c132242b0d10e9 + +KEEP BSD-2-Clause AND MIT b1ce5ac90fd7360272c132242b0d10e9 BELONGS ya.make - License text: - 2-clause BSD license instead of the MIT/UUIC license that the rest of libc++ is - Scancode info: - Original SPDX id: BSD-2-Clause - Score : 100.00 - Match type : REFERENCE - Links : http://opensource.org/licenses/bsd-license.php, http://www.opensource.org/licenses/BSD-2-Clause, https://spdx.org/licenses/BSD-2-Clause - Files with this license: + License text: + 2-clause BSD license instead of the MIT/UUIC license that the rest of libc++ is + Scancode info: + Original SPDX id: BSD-2-Clause + Score : 100.00 + Match type : REFERENCE + Links : http://opensource.org/licenses/bsd-license.php, http://www.opensource.org/licenses/BSD-2-Clause, https://spdx.org/licenses/BSD-2-Clause + Files with this license: src/support/solaris/README [3:3] - Scancode info: - Original SPDX id: MIT - Score : 75.00 - Match type : REFERENCE - Links : http://opensource.org/licenses/mit-license.php, https://spdx.org/licenses/MIT - Files with this license: + Scancode info: + Original SPDX id: MIT + Score : 75.00 + Match type : REFERENCE + Links : http://opensource.org/licenses/mit-license.php, https://spdx.org/licenses/MIT + Files with this license: src/support/solaris/README [3:3] - -KEEP Apache-2.0 WITH LLVM-exception b4f32daeb289687c0be6afeacb7df231 + +KEEP Apache-2.0 WITH LLVM-exception b4f32daeb289687c0be6afeacb7df231 BELONGS ya.make - License text: - // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. - // See https://llvm.org/LICENSE.txt for license information. - Scancode info: - Original SPDX id: Apache-2.0 - Score : 100.00 - Match type : NOTICE - Links : http://www.apache.org/licenses/, http://www.apache.org/licenses/LICENSE-2.0, https://spdx.org/licenses/Apache-2.0 - Files with this license: + License text: + // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. + // See https://llvm.org/LICENSE.txt for license information. + Scancode info: + Original SPDX id: Apache-2.0 + Score : 100.00 + Match type : NOTICE + Links : http://www.apache.org/licenses/, http://www.apache.org/licenses/LICENSE-2.0, https://spdx.org/licenses/Apache-2.0 + Files with this license: include/experimental/__config [4:5] - Scancode info: - Original SPDX id: LLVM-exception - Score : 100.00 - Match type : NOTICE - Links : http://llvm.org/foundation/relicensing/LICENSE.txt, https://spdx.org/licenses/LLVM-exception - Files with this license: + Scancode info: + Original SPDX id: LLVM-exception + Score : 100.00 + Match type : NOTICE + Links : http://llvm.org/foundation/relicensing/LICENSE.txt, https://spdx.org/licenses/LLVM-exception + Files with this license: include/experimental/__config [4:5] - -KEEP Apache-2.0 WITH LLVM-exception b7566a1930e050e1090162bf1d543650 + +KEEP Apache-2.0 WITH LLVM-exception b7566a1930e050e1090162bf1d543650 BELONGS ya.make - License text: - // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception - Scancode info: - Original SPDX id: Apache-2.0 - Score : 100.00 - Match type : TAG - Links : http://www.apache.org/licenses/, http://www.apache.org/licenses/LICENSE-2.0, https://spdx.org/licenses/Apache-2.0 - Files with this license: + License text: + // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + Scancode info: + Original SPDX id: Apache-2.0 + Score : 100.00 + Match type : TAG + Links : http://www.apache.org/licenses/, http://www.apache.org/licenses/LICENSE-2.0, https://spdx.org/licenses/Apache-2.0 + Files with this license: include/__algorithm/adjacent_find.h [6:6] include/__algorithm/all_of.h [6:6] include/__algorithm/any_of.h [6:6] @@ -1706,12 +1706,12 @@ BELONGS ya.make src/valarray.cpp [5:5] src/variant.cpp [5:5] src/vector.cpp [5:5] - Scancode info: - Original SPDX id: LLVM-exception - Score : 100.00 - Match type : TAG - Links : http://llvm.org/foundation/relicensing/LICENSE.txt, https://spdx.org/licenses/LLVM-exception - Files with this license: + Scancode info: + Original SPDX id: LLVM-exception + Score : 100.00 + Match type : TAG + Links : http://llvm.org/foundation/relicensing/LICENSE.txt, https://spdx.org/licenses/LLVM-exception + Files with this license: include/__algorithm/adjacent_find.h [6:6] include/__algorithm/all_of.h [6:6] include/__algorithm/any_of.h [6:6] @@ -2207,82 +2207,82 @@ BELONGS ya.make src/valarray.cpp [5:5] src/variant.cpp [5:5] src/vector.cpp [5:5] - -KEEP Apache-2.0 WITH LLVM-exception c1e6c6536fcc444f916047679115c618 + +KEEP Apache-2.0 WITH LLVM-exception c1e6c6536fcc444f916047679115c618 BELONGS ya.make - License text: - * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception - Scancode info: - Original SPDX id: Apache-2.0 - Score : 100.00 - Match type : TAG - Links : http://www.apache.org/licenses/, http://www.apache.org/licenses/LICENSE-2.0, https://spdx.org/licenses/Apache-2.0 - Files with this license: + License text: + * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + Scancode info: + Original SPDX id: Apache-2.0 + Score : 100.00 + Match type : TAG + Links : http://www.apache.org/licenses/, http://www.apache.org/licenses/LICENSE-2.0, https://spdx.org/licenses/Apache-2.0 + Files with this license: src/filesystem/int128_builtins.cpp [5:5] - Scancode info: - Original SPDX id: LLVM-exception - Score : 100.00 - Match type : TAG - Links : http://llvm.org/foundation/relicensing/LICENSE.txt, https://spdx.org/licenses/LLVM-exception - Files with this license: + Scancode info: + Original SPDX id: LLVM-exception + Score : 100.00 + Match type : TAG + Links : http://llvm.org/foundation/relicensing/LICENSE.txt, https://spdx.org/licenses/LLVM-exception + Files with this license: src/filesystem/int128_builtins.cpp [5:5] - -KEEP NCSA c26d0b72f92421989c4471ae0acbc943 + +KEEP NCSA c26d0b72f92421989c4471ae0acbc943 BELONGS ya.make - License text: - University of Illinois/NCSA - Open Source License - Scancode info: - Original SPDX id: NCSA - Score : 100.00 - Match type : REFERENCE - Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA - Files with this license: + License text: + University of Illinois/NCSA + Open Source License + Scancode info: + Original SPDX id: NCSA + Score : 100.00 + Match type : REFERENCE + Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA + Files with this license: LICENSE.TXT [249:250] - -SKIP LicenseRef-scancode-unknown-license-reference d4fd839c20b32e384ccf02a801e876d1 + +SKIP LicenseRef-scancode-unknown-license-reference d4fd839c20b32e384ccf02a801e876d1 BELONGS ya.make - # part of bsd-2-clause text - License text: - distributed under. - Scancode info: - Original SPDX id: LicenseRef-scancode-unknown-license-reference - Score : 11.00 - Match type : INTRO - Links : https://github.com/nexB/scancode-toolkit/tree/develop/src/licensedcode/data/licenses/unknown-license-reference.LICENSE - Files with this license: + # part of bsd-2-clause text + License text: + distributed under. + Scancode info: + Original SPDX id: LicenseRef-scancode-unknown-license-reference + Score : 11.00 + Match type : INTRO + Links : https://github.com/nexB/scancode-toolkit/tree/develop/src/licensedcode/data/licenses/unknown-license-reference.LICENSE + Files with this license: src/support/solaris/README [4:4] - -KEEP Apache-2.0 WITH LLVM-exception df18889e552d44a4679aff552267f802 + +KEEP Apache-2.0 WITH LLVM-exception df18889e552d44a4679aff552267f802 BELONGS ya.make - License text: - The LLVM Project is under the Apache License v2.0 with LLVM Exceptions: - Scancode info: - Original SPDX id: Apache-2.0 - Score : 100.00 - Match type : NOTICE - Links : http://www.apache.org/licenses/, http://www.apache.org/licenses/LICENSE-2.0, https://spdx.org/licenses/Apache-2.0 - Files with this license: + License text: + The LLVM Project is under the Apache License v2.0 with LLVM Exceptions: + Scancode info: + Original SPDX id: Apache-2.0 + Score : 100.00 + Match type : NOTICE + Links : http://www.apache.org/licenses/, http://www.apache.org/licenses/LICENSE-2.0, https://spdx.org/licenses/Apache-2.0 + Files with this license: LICENSE.TXT [2:2] - Scancode info: - Original SPDX id: LLVM-exception - Score : 100.00 - Match type : NOTICE - Links : http://llvm.org/foundation/relicensing/LICENSE.txt, https://spdx.org/licenses/LLVM-exception - Files with this license: + Scancode info: + Original SPDX id: LLVM-exception + Score : 100.00 + Match type : NOTICE + Links : http://llvm.org/foundation/relicensing/LICENSE.txt, https://spdx.org/licenses/LLVM-exception + Files with this license: LICENSE.TXT [2:2] - -KEEP BSD-2-Clause f59cebb43ee786218189ac014af76fbb + +KEEP BSD-2-Clause f59cebb43ee786218189ac014af76fbb BELONGS ya.make FILE_INCLUDE include/experimental/list found in files: src/support/solaris/mbsnrtowcs.inc at line 13, src/support/solaris/mbsnrtowcs.inc at line 15, src/support/solaris/wcsnrtombs.inc at line 10, src/support/solaris/wcsnrtombs.inc at line 8 FILE_INCLUDE include/list found in files: src/support/solaris/mbsnrtowcs.inc at line 13, src/support/solaris/mbsnrtowcs.inc at line 15, src/support/solaris/wcsnrtombs.inc at line 10, src/support/solaris/wcsnrtombs.inc at line 8 - # list - just word, not file reference - Note: matched license text is too long. Read it in the source files. - Scancode info: - Original SPDX id: BSD-2-Clause - Score : 100.00 - Match type : TEXT - Links : http://opensource.org/licenses/bsd-license.php, http://www.opensource.org/licenses/BSD-2-Clause, https://spdx.org/licenses/BSD-2-Clause - Files with this license: + # list - just word, not file reference + Note: matched license text is too long. Read it in the source files. + Scancode info: + Original SPDX id: BSD-2-Clause + Score : 100.00 + Match type : TEXT + Links : http://opensource.org/licenses/bsd-license.php, http://www.opensource.org/licenses/BSD-2-Clause, https://spdx.org/licenses/BSD-2-Clause + Files with this license: src/support/solaris/mbsnrtowcs.inc [9:28] src/support/solaris/wcsnrtombs.inc [4:23] diff --git a/contrib/libs/cxxsupp/libcxx/.yandex_meta/licenses.list.txt b/contrib/libs/cxxsupp/libcxx/.yandex_meta/licenses.list.txt index b13eb77e46..634ddee0f3 100644 --- a/contrib/libs/cxxsupp/libcxx/.yandex_meta/licenses.list.txt +++ b/contrib/libs/cxxsupp/libcxx/.yandex_meta/licenses.list.txt @@ -1,481 +1,481 @@ -====================Apache-2.0==================== - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - -====================Apache-2.0 WITH LLVM-exception==================== - * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. - * See https://llvm.org/LICENSE.txt for license information. - - -====================Apache-2.0 WITH LLVM-exception==================== - * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception - - -====================Apache-2.0 WITH LLVM-exception==================== ----- LLVM Exceptions to the Apache 2.0 License ---- - -As an exception, if, as a result of your compiling your source code, portions -of this Software are embedded into an Object form of such source code, you -may redistribute such embedded portions in such Object form without complying -with the conditions of Sections 4(a), 4(b) and 4(d) of the License. - -In addition, if you combine or link compiled forms of this Software with -software that is licensed under the GPLv2 ("Combined Software") and if a -court of competent jurisdiction determines that the patent provision (Section -3), the indemnity provision (Section 9) or other Section of the License -conflicts with the conditions of the GPLv2, you may retroactively and -prospectively choose to deem waived or otherwise exclude such Section(s) of -the License, but only in their entirety and only with respect to the Combined -Software. - - -====================Apache-2.0 WITH LLVM-exception==================== -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. - - -====================Apache-2.0 WITH LLVM-exception==================== -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception - - -====================Apache-2.0 WITH LLVM-exception==================== -The LLVM Project is under the Apache License v2.0 with LLVM Exceptions: - - -====================BSD-2-Clause==================== - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - - -====================BSD-2-Clause AND MIT==================== -2-clause BSD license instead of the MIT/UUIC license that the rest of libc++ is - - -====================COPYRIGHT==================== - * FreeBSD libc. These are covered by the following copyright: - * - * Copyright (c) 2002-2004 Tim J. Robbins. - - -====================COPYRIGHT==================== -Copyright (c) 2009-2014 by the contributors listed in CREDITS.TXT - - -====================COPYRIGHT==================== -Copyright (c) 2009-2019 by the contributors listed in CREDITS.TXT - - +====================Apache-2.0==================== + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +====================Apache-2.0 WITH LLVM-exception==================== + * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. + * See https://llvm.org/LICENSE.txt for license information. + + +====================Apache-2.0 WITH LLVM-exception==================== + * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + + +====================Apache-2.0 WITH LLVM-exception==================== +---- LLVM Exceptions to the Apache 2.0 License ---- + +As an exception, if, as a result of your compiling your source code, portions +of this Software are embedded into an Object form of such source code, you +may redistribute such embedded portions in such Object form without complying +with the conditions of Sections 4(a), 4(b) and 4(d) of the License. + +In addition, if you combine or link compiled forms of this Software with +software that is licensed under the GPLv2 ("Combined Software") and if a +court of competent jurisdiction determines that the patent provision (Section +3), the indemnity provision (Section 9) or other Section of the License +conflicts with the conditions of the GPLv2, you may retroactively and +prospectively choose to deem waived or otherwise exclude such Section(s) of +the License, but only in their entirety and only with respect to the Combined +Software. + + +====================Apache-2.0 WITH LLVM-exception==================== +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. + + +====================Apache-2.0 WITH LLVM-exception==================== +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + + +====================Apache-2.0 WITH LLVM-exception==================== +The LLVM Project is under the Apache License v2.0 with LLVM Exceptions: + + +====================BSD-2-Clause==================== + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + + +====================BSD-2-Clause AND MIT==================== +2-clause BSD license instead of the MIT/UUIC license that the rest of libc++ is + + +====================COPYRIGHT==================== + * FreeBSD libc. These are covered by the following copyright: + * + * Copyright (c) 2002-2004 Tim J. Robbins. + + +====================COPYRIGHT==================== +Copyright (c) 2009-2014 by the contributors listed in CREDITS.TXT + + +====================COPYRIGHT==================== +Copyright (c) 2009-2019 by the contributors listed in CREDITS.TXT + + ====================File: CREDITS.TXT==================== -This file is a partial list of people who have contributed to the LLVM/libc++ -project. If you have contributed a patch or made some other contribution to -LLVM/libc++, please submit a patch to this file to add yourself, and it will be -done! - -The list is sorted by surname and formatted to allow easy grepping and -beautification by scripts. The fields are: name (N), email (E), web-address -(W), PGP key ID and fingerprint (P), description (D), and snail-mail address -(S). - -N: Saleem Abdulrasool -E: compnerd@compnerd.org -D: Minor patches and Linux fixes. - -N: Dan Albert -E: danalbert@google.com -D: Android support and test runner improvements. - -N: Dimitry Andric -E: dimitry@andric.com -D: Visibility fixes, minor FreeBSD portability patches. - -N: Holger Arnold -E: holgerar@gmail.com -D: Minor fix. - -N: David Chisnall -E: theraven at theravensnest dot org -D: FreeBSD and Solaris ports, libcxxrt support, some atomics work. - -N: Marshall Clow -E: mclow.lists@gmail.com -E: marshall@idio.com -D: C++14 support, patches and bug fixes. - -N: Jonathan B Coe -E: jbcoe@me.com -D: Implementation of propagate_const. - +This file is a partial list of people who have contributed to the LLVM/libc++ +project. If you have contributed a patch or made some other contribution to +LLVM/libc++, please submit a patch to this file to add yourself, and it will be +done! + +The list is sorted by surname and formatted to allow easy grepping and +beautification by scripts. The fields are: name (N), email (E), web-address +(W), PGP key ID and fingerprint (P), description (D), and snail-mail address +(S). + +N: Saleem Abdulrasool +E: compnerd@compnerd.org +D: Minor patches and Linux fixes. + +N: Dan Albert +E: danalbert@google.com +D: Android support and test runner improvements. + +N: Dimitry Andric +E: dimitry@andric.com +D: Visibility fixes, minor FreeBSD portability patches. + +N: Holger Arnold +E: holgerar@gmail.com +D: Minor fix. + +N: David Chisnall +E: theraven at theravensnest dot org +D: FreeBSD and Solaris ports, libcxxrt support, some atomics work. + +N: Marshall Clow +E: mclow.lists@gmail.com +E: marshall@idio.com +D: C++14 support, patches and bug fixes. + +N: Jonathan B Coe +E: jbcoe@me.com +D: Implementation of propagate_const. + N: Matthew Dempsky E: matthew@dempsky.org D: Minor patches and bug fixes. -N: Christopher Di Bella -E: cjdb@google.com -E: cjdb.ns@gmail.com -D: Library concepts. - -N: Glen Joseph Fernandes -E: glenjofe@gmail.com -D: Implementation of to_address. - -N: Eric Fiselier -E: eric@efcs.ca -D: LFTS support, patches and bug fixes. - -N: Bill Fisher -E: william.w.fisher@gmail.com -D: Regex bug fixes. - -N: Google Inc. -D: Copyright owner and contributor of the CityHash algorithm - -N: Howard Hinnant -E: hhinnant@apple.com -D: Architect and primary author of libc++ - -N: Sergej Jaskiewicz -E: jaskiewiczs@icloud.com -D: Minor improvements in the testing infrastructure - -N: Hyeon-bin Jeong -E: tuhertz@gmail.com -D: Minor patches and bug fixes. - -N: Argyrios Kyrtzidis -E: kyrtzidis@apple.com -D: Bug fixes. - -N: Bruce Mitchener, Jr. -E: bruce.mitchener@gmail.com -D: Emscripten-related changes. - -N: Michel Morin -E: mimomorin@gmail.com -D: Minor patches to is_convertible. - -N: Andrew Morrow -E: andrew.c.morrow@gmail.com -D: Minor patches and Linux fixes. - -N: Michael Park -E: mcypark@gmail.com -D: Implementation of <variant>. - -N: Arvid Picciani -E: aep at exys dot org -D: Minor patches and musl port. - -N: Bjorn Reese -E: breese@users.sourceforge.net -D: Initial regex prototype - -N: Nico Rieck -E: nico.rieck@gmail.com -D: Windows fixes - -N: Jon Roelofs -E: jroelofS@jroelofs.com -D: Remote testing, Newlib port, baremetal/single-threaded support. - +N: Christopher Di Bella +E: cjdb@google.com +E: cjdb.ns@gmail.com +D: Library concepts. + +N: Glen Joseph Fernandes +E: glenjofe@gmail.com +D: Implementation of to_address. + +N: Eric Fiselier +E: eric@efcs.ca +D: LFTS support, patches and bug fixes. + +N: Bill Fisher +E: william.w.fisher@gmail.com +D: Regex bug fixes. + +N: Google Inc. +D: Copyright owner and contributor of the CityHash algorithm + +N: Howard Hinnant +E: hhinnant@apple.com +D: Architect and primary author of libc++ + +N: Sergej Jaskiewicz +E: jaskiewiczs@icloud.com +D: Minor improvements in the testing infrastructure + +N: Hyeon-bin Jeong +E: tuhertz@gmail.com +D: Minor patches and bug fixes. + +N: Argyrios Kyrtzidis +E: kyrtzidis@apple.com +D: Bug fixes. + +N: Bruce Mitchener, Jr. +E: bruce.mitchener@gmail.com +D: Emscripten-related changes. + +N: Michel Morin +E: mimomorin@gmail.com +D: Minor patches to is_convertible. + +N: Andrew Morrow +E: andrew.c.morrow@gmail.com +D: Minor patches and Linux fixes. + +N: Michael Park +E: mcypark@gmail.com +D: Implementation of <variant>. + +N: Arvid Picciani +E: aep at exys dot org +D: Minor patches and musl port. + +N: Bjorn Reese +E: breese@users.sourceforge.net +D: Initial regex prototype + +N: Nico Rieck +E: nico.rieck@gmail.com +D: Windows fixes + +N: Jon Roelofs +E: jroelofS@jroelofs.com +D: Remote testing, Newlib port, baremetal/single-threaded support. + N: Kent Ross E: k@mad.cash D: Patches for operator<=> support -N: Jonathan Sauer -D: Minor patches, mostly related to constexpr - -N: Craig Silverstein -E: csilvers@google.com -D: Implemented Cityhash as the string hash function on 64-bit machines - -N: Richard Smith -D: Minor patches. - -N: Joerg Sonnenberger -E: joerg@NetBSD.org -D: NetBSD port. - -N: Stephan Tolksdorf -E: st@quanttec.com -D: Minor <atomic> fix - +N: Jonathan Sauer +D: Minor patches, mostly related to constexpr + +N: Craig Silverstein +E: csilvers@google.com +D: Implemented Cityhash as the string hash function on 64-bit machines + +N: Richard Smith +D: Minor patches. + +N: Joerg Sonnenberger +E: joerg@NetBSD.org +D: NetBSD port. + +N: Stephan Tolksdorf +E: st@quanttec.com +D: Minor <atomic> fix + N: Ruben Van Boxem E: vanboxem dot ruben at gmail dot com D: Initial Windows patches. -N: Michael van der Westhuizen -E: r1mikey at gmail dot com - -N: Larisse Voufo -D: Minor patches. - -N: Klaas de Vries -E: klaas at klaasgaaf dot nl -D: Minor bug fix. - -N: Zhang Xiongpang -E: zhangxiongpang@gmail.com -D: Minor patches and bug fixes. - -N: Xing Xue -E: xingxue@ca.ibm.com -D: AIX port - -N: Jeffrey Yasskin -E: jyasskin@gmail.com -E: jyasskin@google.com -D: Linux fixes. - +N: Michael van der Westhuizen +E: r1mikey at gmail dot com + +N: Larisse Voufo +D: Minor patches. + +N: Klaas de Vries +E: klaas at klaasgaaf dot nl +D: Minor bug fix. + +N: Zhang Xiongpang +E: zhangxiongpang@gmail.com +D: Minor patches and bug fixes. + +N: Xing Xue +E: xingxue@ca.ibm.com +D: AIX port + +N: Jeffrey Yasskin +E: jyasskin@gmail.com +E: jyasskin@google.com +D: Linux fixes. + N: Zhihao Yuan E: lichray@gmail.com D: Standard compatibility fixes. - + ====================File: import==================== -#!/bin/sh -e - +#!/bin/sh -e + rev=1e628d0c -output_dir="libcxx-r$rev" -if [ -z $1 ] ; then - git clone https://github.com/llvm/llvm-project.git --no-checkout "$output_dir/tmp" -else - git clone --local --no-checkout $1 "$output_dir/tmp" -fi -cd "$output_dir/tmp" -git checkout "$rev" -cp -R libcxx/include ../include -cp -R libcxx/src ../src -cp libcxx/.clang-format ../.clang-format -cp libcxx/CREDITS.TXT ../CREDITS.TXT -cp libcxx/LICENSE.TXT ../LICENSE.TXT -cd .. -rm -rf tmp -rm src/CMakeLists.txt include/CMakeLists.txt - -# Fix tabs and trailing spaces -find -type f | xargs sed -e 's/\t/ /g' -e 's/ *$//' -i - - +output_dir="libcxx-r$rev" +if [ -z $1 ] ; then + git clone https://github.com/llvm/llvm-project.git --no-checkout "$output_dir/tmp" +else + git clone --local --no-checkout $1 "$output_dir/tmp" +fi +cd "$output_dir/tmp" +git checkout "$rev" +cp -R libcxx/include ../include +cp -R libcxx/src ../src +cp libcxx/.clang-format ../.clang-format +cp libcxx/CREDITS.TXT ../CREDITS.TXT +cp libcxx/LICENSE.TXT ../LICENSE.TXT +cd .. +rm -rf tmp +rm src/CMakeLists.txt include/CMakeLists.txt + +# Fix tabs and trailing spaces +find -type f | xargs sed -e 's/\t/ /g' -e 's/ *$//' -i + + ====================File: include/any==================== -// -*- C++ -*- +// -*- C++ -*- //===------------------------------ any -----------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. @@ -1165,315 +1165,315 @@ _LIBCPP_END_NAMESPACE_STD ====================File: include/exception==================== // -*- C++ -*- -//===-------------------------- exception ---------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#ifndef _LIBCPP_EXCEPTION -#define _LIBCPP_EXCEPTION - -/* - exception synopsis - -namespace std -{ - -class exception -{ -public: - exception() noexcept; - exception(const exception&) noexcept; - exception& operator=(const exception&) noexcept; - virtual ~exception() noexcept; - virtual const char* what() const noexcept; -}; - -class bad_exception - : public exception -{ -public: - bad_exception() noexcept; - bad_exception(const bad_exception&) noexcept; - bad_exception& operator=(const bad_exception&) noexcept; - virtual ~bad_exception() noexcept; - virtual const char* what() const noexcept; -}; - -typedef void (*unexpected_handler)(); -unexpected_handler set_unexpected(unexpected_handler f ) noexcept; -unexpected_handler get_unexpected() noexcept; -[[noreturn]] void unexpected(); - -typedef void (*terminate_handler)(); -terminate_handler set_terminate(terminate_handler f ) noexcept; -terminate_handler get_terminate() noexcept; -[[noreturn]] void terminate() noexcept; - -bool uncaught_exception() noexcept; -int uncaught_exceptions() noexcept; // C++17 - -typedef unspecified exception_ptr; - -exception_ptr current_exception() noexcept; -void rethrow_exception [[noreturn]] (exception_ptr p); -template<class E> exception_ptr make_exception_ptr(E e) noexcept; - -class nested_exception -{ -public: - nested_exception() noexcept; - nested_exception(const nested_exception&) noexcept = default; - nested_exception& operator=(const nested_exception&) noexcept = default; - virtual ~nested_exception() = default; - - // access functions - [[noreturn]] void rethrow_nested() const; - exception_ptr nested_ptr() const noexcept; -}; - -template <class T> [[noreturn]] void throw_with_nested(T&& t); -template <class E> void rethrow_if_nested(const E& e); - -} // std - -*/ - +//===-------------------------- exception ---------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP_EXCEPTION +#define _LIBCPP_EXCEPTION + +/* + exception synopsis + +namespace std +{ + +class exception +{ +public: + exception() noexcept; + exception(const exception&) noexcept; + exception& operator=(const exception&) noexcept; + virtual ~exception() noexcept; + virtual const char* what() const noexcept; +}; + +class bad_exception + : public exception +{ +public: + bad_exception() noexcept; + bad_exception(const bad_exception&) noexcept; + bad_exception& operator=(const bad_exception&) noexcept; + virtual ~bad_exception() noexcept; + virtual const char* what() const noexcept; +}; + +typedef void (*unexpected_handler)(); +unexpected_handler set_unexpected(unexpected_handler f ) noexcept; +unexpected_handler get_unexpected() noexcept; +[[noreturn]] void unexpected(); + +typedef void (*terminate_handler)(); +terminate_handler set_terminate(terminate_handler f ) noexcept; +terminate_handler get_terminate() noexcept; +[[noreturn]] void terminate() noexcept; + +bool uncaught_exception() noexcept; +int uncaught_exceptions() noexcept; // C++17 + +typedef unspecified exception_ptr; + +exception_ptr current_exception() noexcept; +void rethrow_exception [[noreturn]] (exception_ptr p); +template<class E> exception_ptr make_exception_ptr(E e) noexcept; + +class nested_exception +{ +public: + nested_exception() noexcept; + nested_exception(const nested_exception&) noexcept = default; + nested_exception& operator=(const nested_exception&) noexcept = default; + virtual ~nested_exception() = default; + + // access functions + [[noreturn]] void rethrow_nested() const; + exception_ptr nested_ptr() const noexcept; +}; + +template <class T> [[noreturn]] void throw_with_nested(T&& t); +template <class E> void rethrow_if_nested(const E& e); + +} // std + +*/ + #include <__availability> -#include <__config> +#include <__config> #include <__memory/addressof.h> -#include <cstddef> -#include <cstdlib> -#include <type_traits> -#include <version> - -#if defined(_LIBCPP_ABI_VCRUNTIME) -#include <vcruntime_exception.h> -#endif - -#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) -#pragma GCC system_header -#endif - -namespace std // purposefully not using versioning namespace -{ - -#if !defined(_LIBCPP_ABI_VCRUNTIME) -class _LIBCPP_EXCEPTION_ABI exception -{ -public: - _LIBCPP_INLINE_VISIBILITY exception() _NOEXCEPT {} - _LIBCPP_INLINE_VISIBILITY exception(const exception&) _NOEXCEPT = default; - - virtual ~exception() _NOEXCEPT; - virtual const char* what() const _NOEXCEPT; -}; - -class _LIBCPP_EXCEPTION_ABI bad_exception - : public exception -{ -public: - _LIBCPP_INLINE_VISIBILITY bad_exception() _NOEXCEPT {} - virtual ~bad_exception() _NOEXCEPT; - virtual const char* what() const _NOEXCEPT; -}; -#endif // !_LIBCPP_ABI_VCRUNTIME - -#if _LIBCPP_STD_VER <= 14 \ - || defined(_LIBCPP_ENABLE_CXX17_REMOVED_UNEXPECTED_FUNCTIONS) \ - || defined(_LIBCPP_BUILDING_LIBRARY) -typedef void (*unexpected_handler)(); -_LIBCPP_FUNC_VIS unexpected_handler set_unexpected(unexpected_handler) _NOEXCEPT; -_LIBCPP_FUNC_VIS unexpected_handler get_unexpected() _NOEXCEPT; -_LIBCPP_NORETURN _LIBCPP_FUNC_VIS void unexpected(); -#endif - -typedef void (*terminate_handler)(); -_LIBCPP_FUNC_VIS terminate_handler set_terminate(terminate_handler) _NOEXCEPT; -_LIBCPP_FUNC_VIS terminate_handler get_terminate() _NOEXCEPT; -_LIBCPP_NORETURN _LIBCPP_FUNC_VIS void terminate() _NOEXCEPT; - -_LIBCPP_FUNC_VIS bool uncaught_exception() _NOEXCEPT; -_LIBCPP_FUNC_VIS _LIBCPP_AVAILABILITY_UNCAUGHT_EXCEPTIONS int uncaught_exceptions() _NOEXCEPT; - -class _LIBCPP_TYPE_VIS exception_ptr; - -_LIBCPP_FUNC_VIS exception_ptr current_exception() _NOEXCEPT; -_LIBCPP_NORETURN _LIBCPP_FUNC_VIS void rethrow_exception(exception_ptr); - -class _LIBCPP_TYPE_VIS exception_ptr -{ - void* __ptr_; -public: - _LIBCPP_INLINE_VISIBILITY exception_ptr() _NOEXCEPT : __ptr_() {} - _LIBCPP_INLINE_VISIBILITY exception_ptr(nullptr_t) _NOEXCEPT : __ptr_() {} - - exception_ptr(const exception_ptr&) _NOEXCEPT; - exception_ptr& operator=(const exception_ptr&) _NOEXCEPT; - ~exception_ptr() _NOEXCEPT; - +#include <cstddef> +#include <cstdlib> +#include <type_traits> +#include <version> + +#if defined(_LIBCPP_ABI_VCRUNTIME) +#include <vcruntime_exception.h> +#endif + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +namespace std // purposefully not using versioning namespace +{ + +#if !defined(_LIBCPP_ABI_VCRUNTIME) +class _LIBCPP_EXCEPTION_ABI exception +{ +public: + _LIBCPP_INLINE_VISIBILITY exception() _NOEXCEPT {} + _LIBCPP_INLINE_VISIBILITY exception(const exception&) _NOEXCEPT = default; + + virtual ~exception() _NOEXCEPT; + virtual const char* what() const _NOEXCEPT; +}; + +class _LIBCPP_EXCEPTION_ABI bad_exception + : public exception +{ +public: + _LIBCPP_INLINE_VISIBILITY bad_exception() _NOEXCEPT {} + virtual ~bad_exception() _NOEXCEPT; + virtual const char* what() const _NOEXCEPT; +}; +#endif // !_LIBCPP_ABI_VCRUNTIME + +#if _LIBCPP_STD_VER <= 14 \ + || defined(_LIBCPP_ENABLE_CXX17_REMOVED_UNEXPECTED_FUNCTIONS) \ + || defined(_LIBCPP_BUILDING_LIBRARY) +typedef void (*unexpected_handler)(); +_LIBCPP_FUNC_VIS unexpected_handler set_unexpected(unexpected_handler) _NOEXCEPT; +_LIBCPP_FUNC_VIS unexpected_handler get_unexpected() _NOEXCEPT; +_LIBCPP_NORETURN _LIBCPP_FUNC_VIS void unexpected(); +#endif + +typedef void (*terminate_handler)(); +_LIBCPP_FUNC_VIS terminate_handler set_terminate(terminate_handler) _NOEXCEPT; +_LIBCPP_FUNC_VIS terminate_handler get_terminate() _NOEXCEPT; +_LIBCPP_NORETURN _LIBCPP_FUNC_VIS void terminate() _NOEXCEPT; + +_LIBCPP_FUNC_VIS bool uncaught_exception() _NOEXCEPT; +_LIBCPP_FUNC_VIS _LIBCPP_AVAILABILITY_UNCAUGHT_EXCEPTIONS int uncaught_exceptions() _NOEXCEPT; + +class _LIBCPP_TYPE_VIS exception_ptr; + +_LIBCPP_FUNC_VIS exception_ptr current_exception() _NOEXCEPT; +_LIBCPP_NORETURN _LIBCPP_FUNC_VIS void rethrow_exception(exception_ptr); + +class _LIBCPP_TYPE_VIS exception_ptr +{ + void* __ptr_; +public: + _LIBCPP_INLINE_VISIBILITY exception_ptr() _NOEXCEPT : __ptr_() {} + _LIBCPP_INLINE_VISIBILITY exception_ptr(nullptr_t) _NOEXCEPT : __ptr_() {} + + exception_ptr(const exception_ptr&) _NOEXCEPT; + exception_ptr& operator=(const exception_ptr&) _NOEXCEPT; + ~exception_ptr() _NOEXCEPT; + _LIBCPP_INLINE_VISIBILITY explicit operator bool() const _NOEXCEPT - {return __ptr_ != nullptr;} - - friend _LIBCPP_INLINE_VISIBILITY - bool operator==(const exception_ptr& __x, const exception_ptr& __y) _NOEXCEPT - {return __x.__ptr_ == __y.__ptr_;} - - friend _LIBCPP_INLINE_VISIBILITY - bool operator!=(const exception_ptr& __x, const exception_ptr& __y) _NOEXCEPT - {return !(__x == __y);} - - friend _LIBCPP_FUNC_VIS void swap(exception_ptr& __x, exception_ptr& __y) _NOEXCEPT - { - void* __tmp = __x.__ptr_; - __x.__ptr_ = __y.__ptr_; - __y.__ptr_ = __tmp; - } - - friend _LIBCPP_FUNC_VIS exception_ptr current_exception() _NOEXCEPT; - friend _LIBCPP_FUNC_VIS void rethrow_exception(exception_ptr); -}; - -#ifndef _LIBCPP_ABI_MICROSOFT - -template<class _Ep> -_LIBCPP_INLINE_VISIBILITY exception_ptr -make_exception_ptr(_Ep __e) _NOEXCEPT -{ -#ifndef _LIBCPP_NO_EXCEPTIONS - try - { - throw __e; - } - catch (...) - { - return current_exception(); - } -#else - ((void)__e); - _VSTD::abort(); -#endif -} - -#else // _LIBCPP_ABI_MICROSOFT - -_LIBCPP_FUNC_VIS exception_ptr __copy_exception_ptr(void *__exception, const void* __ptr); - -// This is a built-in template function which automagically extracts the required -// information. -template <class _E> void *__GetExceptionInfo(_E); - -template<class _Ep> -exception_ptr -make_exception_ptr(_Ep __e) _NOEXCEPT -{ - return __copy_exception_ptr(_VSTD::addressof(__e), __GetExceptionInfo(__e)); -} - -#endif // _LIBCPP_ABI_MICROSOFT -// nested_exception - -class _LIBCPP_EXCEPTION_ABI nested_exception -{ - exception_ptr __ptr_; -public: - nested_exception() _NOEXCEPT; -// nested_exception(const nested_exception&) noexcept = default; -// nested_exception& operator=(const nested_exception&) noexcept = default; - virtual ~nested_exception() _NOEXCEPT; - - // access functions - _LIBCPP_NORETURN void rethrow_nested() const; - _LIBCPP_INLINE_VISIBILITY exception_ptr nested_ptr() const _NOEXCEPT {return __ptr_;} -}; - -template <class _Tp> -struct __nested - : public _Tp, - public nested_exception -{ - _LIBCPP_INLINE_VISIBILITY explicit __nested(const _Tp& __t) : _Tp(__t) {} -}; - -#ifndef _LIBCPP_NO_EXCEPTIONS -template <class _Tp, class _Up, bool> -struct __throw_with_nested; - -template <class _Tp, class _Up> -struct __throw_with_nested<_Tp, _Up, true> { - _LIBCPP_NORETURN static inline _LIBCPP_INLINE_VISIBILITY void - __do_throw(_Tp&& __t) - { + {return __ptr_ != nullptr;} + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const exception_ptr& __x, const exception_ptr& __y) _NOEXCEPT + {return __x.__ptr_ == __y.__ptr_;} + + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const exception_ptr& __x, const exception_ptr& __y) _NOEXCEPT + {return !(__x == __y);} + + friend _LIBCPP_FUNC_VIS void swap(exception_ptr& __x, exception_ptr& __y) _NOEXCEPT + { + void* __tmp = __x.__ptr_; + __x.__ptr_ = __y.__ptr_; + __y.__ptr_ = __tmp; + } + + friend _LIBCPP_FUNC_VIS exception_ptr current_exception() _NOEXCEPT; + friend _LIBCPP_FUNC_VIS void rethrow_exception(exception_ptr); +}; + +#ifndef _LIBCPP_ABI_MICROSOFT + +template<class _Ep> +_LIBCPP_INLINE_VISIBILITY exception_ptr +make_exception_ptr(_Ep __e) _NOEXCEPT +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { + throw __e; + } + catch (...) + { + return current_exception(); + } +#else + ((void)__e); + _VSTD::abort(); +#endif +} + +#else // _LIBCPP_ABI_MICROSOFT + +_LIBCPP_FUNC_VIS exception_ptr __copy_exception_ptr(void *__exception, const void* __ptr); + +// This is a built-in template function which automagically extracts the required +// information. +template <class _E> void *__GetExceptionInfo(_E); + +template<class _Ep> +exception_ptr +make_exception_ptr(_Ep __e) _NOEXCEPT +{ + return __copy_exception_ptr(_VSTD::addressof(__e), __GetExceptionInfo(__e)); +} + +#endif // _LIBCPP_ABI_MICROSOFT +// nested_exception + +class _LIBCPP_EXCEPTION_ABI nested_exception +{ + exception_ptr __ptr_; +public: + nested_exception() _NOEXCEPT; +// nested_exception(const nested_exception&) noexcept = default; +// nested_exception& operator=(const nested_exception&) noexcept = default; + virtual ~nested_exception() _NOEXCEPT; + + // access functions + _LIBCPP_NORETURN void rethrow_nested() const; + _LIBCPP_INLINE_VISIBILITY exception_ptr nested_ptr() const _NOEXCEPT {return __ptr_;} +}; + +template <class _Tp> +struct __nested + : public _Tp, + public nested_exception +{ + _LIBCPP_INLINE_VISIBILITY explicit __nested(const _Tp& __t) : _Tp(__t) {} +}; + +#ifndef _LIBCPP_NO_EXCEPTIONS +template <class _Tp, class _Up, bool> +struct __throw_with_nested; + +template <class _Tp, class _Up> +struct __throw_with_nested<_Tp, _Up, true> { + _LIBCPP_NORETURN static inline _LIBCPP_INLINE_VISIBILITY void + __do_throw(_Tp&& __t) + { throw __nested<_Up>(static_cast<_Tp&&>(__t)); - } -}; - -template <class _Tp, class _Up> -struct __throw_with_nested<_Tp, _Up, false> { - _LIBCPP_NORETURN static inline _LIBCPP_INLINE_VISIBILITY void -#ifndef _LIBCPP_CXX03_LANG - __do_throw(_Tp&& __t) -#else - __do_throw (_Tp& __t) + } +}; + +template <class _Tp, class _Up> +struct __throw_with_nested<_Tp, _Up, false> { + _LIBCPP_NORETURN static inline _LIBCPP_INLINE_VISIBILITY void +#ifndef _LIBCPP_CXX03_LANG + __do_throw(_Tp&& __t) +#else + __do_throw (_Tp& __t) #endif // _LIBCPP_CXX03_LANG - { + { throw static_cast<_Tp&&>(__t); - } -}; -#endif - -template <class _Tp> -_LIBCPP_NORETURN -void -throw_with_nested(_Tp&& __t) -{ -#ifndef _LIBCPP_NO_EXCEPTIONS - typedef typename decay<_Tp>::type _Up; - static_assert( is_copy_constructible<_Up>::value, "type thrown must be CopyConstructible"); - __throw_with_nested<_Tp, _Up, - is_class<_Up>::value && - !is_base_of<nested_exception, _Up>::value && - !__libcpp_is_final<_Up>::value>:: + } +}; +#endif + +template <class _Tp> +_LIBCPP_NORETURN +void +throw_with_nested(_Tp&& __t) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + typedef typename decay<_Tp>::type _Up; + static_assert( is_copy_constructible<_Up>::value, "type thrown must be CopyConstructible"); + __throw_with_nested<_Tp, _Up, + is_class<_Up>::value && + !is_base_of<nested_exception, _Up>::value && + !__libcpp_is_final<_Up>::value>:: __do_throw(static_cast<_Tp&&>(__t)); -#else - ((void)__t); - // FIXME: Make this abort -#endif -} - -template <class _From, class _To> -struct __can_dynamic_cast : public _LIBCPP_BOOL_CONSTANT( - is_polymorphic<_From>::value && - (!is_base_of<_To, _From>::value || - is_convertible<const _From*, const _To*>::value)) {}; - -template <class _Ep> -inline _LIBCPP_INLINE_VISIBILITY -void -rethrow_if_nested(const _Ep& __e, - typename enable_if< __can_dynamic_cast<_Ep, nested_exception>::value>::type* = 0) -{ - const nested_exception* __nep = dynamic_cast<const nested_exception*>(_VSTD::addressof(__e)); - if (__nep) - __nep->rethrow_nested(); -} - -template <class _Ep> -inline _LIBCPP_INLINE_VISIBILITY -void -rethrow_if_nested(const _Ep&, - typename enable_if<!__can_dynamic_cast<_Ep, nested_exception>::value>::type* = 0) -{ -} - -} // std - +#else + ((void)__t); + // FIXME: Make this abort +#endif +} + +template <class _From, class _To> +struct __can_dynamic_cast : public _LIBCPP_BOOL_CONSTANT( + is_polymorphic<_From>::value && + (!is_base_of<_To, _From>::value || + is_convertible<const _From*, const _To*>::value)) {}; + +template <class _Ep> +inline _LIBCPP_INLINE_VISIBILITY +void +rethrow_if_nested(const _Ep& __e, + typename enable_if< __can_dynamic_cast<_Ep, nested_exception>::value>::type* = 0) +{ + const nested_exception* __nep = dynamic_cast<const nested_exception*>(_VSTD::addressof(__e)); + if (__nep) + __nep->rethrow_nested(); +} + +template <class _Ep> +inline _LIBCPP_INLINE_VISIBILITY +void +rethrow_if_nested(const _Ep&, + typename enable_if<!__can_dynamic_cast<_Ep, nested_exception>::value>::type* = 0) +{ +} + +} // std + #endif // _LIBCPP_EXCEPTION - - + + ====================File: include/experimental/list==================== // -*- C++ -*- //===--------------------------- list ------------------------------------===// @@ -1483,21 +1483,21 @@ rethrow_if_nested(const _Ep&, // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// - + #ifndef _LIBCPP_EXPERIMENTAL_LIST #define _LIBCPP_EXPERIMENTAL_LIST /* experimental/list synopsis - + // C++1z namespace std { namespace experimental { inline namespace fundamentals_v1 { namespace pmr { - + template <class T> using list = std::list<T,polymorphic_allocator<T>>; - + } // namespace pmr } // namespace fundamentals_v1 } // namespace experimental @@ -5343,67 +5343,67 @@ __cpp_lib_void_t 201411L <type_traits> #endif // _LIBCPP_VERSIONH -====================MIT==================== -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -====================NCSA==================== -Legacy LLVM License (https://llvm.org/docs/DeveloperPolicy.html#legacy): - - -====================NCSA==================== -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal with -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimers. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimers in the - documentation and/or other materials provided with the distribution. - - * Neither the names of the LLVM Team, University of Illinois at - Urbana-Champaign, nor the names of its contributors may be used to - endorse or promote products derived from this Software without specific - prior written permission. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE -SOFTWARE. - - -====================NCSA==================== -University of Illinois/NCSA -Open Source License - - -====================NCSA AND MIT==================== -The libc++ library is dual licensed under both the University of Illinois -"BSD-Like" license and the MIT license. As a user of this code you may choose -to use it under either license. As a contributor, you agree to allow your code -to be used under both. - -Full text of the relevant licenses is included below. +====================MIT==================== +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +====================NCSA==================== +Legacy LLVM License (https://llvm.org/docs/DeveloperPolicy.html#legacy): + + +====================NCSA==================== +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal with +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimers. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimers in the + documentation and/or other materials provided with the distribution. + + * Neither the names of the LLVM Team, University of Illinois at + Urbana-Champaign, nor the names of its contributors may be used to + endorse or promote products derived from this Software without specific + prior written permission. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE +SOFTWARE. + + +====================NCSA==================== +University of Illinois/NCSA +Open Source License + + +====================NCSA AND MIT==================== +The libc++ library is dual licensed under both the University of Illinois +"BSD-Like" license and the MIT license. As a user of this code you may choose +to use it under either license. As a contributor, you agree to allow your code +to be used under both. + +Full text of the relevant licenses is included below. diff --git a/contrib/libs/cxxsupp/libcxx/include/__availability b/contrib/libs/cxxsupp/libcxx/include/__availability index 87d43ed414..e38d22c5ce 100644 --- a/contrib/libs/cxxsupp/libcxx/include/__availability +++ b/contrib/libs/cxxsupp/libcxx/include/__availability @@ -1,48 +1,48 @@ -// -*- C++ -*- -//===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#ifndef _LIBCPP___AVAILABILITY -#define _LIBCPP___AVAILABILITY - -#include <__config> - -#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) -# pragma GCC system_header -#endif - -// Libc++ is shipped by various vendors. In particular, it is used as a system -// library on macOS, iOS and other Apple platforms. In order for users to be -// able to compile a binary that is intended to be deployed to an older version -// of a platform, Clang provides availability attributes [1]. These attributes -// can be placed on declarations and are used to describe the life cycle of a -// symbol in the library. -// -// The main goal is to ensure a compile-time error if a symbol that hasn't been -// introduced in a previously released library is used in a program that targets -// that previously released library. Normally, this would be a load-time error -// when one tries to launch the program against the older library. -// -// For example, the filesystem library was introduced in the dylib in macOS 10.15. -// If a user compiles on a macOS 10.15 host but targets macOS 10.13 with their -// program, the compiler would normally not complain (because the required -// declarations are in the headers), but the dynamic loader would fail to find -// the symbols when actually trying to launch the program on macOS 10.13. To -// turn this into a compile-time issue instead, declarations are annotated with -// when they were introduced, and the compiler can produce a diagnostic if the -// program references something that isn't available on the deployment target. -// -// This mechanism is general in nature, and any vendor can add their markup to -// the library (see below). Whenever a new feature is added that requires support -// in the shared library, a macro should be added below to mark this feature -// as unavailable. When vendors decide to ship the feature as part of their -// shared library, they can update the markup appropriately. -// +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___AVAILABILITY +#define _LIBCPP___AVAILABILITY + +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +// Libc++ is shipped by various vendors. In particular, it is used as a system +// library on macOS, iOS and other Apple platforms. In order for users to be +// able to compile a binary that is intended to be deployed to an older version +// of a platform, Clang provides availability attributes [1]. These attributes +// can be placed on declarations and are used to describe the life cycle of a +// symbol in the library. +// +// The main goal is to ensure a compile-time error if a symbol that hasn't been +// introduced in a previously released library is used in a program that targets +// that previously released library. Normally, this would be a load-time error +// when one tries to launch the program against the older library. +// +// For example, the filesystem library was introduced in the dylib in macOS 10.15. +// If a user compiles on a macOS 10.15 host but targets macOS 10.13 with their +// program, the compiler would normally not complain (because the required +// declarations are in the headers), but the dynamic loader would fail to find +// the symbols when actually trying to launch the program on macOS 10.13. To +// turn this into a compile-time issue instead, declarations are annotated with +// when they were introduced, and the compiler can produce a diagnostic if the +// program references something that isn't available on the deployment target. +// +// This mechanism is general in nature, and any vendor can add their markup to +// the library (see below). Whenever a new feature is added that requires support +// in the shared library, a macro should be added below to mark this feature +// as unavailable. When vendors decide to ship the feature as part of their +// shared library, they can update the markup appropriately. +// // Furthermore, many features in the standard library have corresponding // feature-test macros. When a feature is made unavailable on some deployment // target, a macro should be defined to signal that it is unavailable. That @@ -51,93 +51,93 @@ // macros don't announce a feature as being implemented if it has been marked // as unavailable. // -// Note that this mechanism is disabled by default in the "upstream" libc++. -// Availability annotations are only meaningful when shipping libc++ inside -// a platform (i.e. as a system library), and so vendors that want them should -// turn those annotations on at CMake configuration time. -// -// [1]: https://clang.llvm.org/docs/AttributeReference.html#availability - - -// For backwards compatibility, allow users to define _LIBCPP_DISABLE_AVAILABILITY -// for a while. -#if defined(_LIBCPP_DISABLE_AVAILABILITY) -# if !defined(_LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS) -# define _LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS -# endif -#endif - -// Availability markup is disabled when building the library, or when the compiler -// doesn't support the proper attributes. -#if defined(_LIBCPP_BUILDING_LIBRARY) || \ - defined(_LIBCXXABI_BUILDING_LIBRARY) || \ - !__has_feature(attribute_availability_with_strict) || \ - !__has_feature(attribute_availability_in_templates) || \ - !__has_extension(pragma_clang_attribute_external_declaration) -# if !defined(_LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS) -# define _LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS -# endif -#endif - -#if defined(_LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS) - - // This controls the availability of std::shared_mutex and std::shared_timed_mutex, - // which were added to the dylib later. -# define _LIBCPP_AVAILABILITY_SHARED_MUTEX +// Note that this mechanism is disabled by default in the "upstream" libc++. +// Availability annotations are only meaningful when shipping libc++ inside +// a platform (i.e. as a system library), and so vendors that want them should +// turn those annotations on at CMake configuration time. +// +// [1]: https://clang.llvm.org/docs/AttributeReference.html#availability + + +// For backwards compatibility, allow users to define _LIBCPP_DISABLE_AVAILABILITY +// for a while. +#if defined(_LIBCPP_DISABLE_AVAILABILITY) +# if !defined(_LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS) +# define _LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS +# endif +#endif + +// Availability markup is disabled when building the library, or when the compiler +// doesn't support the proper attributes. +#if defined(_LIBCPP_BUILDING_LIBRARY) || \ + defined(_LIBCXXABI_BUILDING_LIBRARY) || \ + !__has_feature(attribute_availability_with_strict) || \ + !__has_feature(attribute_availability_in_templates) || \ + !__has_extension(pragma_clang_attribute_external_declaration) +# if !defined(_LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS) +# define _LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS +# endif +#endif + +#if defined(_LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS) + + // This controls the availability of std::shared_mutex and std::shared_timed_mutex, + // which were added to the dylib later. +# define _LIBCPP_AVAILABILITY_SHARED_MUTEX // # define _LIBCPP_AVAILABILITY_DISABLE_FTM___cpp_lib_shared_mutex // # define _LIBCPP_AVAILABILITY_DISABLE_FTM___cpp_lib_shared_timed_mutex - - // These macros control the availability of std::bad_optional_access and - // other exception types. These were put in the shared library to prevent - // code bloat from every user program defining the vtable for these exception - // types. -# define _LIBCPP_AVAILABILITY_BAD_OPTIONAL_ACCESS -# define _LIBCPP_AVAILABILITY_BAD_VARIANT_ACCESS -# define _LIBCPP_AVAILABILITY_BAD_ANY_CAST - - // This controls the availability of std::uncaught_exceptions(). -# define _LIBCPP_AVAILABILITY_UNCAUGHT_EXCEPTIONS - - // This controls the availability of the sized version of ::operator delete, - // which was added to the dylib later. -# define _LIBCPP_AVAILABILITY_SIZED_NEW_DELETE - - // This controls the availability of the std::future_error exception. -# define _LIBCPP_AVAILABILITY_FUTURE_ERROR - - // This controls the availability of std::type_info's vtable. - // I can't imagine how using std::type_info can work at all if - // this isn't supported. -# define _LIBCPP_AVAILABILITY_TYPEINFO_VTABLE - - // This controls the availability of std::locale::category members - // (e.g. std::locale::collate), which are defined in the dylib. -# define _LIBCPP_AVAILABILITY_LOCALE_CATEGORY - - // This controls the availability of atomic operations on std::shared_ptr - // (e.g. `std::atomic_store(std::shared_ptr)`), which require a shared - // lock table located in the dylib. -# define _LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR - - // These macros control the availability of all parts of <filesystem> that - // depend on something in the dylib. -# define _LIBCPP_AVAILABILITY_FILESYSTEM -# define _LIBCPP_AVAILABILITY_FILESYSTEM_PUSH -# define _LIBCPP_AVAILABILITY_FILESYSTEM_POP + + // These macros control the availability of std::bad_optional_access and + // other exception types. These were put in the shared library to prevent + // code bloat from every user program defining the vtable for these exception + // types. +# define _LIBCPP_AVAILABILITY_BAD_OPTIONAL_ACCESS +# define _LIBCPP_AVAILABILITY_BAD_VARIANT_ACCESS +# define _LIBCPP_AVAILABILITY_BAD_ANY_CAST + + // This controls the availability of std::uncaught_exceptions(). +# define _LIBCPP_AVAILABILITY_UNCAUGHT_EXCEPTIONS + + // This controls the availability of the sized version of ::operator delete, + // which was added to the dylib later. +# define _LIBCPP_AVAILABILITY_SIZED_NEW_DELETE + + // This controls the availability of the std::future_error exception. +# define _LIBCPP_AVAILABILITY_FUTURE_ERROR + + // This controls the availability of std::type_info's vtable. + // I can't imagine how using std::type_info can work at all if + // this isn't supported. +# define _LIBCPP_AVAILABILITY_TYPEINFO_VTABLE + + // This controls the availability of std::locale::category members + // (e.g. std::locale::collate), which are defined in the dylib. +# define _LIBCPP_AVAILABILITY_LOCALE_CATEGORY + + // This controls the availability of atomic operations on std::shared_ptr + // (e.g. `std::atomic_store(std::shared_ptr)`), which require a shared + // lock table located in the dylib. +# define _LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR + + // These macros control the availability of all parts of <filesystem> that + // depend on something in the dylib. +# define _LIBCPP_AVAILABILITY_FILESYSTEM +# define _LIBCPP_AVAILABILITY_FILESYSTEM_PUSH +# define _LIBCPP_AVAILABILITY_FILESYSTEM_POP // # define _LIBCPP_AVAILABILITY_DISABLE_FTM___cpp_lib_filesystem - - // This controls the availability of std::to_chars. -# define _LIBCPP_AVAILABILITY_TO_CHARS - - // This controls the availability of the C++20 synchronization library, - // which requires shared library support for various operations - // (see libcxx/src/atomic.cpp). -# define _LIBCPP_AVAILABILITY_SYNC + + // This controls the availability of std::to_chars. +# define _LIBCPP_AVAILABILITY_TO_CHARS + + // This controls the availability of the C++20 synchronization library, + // which requires shared library support for various operations + // (see libcxx/src/atomic.cpp). +# define _LIBCPP_AVAILABILITY_SYNC // # define _LIBCPP_AVAILABILITY_DISABLE_FTM___cpp_lib_atomic_wait // # define _LIBCPP_AVAILABILITY_DISABLE_FTM___cpp_lib_barrier // # define _LIBCPP_AVAILABILITY_DISABLE_FTM___cpp_lib_latch // # define _LIBCPP_AVAILABILITY_DISABLE_FTM___cpp_lib_semaphore - + // This controls the availability of the C++20 format library. // The library is in development and not ABI stable yet. P2216 is // retroactively accepted in C++20. This paper contains ABI breaking @@ -145,13 +145,13 @@ # define _LIBCPP_AVAILABILITY_FORMAT // # define _LIBCPP_AVAILABILITY_DISABLE_FTM___cpp_lib_format -#elif defined(__APPLE__) - -# define _LIBCPP_AVAILABILITY_SHARED_MUTEX \ - __attribute__((availability(macosx,strict,introduced=10.12))) \ - __attribute__((availability(ios,strict,introduced=10.0))) \ - __attribute__((availability(tvos,strict,introduced=10.0))) \ - __attribute__((availability(watchos,strict,introduced=3.0))) +#elif defined(__APPLE__) + +# define _LIBCPP_AVAILABILITY_SHARED_MUTEX \ + __attribute__((availability(macosx,strict,introduced=10.12))) \ + __attribute__((availability(ios,strict,introduced=10.0))) \ + __attribute__((availability(tvos,strict,introduced=10.0))) \ + __attribute__((availability(watchos,strict,introduced=3.0))) # if (defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 101200) || \ (defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ < 100000) || \ (defined(__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__ < 100000) || \ @@ -160,58 +160,58 @@ # define _LIBCPP_AVAILABILITY_DISABLE_FTM___cpp_lib_shared_timed_mutex # endif -# define _LIBCPP_AVAILABILITY_BAD_OPTIONAL_ACCESS \ - __attribute__((availability(macosx,strict,introduced=10.13))) \ - __attribute__((availability(ios,strict,introduced=11.0))) \ - __attribute__((availability(tvos,strict,introduced=11.0))) \ - __attribute__((availability(watchos,strict,introduced=4.0))) -# define _LIBCPP_AVAILABILITY_BAD_VARIANT_ACCESS \ - _LIBCPP_AVAILABILITY_BAD_OPTIONAL_ACCESS -# define _LIBCPP_AVAILABILITY_BAD_ANY_CAST \ - _LIBCPP_AVAILABILITY_BAD_OPTIONAL_ACCESS - -# define _LIBCPP_AVAILABILITY_UNCAUGHT_EXCEPTIONS \ - __attribute__((availability(macosx,strict,introduced=10.12))) \ - __attribute__((availability(ios,strict,introduced=10.0))) \ - __attribute__((availability(tvos,strict,introduced=10.0))) \ - __attribute__((availability(watchos,strict,introduced=3.0))) - -# define _LIBCPP_AVAILABILITY_SIZED_NEW_DELETE \ - __attribute__((availability(macosx,strict,introduced=10.12))) \ - __attribute__((availability(ios,strict,introduced=10.0))) \ - __attribute__((availability(tvos,strict,introduced=10.0))) \ - __attribute__((availability(watchos,strict,introduced=3.0))) - -# define _LIBCPP_AVAILABILITY_FUTURE_ERROR \ - __attribute__((availability(ios,strict,introduced=6.0))) - -# define _LIBCPP_AVAILABILITY_TYPEINFO_VTABLE \ - __attribute__((availability(macosx,strict,introduced=10.9))) \ - __attribute__((availability(ios,strict,introduced=7.0))) - -# define _LIBCPP_AVAILABILITY_LOCALE_CATEGORY \ - __attribute__((availability(macosx,strict,introduced=10.9))) \ - __attribute__((availability(ios,strict,introduced=7.0))) - -# define _LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR \ - __attribute__((availability(macosx,strict,introduced=10.9))) \ - __attribute__((availability(ios,strict,introduced=7.0))) - -# define _LIBCPP_AVAILABILITY_FILESYSTEM \ - __attribute__((availability(macosx,strict,introduced=10.15))) \ - __attribute__((availability(ios,strict,introduced=13.0))) \ - __attribute__((availability(tvos,strict,introduced=13.0))) \ - __attribute__((availability(watchos,strict,introduced=6.0))) -# define _LIBCPP_AVAILABILITY_FILESYSTEM_PUSH \ - _Pragma("clang attribute push(__attribute__((availability(macosx,strict,introduced=10.15))), apply_to=any(function,record))") \ - _Pragma("clang attribute push(__attribute__((availability(ios,strict,introduced=13.0))), apply_to=any(function,record))") \ - _Pragma("clang attribute push(__attribute__((availability(tvos,strict,introduced=13.0))), apply_to=any(function,record))") \ - _Pragma("clang attribute push(__attribute__((availability(watchos,strict,introduced=6.0))), apply_to=any(function,record))") -# define _LIBCPP_AVAILABILITY_FILESYSTEM_POP \ - _Pragma("clang attribute pop") \ - _Pragma("clang attribute pop") \ - _Pragma("clang attribute pop") \ - _Pragma("clang attribute pop") +# define _LIBCPP_AVAILABILITY_BAD_OPTIONAL_ACCESS \ + __attribute__((availability(macosx,strict,introduced=10.13))) \ + __attribute__((availability(ios,strict,introduced=11.0))) \ + __attribute__((availability(tvos,strict,introduced=11.0))) \ + __attribute__((availability(watchos,strict,introduced=4.0))) +# define _LIBCPP_AVAILABILITY_BAD_VARIANT_ACCESS \ + _LIBCPP_AVAILABILITY_BAD_OPTIONAL_ACCESS +# define _LIBCPP_AVAILABILITY_BAD_ANY_CAST \ + _LIBCPP_AVAILABILITY_BAD_OPTIONAL_ACCESS + +# define _LIBCPP_AVAILABILITY_UNCAUGHT_EXCEPTIONS \ + __attribute__((availability(macosx,strict,introduced=10.12))) \ + __attribute__((availability(ios,strict,introduced=10.0))) \ + __attribute__((availability(tvos,strict,introduced=10.0))) \ + __attribute__((availability(watchos,strict,introduced=3.0))) + +# define _LIBCPP_AVAILABILITY_SIZED_NEW_DELETE \ + __attribute__((availability(macosx,strict,introduced=10.12))) \ + __attribute__((availability(ios,strict,introduced=10.0))) \ + __attribute__((availability(tvos,strict,introduced=10.0))) \ + __attribute__((availability(watchos,strict,introduced=3.0))) + +# define _LIBCPP_AVAILABILITY_FUTURE_ERROR \ + __attribute__((availability(ios,strict,introduced=6.0))) + +# define _LIBCPP_AVAILABILITY_TYPEINFO_VTABLE \ + __attribute__((availability(macosx,strict,introduced=10.9))) \ + __attribute__((availability(ios,strict,introduced=7.0))) + +# define _LIBCPP_AVAILABILITY_LOCALE_CATEGORY \ + __attribute__((availability(macosx,strict,introduced=10.9))) \ + __attribute__((availability(ios,strict,introduced=7.0))) + +# define _LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR \ + __attribute__((availability(macosx,strict,introduced=10.9))) \ + __attribute__((availability(ios,strict,introduced=7.0))) + +# define _LIBCPP_AVAILABILITY_FILESYSTEM \ + __attribute__((availability(macosx,strict,introduced=10.15))) \ + __attribute__((availability(ios,strict,introduced=13.0))) \ + __attribute__((availability(tvos,strict,introduced=13.0))) \ + __attribute__((availability(watchos,strict,introduced=6.0))) +# define _LIBCPP_AVAILABILITY_FILESYSTEM_PUSH \ + _Pragma("clang attribute push(__attribute__((availability(macosx,strict,introduced=10.15))), apply_to=any(function,record))") \ + _Pragma("clang attribute push(__attribute__((availability(ios,strict,introduced=13.0))), apply_to=any(function,record))") \ + _Pragma("clang attribute push(__attribute__((availability(tvos,strict,introduced=13.0))), apply_to=any(function,record))") \ + _Pragma("clang attribute push(__attribute__((availability(watchos,strict,introduced=6.0))), apply_to=any(function,record))") +# define _LIBCPP_AVAILABILITY_FILESYSTEM_POP \ + _Pragma("clang attribute pop") \ + _Pragma("clang attribute pop") \ + _Pragma("clang attribute pop") \ + _Pragma("clang attribute pop") # if (defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 101500) || \ (defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ < 130000) || \ (defined(__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__ < 130000) || \ @@ -219,10 +219,10 @@ # define _LIBCPP_AVAILABILITY_DISABLE_FTM___cpp_lib_filesystem # endif -# define _LIBCPP_AVAILABILITY_TO_CHARS \ - _LIBCPP_AVAILABILITY_FILESYSTEM +# define _LIBCPP_AVAILABILITY_TO_CHARS \ + _LIBCPP_AVAILABILITY_FILESYSTEM -# define _LIBCPP_AVAILABILITY_SYNC \ +# define _LIBCPP_AVAILABILITY_SYNC \ __attribute__((availability(macosx,strict,introduced=11.0))) \ __attribute__((availability(ios,strict,introduced=14.0))) \ __attribute__((availability(tvos,strict,introduced=14.0))) \ @@ -236,7 +236,7 @@ # define _LIBCPP_AVAILABILITY_DISABLE_FTM___cpp_lib_latch # define _LIBCPP_AVAILABILITY_DISABLE_FTM___cpp_lib_semaphore # endif - + // This controls the availability of the C++20 format library. // The library is in development and not ABI stable yet. P2216 is // retroactively accepted in C++20. This paper contains ABI breaking @@ -244,27 +244,27 @@ # define _LIBCPP_AVAILABILITY_FORMAT \ __attribute__((unavailable)) # define _LIBCPP_AVAILABILITY_DISABLE_FTM___cpp_lib_format -#else - -// ...New vendors can add availability markup here... - -# error "It looks like you're trying to enable vendor availability markup, but you haven't defined the corresponding macros yet!" - -#endif - -// Define availability attributes that depend on _LIBCPP_NO_EXCEPTIONS. -// Those are defined in terms of the availability attributes above, and -// should not be vendor-specific. -#if defined(_LIBCPP_NO_EXCEPTIONS) -# define _LIBCPP_AVAILABILITY_FUTURE -# define _LIBCPP_AVAILABILITY_THROW_BAD_ANY_CAST -# define _LIBCPP_AVAILABILITY_THROW_BAD_OPTIONAL_ACCESS -# define _LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS -#else -# define _LIBCPP_AVAILABILITY_FUTURE _LIBCPP_AVAILABILITY_FUTURE_ERROR -# define _LIBCPP_AVAILABILITY_THROW_BAD_ANY_CAST _LIBCPP_AVAILABILITY_BAD_ANY_CAST -# define _LIBCPP_AVAILABILITY_THROW_BAD_OPTIONAL_ACCESS _LIBCPP_AVAILABILITY_BAD_OPTIONAL_ACCESS -# define _LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS _LIBCPP_AVAILABILITY_BAD_VARIANT_ACCESS -#endif - +#else + +// ...New vendors can add availability markup here... + +# error "It looks like you're trying to enable vendor availability markup, but you haven't defined the corresponding macros yet!" + +#endif + +// Define availability attributes that depend on _LIBCPP_NO_EXCEPTIONS. +// Those are defined in terms of the availability attributes above, and +// should not be vendor-specific. +#if defined(_LIBCPP_NO_EXCEPTIONS) +# define _LIBCPP_AVAILABILITY_FUTURE +# define _LIBCPP_AVAILABILITY_THROW_BAD_ANY_CAST +# define _LIBCPP_AVAILABILITY_THROW_BAD_OPTIONAL_ACCESS +# define _LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS +#else +# define _LIBCPP_AVAILABILITY_FUTURE _LIBCPP_AVAILABILITY_FUTURE_ERROR +# define _LIBCPP_AVAILABILITY_THROW_BAD_ANY_CAST _LIBCPP_AVAILABILITY_BAD_ANY_CAST +# define _LIBCPP_AVAILABILITY_THROW_BAD_OPTIONAL_ACCESS _LIBCPP_AVAILABILITY_BAD_OPTIONAL_ACCESS +# define _LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS _LIBCPP_AVAILABILITY_BAD_VARIANT_ACCESS +#endif + #endif // _LIBCPP___AVAILABILITY diff --git a/contrib/libs/cxxsupp/libcxx/include/new b/contrib/libs/cxxsupp/libcxx/include/new index 2d1417a975..5a1cd0741c 100644 --- a/contrib/libs/cxxsupp/libcxx/include/new +++ b/contrib/libs/cxxsupp/libcxx/include/new @@ -88,14 +88,14 @@ void operator delete[](void* ptr, void*) noexcept; #include <__availability> #include <__config> -#include <cstddef> -#include <cstdlib> +#include <cstddef> +#include <cstdlib> #include <exception> #include <type_traits> #include <version> #if defined(_LIBCPP_ABI_VCRUNTIME) -#include <new.h> +#include <new.h> #endif #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) @@ -228,54 +228,54 @@ _LIBCPP_CONSTEXPR inline _LIBCPP_INLINE_VISIBILITY bool __is_overaligned_for_new #endif } -template <class ..._Args> -_LIBCPP_INLINE_VISIBILITY -void* __libcpp_operator_new(_Args ...__args) { -#if __has_builtin(__builtin_operator_new) && __has_builtin(__builtin_operator_delete) - return __builtin_operator_new(__args...); -#else - return ::operator new(__args...); -#endif -} - -template <class ..._Args> -_LIBCPP_INLINE_VISIBILITY -void __libcpp_operator_delete(_Args ...__args) { -#if __has_builtin(__builtin_operator_new) && __has_builtin(__builtin_operator_delete) - __builtin_operator_delete(__args...); -#else - ::operator delete(__args...); -#endif -} - -inline _LIBCPP_INLINE_VISIBILITY -void *__libcpp_allocate(size_t __size, size_t __align) { +template <class ..._Args> +_LIBCPP_INLINE_VISIBILITY +void* __libcpp_operator_new(_Args ...__args) { +#if __has_builtin(__builtin_operator_new) && __has_builtin(__builtin_operator_delete) + return __builtin_operator_new(__args...); +#else + return ::operator new(__args...); +#endif +} + +template <class ..._Args> +_LIBCPP_INLINE_VISIBILITY +void __libcpp_operator_delete(_Args ...__args) { +#if __has_builtin(__builtin_operator_new) && __has_builtin(__builtin_operator_delete) + __builtin_operator_delete(__args...); +#else + ::operator delete(__args...); +#endif +} + +inline _LIBCPP_INLINE_VISIBILITY +void *__libcpp_allocate(size_t __size, size_t __align) { #ifndef _LIBCPP_HAS_NO_ALIGNED_ALLOCATION if (__is_overaligned_for_new(__align)) { const align_val_t __align_val = static_cast<align_val_t>(__align); - return __libcpp_operator_new(__size, __align_val); + return __libcpp_operator_new(__size, __align_val); } #endif - - (void)__align; - return __libcpp_operator_new(__size); -} - -template <class ..._Args> -_LIBCPP_INLINE_VISIBILITY -void __do_deallocate_handle_size(void *__ptr, size_t __size, _Args ...__args) { -#ifdef _LIBCPP_HAS_NO_SIZED_DEALLOCATION - (void)__size; - return __libcpp_operator_delete(__ptr, __args...); + + (void)__align; + return __libcpp_operator_new(__size); +} + +template <class ..._Args> +_LIBCPP_INLINE_VISIBILITY +void __do_deallocate_handle_size(void *__ptr, size_t __size, _Args ...__args) { +#ifdef _LIBCPP_HAS_NO_SIZED_DEALLOCATION + (void)__size; + return __libcpp_operator_delete(__ptr, __args...); #else - return __libcpp_operator_delete(__ptr, __size, __args...); + return __libcpp_operator_delete(__ptr, __size, __args...); #endif } -inline _LIBCPP_INLINE_VISIBILITY -void __libcpp_deallocate(void* __ptr, size_t __size, size_t __align) { +inline _LIBCPP_INLINE_VISIBILITY +void __libcpp_deallocate(void* __ptr, size_t __size, size_t __align) { #if defined(_LIBCPP_HAS_NO_ALIGNED_ALLOCATION) - (void)__align; + (void)__align; return __do_deallocate_handle_size(__ptr, __size); #else if (__is_overaligned_for_new(__align)) { @@ -285,50 +285,50 @@ void __libcpp_deallocate(void* __ptr, size_t __size, size_t __align) { return __do_deallocate_handle_size(__ptr, __size); } #endif -} +} -inline _LIBCPP_INLINE_VISIBILITY void __libcpp_deallocate_unsized(void* __ptr, size_t __align) { +inline _LIBCPP_INLINE_VISIBILITY void __libcpp_deallocate_unsized(void* __ptr, size_t __align) { #if defined(_LIBCPP_HAS_NO_ALIGNED_ALLOCATION) - (void)__align; - return __libcpp_operator_delete(__ptr); + (void)__align; + return __libcpp_operator_delete(__ptr); #else if (__is_overaligned_for_new(__align)) { const align_val_t __align_val = static_cast<align_val_t>(__align); - return __libcpp_operator_delete(__ptr, __align_val); + return __libcpp_operator_delete(__ptr, __align_val); } else { - return __libcpp_operator_delete(__ptr); + return __libcpp_operator_delete(__ptr); } #endif -} - -#if !defined(_LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION) -// Low-level helpers to call the aligned allocation and deallocation functions -// on the target platform. This is used to implement libc++'s own memory -// allocation routines -- if you need to allocate memory inside the library, -// chances are that you want to use `__libcpp_allocate` instead. -// -// Returns the allocated memory, or `nullptr` on failure. -inline _LIBCPP_INLINE_VISIBILITY -void* __libcpp_aligned_alloc(std::size_t __alignment, std::size_t __size) { -#if defined(_LIBCPP_MSVCRT_LIKE) - return ::_aligned_malloc(__size, __alignment); +} + +#if !defined(_LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION) +// Low-level helpers to call the aligned allocation and deallocation functions +// on the target platform. This is used to implement libc++'s own memory +// allocation routines -- if you need to allocate memory inside the library, +// chances are that you want to use `__libcpp_allocate` instead. +// +// Returns the allocated memory, or `nullptr` on failure. +inline _LIBCPP_INLINE_VISIBILITY +void* __libcpp_aligned_alloc(std::size_t __alignment, std::size_t __size) { +#if defined(_LIBCPP_MSVCRT_LIKE) + return ::_aligned_malloc(__size, __alignment); #else - void* __result = nullptr; + void* __result = nullptr; (void)::posix_memalign(&__result, __alignment, __size); - // If posix_memalign fails, __result is unmodified so we still return `nullptr`. - return __result; + // If posix_memalign fails, __result is unmodified so we still return `nullptr`. + return __result; #endif -} +} -inline _LIBCPP_INLINE_VISIBILITY -void __libcpp_aligned_free(void* __ptr) { -#if defined(_LIBCPP_MSVCRT_LIKE) - ::_aligned_free(__ptr); +inline _LIBCPP_INLINE_VISIBILITY +void __libcpp_aligned_free(void* __ptr) { +#if defined(_LIBCPP_MSVCRT_LIKE) + ::_aligned_free(__ptr); #else - ::free(__ptr); + ::free(__ptr); #endif } -#endif // !_LIBCPP_HAS_NO_ALIGNED_ALLOCATION +#endif // !_LIBCPP_HAS_NO_ALIGNED_ALLOCATION template <class _Tp> diff --git a/contrib/libs/cxxsupp/libcxx/ya.make b/contrib/libs/cxxsupp/libcxx/ya.make index 15403fe6d5..072e771b61 100644 --- a/contrib/libs/cxxsupp/libcxx/ya.make +++ b/contrib/libs/cxxsupp/libcxx/ya.make @@ -1,27 +1,27 @@ LIBRARY() LICENSE( - Apache-2.0 AND - Apache-2.0 WITH LLVM-exception AND - BSD-2-Clause AND - MIT AND - NCSA + Apache-2.0 AND + Apache-2.0 WITH LLVM-exception AND + BSD-2-Clause AND + MIT AND + NCSA ) -LICENSE_TEXTS(.yandex_meta/licenses.list.txt) - +LICENSE_TEXTS(.yandex_meta/licenses.list.txt) + VERSION(2021-04-02-7959d59028dd126416cdf10dbbd22162922e1336) OWNER( - halyavin - somov + halyavin + somov g:cpp-committee - g:cpp-contrib + g:cpp-contrib ) -ADDINCL( - GLOBAL contrib/libs/cxxsupp/libcxx/include -) +ADDINCL( + GLOBAL contrib/libs/cxxsupp/libcxx/include +) CXXFLAGS(-D_LIBCPP_BUILDING_LIBRARY) @@ -42,15 +42,15 @@ IF (OS_ANDROID) ELSE() LDFLAGS(-lc++abi) ENDIF() - CFLAGS( - -DLIBCXX_BUILDING_LIBCXXABI - ) + CFLAGS( + -DLIBCXX_BUILDING_LIBCXXABI + ) ELSEIF (OS_IOS) # Take cxxabi implementation from system. LDFLAGS(-lc++abi) - CFLAGS( - -DLIBCXX_BUILDING_LIBCXXABI - ) + CFLAGS( + -DLIBCXX_BUILDING_LIBCXXABI + ) # Yet take builtins library from Arcadia PEERDIR( contrib/libs/cxxsupp/builtins @@ -60,16 +60,16 @@ ELSEIF (CLANG OR MUSL OR OS_DARWIN OR USE_LTO) # XXX: libcxxrt support for ARM is currently broken DEFAULT(CXX_RT "glibcxx_static") # ARM7 OS_SDK has old libstdc++ without aligned allocation support - CFLAGS( - GLOBAL -fno-aligned-new - ) + CFLAGS( + GLOBAL -fno-aligned-new + ) ELSE() DEFAULT(CXX_RT "libcxxrt") ENDIF() IF (MUSL) - PEERDIR( - contrib/libs/musl/include - ) + PEERDIR( + contrib/libs/musl/include + ) ENDIF() ELSEIF (OS_WINDOWS) SRCS( @@ -84,9 +84,9 @@ ELSEIF (OS_WINDOWS) GLOBAL -D_WCHAR_H_CPLUSPLUS_98_CONFORMANCE_ ) IF (CLANG_CL) - PEERDIR( - contrib/libs/cxxsupp/builtins - ) + PEERDIR( + contrib/libs/cxxsupp/builtins + ) ENDIF() ELSE() DEFAULT(CXX_RT "glibcxx_static") @@ -94,16 +94,16 @@ ELSE() -Wno-unknown-pragmas -nostdinc++ ) -ENDIF() +ENDIF() IF (OS_LINUX) EXTRALIBS(-lpthread) -ENDIF() +ENDIF() IF (CLANG) - CFLAGS( - GLOBAL -nostdinc++ - ) + CFLAGS( + GLOBAL -nostdinc++ + ) ENDIF() # The CXX_RT variable controls which C++ runtime is used. @@ -124,24 +124,24 @@ IF (CXX_RT == "libcxxrt") PEERDIR( contrib/libs/cxxsupp/libcxxabi-parts contrib/libs/cxxsupp/libcxxrt - contrib/libs/cxxsupp/builtins - ) - ADDINCL( - contrib/libs/cxxsupp/libcxxrt + contrib/libs/cxxsupp/builtins ) + ADDINCL( + contrib/libs/cxxsupp/libcxxrt + ) CFLAGS( GLOBAL -DLIBCXX_BUILDING_LIBCXXRT ) # These builtins are equivalent to clang -rtlib=compiler_rt and # are needed by potentially any code generated by clang. # With glibcxx runtime, builtins are provided by libgcc -ELSEIF (CXX_RT == "glibcxx" OR CXX_RT == "glibcxx_static") - LDFLAGS( - -Wl,-Bstatic - -lsupc++ - -lgcc - -lgcc_eh - -Wl,-Bdynamic +ELSEIF (CXX_RT == "glibcxx" OR CXX_RT == "glibcxx_static") + LDFLAGS( + -Wl,-Bstatic + -lsupc++ + -lgcc + -lgcc_eh + -Wl,-Bdynamic ) CXXFLAGS(-D__GLIBCXX__=1) ENABLE(NEED_GLIBCXX_CXX17_SHIMS) @@ -149,10 +149,10 @@ ELSEIF (CXX_RT == "glibcxx" OR CXX_RT == "glibcxx_static") GLOBAL -DLIBCXX_BUILDING_LIBGCC ) ELSEIF (CXX_RT == "glibcxx_dynamic") - LDFLAGS( - -lgcc_s - -lstdc++ - ) + LDFLAGS( + -lgcc_s + -lstdc++ + ) CXXFLAGS(-D__GLIBCXX__=1) CFLAGS( GLOBAL -DLIBCXX_BUILDING_LIBGCC @@ -163,7 +163,7 @@ ELSEIF (CXX_RT == "glibcxx_driver") ELSEIF (CXX_RT == "default") # Do nothing ELSE() - MESSAGE(FATAL_ERROR "Unexpected CXX_RT value: ${CXX_RT}") + MESSAGE(FATAL_ERROR "Unexpected CXX_RT value: ${CXX_RT}") ENDIF() IF (NEED_GLIBCXX_CXX17_SHIMS) @@ -171,16 +171,16 @@ IF (NEED_GLIBCXX_CXX17_SHIMS) # Assume GCC is bundled with a modern enough version of C++ runtime ELSEIF (OS_SDK == "ubuntu-12" OR OS_SDK == "ubuntu-14" OR OS_SDK == "ubuntu-16") # Prior to ubuntu-18, system C++ runtime for C++17 is incomplete - SRCS( - glibcxx_eh_cxx17.cpp - ) + SRCS( + glibcxx_eh_cxx17.cpp + ) ENDIF() ENDIF() NO_UTIL() - + NO_RUNTIME() - + NO_COMPILER_WARNINGS() IF (FUZZING) @@ -230,7 +230,7 @@ SRCS( src/vector.cpp ) -IF (NOT OS_WINDOWS) +IF (NOT OS_WINDOWS) SRCS( src/new.cpp ) diff --git a/contrib/libs/cxxsupp/libcxxabi-parts/ya.make b/contrib/libs/cxxsupp/libcxxabi-parts/ya.make index 9965f3bcf0..868d22b02a 100644 --- a/contrib/libs/cxxsupp/libcxxabi-parts/ya.make +++ b/contrib/libs/cxxsupp/libcxxabi-parts/ya.make @@ -1,18 +1,18 @@ LIBRARY() -WITHOUT_LICENSE_TEXTS() - +WITHOUT_LICENSE_TEXTS() + OWNER( g:cpp-committee g:cpp-contrib heretic ) -LICENSE( - Apache-2.0 - WITH - LLVM-exception -) +LICENSE( + Apache-2.0 + WITH + LLVM-exception +) VERSION(2021-08-17) @@ -30,9 +30,9 @@ NO_RUNTIME() NO_UTIL() -CFLAGS(-D_LIBCXXABI_BUILDING_LIBRARY) +CFLAGS(-D_LIBCXXABI_BUILDING_LIBRARY) -SRCDIR(contrib/libs/cxxsupp/libcxxabi) +SRCDIR(contrib/libs/cxxsupp/libcxxabi) SRCS( src/abort_message.cpp @@ -40,8 +40,8 @@ SRCS( ) SRC_CPP_PIC( - src/cxa_thread_atexit.cpp - -fno-lto + src/cxa_thread_atexit.cpp + -fno-lto ) END() diff --git a/contrib/libs/cxxsupp/libcxxabi/.yandex_meta/devtools.copyrights.report b/contrib/libs/cxxsupp/libcxxabi/.yandex_meta/devtools.copyrights.report index ca6399fd4a..f06cd15dc7 100644 --- a/contrib/libs/cxxsupp/libcxxabi/.yandex_meta/devtools.copyrights.report +++ b/contrib/libs/cxxsupp/libcxxabi/.yandex_meta/devtools.copyrights.report @@ -1,56 +1,56 @@ -# File format ($ symbol means the beginning of a line): -# -# $ # this message -# $ # ======================= -# $ # comments (all commentaries should starts with some number of spaces and # symbol) -# ${action} {license id} {license text hash} -# $BELONGS ./ya/make/file/relative/path/1/ya.make ./ya/make/2/ya.make -# ${all_file_action} filename -# $ # user commentaries (many lines) -# $ generated description - files with this license, license text... (some number of lines that starts with some number of spaces, do not modify) -# ${action} {license spdx} {license text hash} -# $BELONGS ./ya/make/file/relative/path/3/ya.make -# ${all_file_action} filename -# $ # user commentaries -# $ generated description -# $ ... -# -# You can modify action, all_file_action and add commentaries -# Available actions: -# keep - keep license in contrib and use in credits -# skip - skip license -# remove - remove all files with this license -# rename - save license text/links into licenses texts file, but not store SPDX into LINCENSE macro. You should store correct license id into devtools.license.spdx.txt file -# -# {all file action} records will be generated when license text contains filename that exists on filesystem (in contrib directory) -# We suppose that that files can contain some license info -# Available all file actions: -# FILE_IGNORE - ignore file (do nothing) -# FILE_INCLUDE - include all file data into licenses text file -# ======================= - -KEEP COPYRIGHT_SERVICE_LABEL ebc015cad7377d32e7b2fc0ae5293aa1 +# File format ($ symbol means the beginning of a line): +# +# $ # this message +# $ # ======================= +# $ # comments (all commentaries should starts with some number of spaces and # symbol) +# ${action} {license id} {license text hash} +# $BELONGS ./ya/make/file/relative/path/1/ya.make ./ya/make/2/ya.make +# ${all_file_action} filename +# $ # user commentaries (many lines) +# $ generated description - files with this license, license text... (some number of lines that starts with some number of spaces, do not modify) +# ${action} {license spdx} {license text hash} +# $BELONGS ./ya/make/file/relative/path/3/ya.make +# ${all_file_action} filename +# $ # user commentaries +# $ generated description +# $ ... +# +# You can modify action, all_file_action and add commentaries +# Available actions: +# keep - keep license in contrib and use in credits +# skip - skip license +# remove - remove all files with this license +# rename - save license text/links into licenses texts file, but not store SPDX into LINCENSE macro. You should store correct license id into devtools.license.spdx.txt file +# +# {all file action} records will be generated when license text contains filename that exists on filesystem (in contrib directory) +# We suppose that that files can contain some license info +# Available all file actions: +# FILE_IGNORE - ignore file (do nothing) +# FILE_INCLUDE - include all file data into licenses text file +# ======================= + +KEEP COPYRIGHT_SERVICE_LABEL ebc015cad7377d32e7b2fc0ae5293aa1 BELONGS ya.make FILE_INCLUDE CREDITS.TXT found in files: LICENSE.TXT at line 252 - # libcxxabi/CREDITS.TXT included in libcxxabi - License text: - Copyright (c) 2009-2019 by the contributors listed in CREDITS.TXT - Scancode info: - Original SPDX id: COPYRIGHT_SERVICE_LABEL - Score : 100.00 - Match type : COPYRIGHT - Files with this license: + # libcxxabi/CREDITS.TXT included in libcxxabi + License text: + Copyright (c) 2009-2019 by the contributors listed in CREDITS.TXT + Scancode info: + Original SPDX id: COPYRIGHT_SERVICE_LABEL + Score : 100.00 + Match type : COPYRIGHT + Files with this license: LICENSE.TXT [252:252] - -KEEP COPYRIGHT_SERVICE_LABEL f52c727d32a7eaf5a8de6bc96b82797c + +KEEP COPYRIGHT_SERVICE_LABEL f52c727d32a7eaf5a8de6bc96b82797c BELONGS ya.make FILE_INCLUDE CREDITS.TXT found in files: LICENSE.TXT at line 293 - # libcxxabi/CREDITS.TXT included in libcxxabi - License text: - Copyright (c) 2009-2014 by the contributors listed in CREDITS.TXT - Scancode info: - Original SPDX id: COPYRIGHT_SERVICE_LABEL - Score : 100.00 - Match type : COPYRIGHT - Files with this license: + # libcxxabi/CREDITS.TXT included in libcxxabi + License text: + Copyright (c) 2009-2014 by the contributors listed in CREDITS.TXT + Scancode info: + Original SPDX id: COPYRIGHT_SERVICE_LABEL + Score : 100.00 + Match type : COPYRIGHT + Files with this license: LICENSE.TXT [293:293] diff --git a/contrib/libs/cxxsupp/libcxxabi/.yandex_meta/devtools.licenses.report b/contrib/libs/cxxsupp/libcxxabi/.yandex_meta/devtools.licenses.report index 4ecc10fb97..8ed2e8f4a1 100644 --- a/contrib/libs/cxxsupp/libcxxabi/.yandex_meta/devtools.licenses.report +++ b/contrib/libs/cxxsupp/libcxxabi/.yandex_meta/devtools.licenses.report @@ -1,87 +1,87 @@ -# File format ($ symbol means the beginning of a line): -# -# $ # this message -# $ # ======================= -# $ # comments (all commentaries should starts with some number of spaces and # symbol) -# ${action} {license spdx} {license text hash} -# $BELONGS ./ya/make/file/relative/path/1/ya.make ./ya/make/2/ya.make -# ${all_file_action} filename -# $ # user commentaries (many lines) -# $ generated description - files with this license, license text... (some number of lines that starts with some number of spaces, do not modify) -# ${action} {license spdx} {license text hash} -# $BELONGS ./ya/make/file/relative/path/3/ya.make -# ${all_file_action} filename -# $ # user commentaries -# $ generated description -# $ ... -# -# You can modify action, all_file_action and add commentaries -# Available actions: -# keep - keep license in contrib and use in credits -# skip - skip license -# remove - remove all files with this license -# rename - save license text/links into licenses texts file, but not store SPDX into LINCENSE macro. You should store correct license id into devtools.license.spdx.txt file -# -# {all file action} records will be generated when license text contains filename that exists on filesystem (in contrib directory) -# We suppose that that files can contain some license info -# Available all file actions: -# FILE_IGNORE - ignore file (do nothing) -# FILE_INCLUDE - include all file data into licenses text file -# ======================= - +# File format ($ symbol means the beginning of a line): +# +# $ # this message +# $ # ======================= +# $ # comments (all commentaries should starts with some number of spaces and # symbol) +# ${action} {license spdx} {license text hash} +# $BELONGS ./ya/make/file/relative/path/1/ya.make ./ya/make/2/ya.make +# ${all_file_action} filename +# $ # user commentaries (many lines) +# $ generated description - files with this license, license text... (some number of lines that starts with some number of spaces, do not modify) +# ${action} {license spdx} {license text hash} +# $BELONGS ./ya/make/file/relative/path/3/ya.make +# ${all_file_action} filename +# $ # user commentaries +# $ generated description +# $ ... +# +# You can modify action, all_file_action and add commentaries +# Available actions: +# keep - keep license in contrib and use in credits +# skip - skip license +# remove - remove all files with this license +# rename - save license text/links into licenses texts file, but not store SPDX into LINCENSE macro. You should store correct license id into devtools.license.spdx.txt file +# +# {all file action} records will be generated when license text contains filename that exists on filesystem (in contrib directory) +# We suppose that that files can contain some license info +# Available all file actions: +# FILE_IGNORE - ignore file (do nothing) +# FILE_INCLUDE - include all file data into licenses text file +# ======================= + KEEP NCSA AND MIT 4889a4f7db5a93b4117da9cf0a641927 BELONGS ya.make - Note: matched license text is too long. Read it in the source files. - Scancode info: - Original SPDX id: NCSA - Score : 100.00 - Match type : NOTICE - Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA - Files with this license: + Note: matched license text is too long. Read it in the source files. + Scancode info: + Original SPDX id: NCSA + Score : 100.00 + Match type : NOTICE + Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA + Files with this license: LICENSE.TXT [240:245] - Scancode info: - Original SPDX id: MIT - Score : 100.00 - Match type : NOTICE - Links : http://opensource.org/licenses/mit-license.php, https://spdx.org/licenses/MIT - Files with this license: + Scancode info: + Original SPDX id: MIT + Score : 100.00 + Match type : NOTICE + Links : http://opensource.org/licenses/mit-license.php, https://spdx.org/licenses/MIT + Files with this license: LICENSE.TXT [240:245] - -KEEP NCSA 5a35b4c0d3b3923cac31a5a371332ca2 + +KEEP NCSA 5a35b4c0d3b3923cac31a5a371332ca2 BELONGS ya.make - License text: - Legacy LLVM License (https://llvm.org/docs/DeveloperPolicy.html#legacy): - Scancode info: - Original SPDX id: NCSA - Score : 100.00 - Match type : REFERENCE - Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA - Files with this license: + License text: + Legacy LLVM License (https://llvm.org/docs/DeveloperPolicy.html#legacy): + Scancode info: + Original SPDX id: NCSA + Score : 100.00 + Match type : REFERENCE + Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA + Files with this license: LICENSE.TXT [237:237] - -KEEP MIT 5debb370f50e1dfd24ff5144233a2ef6 + +KEEP MIT 5debb370f50e1dfd24ff5144233a2ef6 BELONGS ya.make - # any - just word, not file reference - Note: matched license text is too long. Read it in the source files. - Scancode info: - Original SPDX id: MIT - Score : 100.00 - Match type : TEXT - Links : http://opensource.org/licenses/mit-license.php, https://spdx.org/licenses/MIT - Files with this license: + # any - just word, not file reference + Note: matched license text is too long. Read it in the source files. + Scancode info: + Original SPDX id: MIT + Score : 100.00 + Match type : TEXT + Links : http://opensource.org/licenses/mit-license.php, https://spdx.org/licenses/MIT + Files with this license: LICENSE.TXT [295:311] - -KEEP Apache-2.0 WITH LLVM-exception 755ab7da3ff8c5d6ae90bdbebd177e49 + +KEEP Apache-2.0 WITH LLVM-exception 755ab7da3ff8c5d6ae90bdbebd177e49 BELONGS ya.make - License text: - // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. - // See https://llvm.org/LICENSE.txt for license information. - Scancode info: - Original SPDX id: Apache-2.0 - Score : 100.00 - Match type : NOTICE - Links : http://www.apache.org/licenses/, http://www.apache.org/licenses/LICENSE-2.0, https://spdx.org/licenses/Apache-2.0 - Files with this license: + License text: + // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. + // See https://llvm.org/LICENSE.txt for license information. + Scancode info: + Original SPDX id: Apache-2.0 + Score : 100.00 + Match type : NOTICE + Links : http://www.apache.org/licenses/, http://www.apache.org/licenses/LICENSE-2.0, https://spdx.org/licenses/Apache-2.0 + Files with this license: include/__cxxabi_config.h [3:4] include/cxxabi.h [3:4] src/abort_message.cpp [3:4] @@ -112,12 +112,12 @@ BELONGS ya.make src/stdlib_new_delete.cpp [3:4] src/stdlib_stdexcept.cpp [3:4] src/stdlib_typeinfo.cpp [3:4] - Scancode info: - Original SPDX id: LLVM-exception - Score : 100.00 - Match type : NOTICE - Links : http://llvm.org/foundation/relicensing/LICENSE.txt, https://spdx.org/licenses/LLVM-exception - Files with this license: + Scancode info: + Original SPDX id: LLVM-exception + Score : 100.00 + Match type : NOTICE + Links : http://llvm.org/foundation/relicensing/LICENSE.txt, https://spdx.org/licenses/LLVM-exception + Files with this license: include/__cxxabi_config.h [3:4] include/cxxabi.h [3:4] src/abort_message.cpp [3:4] @@ -148,52 +148,52 @@ BELONGS ya.make src/stdlib_new_delete.cpp [3:4] src/stdlib_stdexcept.cpp [3:4] src/stdlib_typeinfo.cpp [3:4] - -KEEP Apache-2.0 WITH LLVM-exception 8494a9caed330d9a4f40e19cce7dc770 + +KEEP Apache-2.0 WITH LLVM-exception 8494a9caed330d9a4f40e19cce7dc770 BELONGS ya.make - Note: matched license text is too long. Read it in the source files. - Scancode info: - Original SPDX id: LLVM-exception - Score : 100.00 - Match type : TEXT - Links : http://llvm.org/foundation/relicensing/LICENSE.txt, https://spdx.org/licenses/LLVM-exception - Files with this license: + Note: matched license text is too long. Read it in the source files. + Scancode info: + Original SPDX id: LLVM-exception + Score : 100.00 + Match type : TEXT + Links : http://llvm.org/foundation/relicensing/LICENSE.txt, https://spdx.org/licenses/LLVM-exception + Files with this license: LICENSE.TXT [208:222] - -KEEP Apache-2.0 9ac77f65a898755c7eed97099caded94 + +KEEP Apache-2.0 9ac77f65a898755c7eed97099caded94 BELONGS ya.make - # any and version - just words, not file reference - Note: matched license text is too long. Read it in the source files. - Scancode info: - Original SPDX id: Apache-2.0 - Score : 100.00 - Match type : TEXT - Links : http://www.apache.org/licenses/, http://www.apache.org/licenses/LICENSE-2.0, https://spdx.org/licenses/Apache-2.0 - Files with this license: + # any and version - just words, not file reference + Note: matched license text is too long. Read it in the source files. + Scancode info: + Original SPDX id: Apache-2.0 + Score : 100.00 + Match type : TEXT + Links : http://www.apache.org/licenses/, http://www.apache.org/licenses/LICENSE-2.0, https://spdx.org/licenses/Apache-2.0 + Files with this license: LICENSE.TXT [5:205] - -KEEP NCSA b160d8bd561da097b0edd40b062e1c84 + +KEEP NCSA b160d8bd561da097b0edd40b062e1c84 BELONGS ya.make - # any and list - just words, not file reference - Note: matched license text is too long. Read it in the source files. - Scancode info: - Original SPDX id: NCSA - Score : 100.00 - Match type : TEXT - Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA - Files with this license: + # any and list - just words, not file reference + Note: matched license text is too long. Read it in the source files. + Scancode info: + Original SPDX id: NCSA + Score : 100.00 + Match type : TEXT + Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA + Files with this license: LICENSE.TXT [264:289] - -KEEP Apache-2.0 WITH LLVM-exception b7566a1930e050e1090162bf1d543650 + +KEEP Apache-2.0 WITH LLVM-exception b7566a1930e050e1090162bf1d543650 BELONGS ya.make - License text: - // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception - Scancode info: - Original SPDX id: Apache-2.0 - Score : 100.00 - Match type : TAG - Links : http://www.apache.org/licenses/, http://www.apache.org/licenses/LICENSE-2.0, https://spdx.org/licenses/Apache-2.0 - Files with this license: + License text: + // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + Scancode info: + Original SPDX id: Apache-2.0 + Score : 100.00 + Match type : TAG + Links : http://www.apache.org/licenses/, http://www.apache.org/licenses/LICENSE-2.0, https://spdx.org/licenses/Apache-2.0 + Files with this license: include/__cxxabi_config.h [5:5] include/cxxabi.h [5:5] src/abort_message.cpp [5:5] @@ -224,12 +224,12 @@ BELONGS ya.make src/stdlib_new_delete.cpp [5:5] src/stdlib_stdexcept.cpp [5:5] src/stdlib_typeinfo.cpp [5:5] - Scancode info: - Original SPDX id: LLVM-exception - Score : 100.00 - Match type : TAG - Links : http://llvm.org/foundation/relicensing/LICENSE.txt, https://spdx.org/licenses/LLVM-exception - Files with this license: + Scancode info: + Original SPDX id: LLVM-exception + Score : 100.00 + Match type : TAG + Links : http://llvm.org/foundation/relicensing/LICENSE.txt, https://spdx.org/licenses/LLVM-exception + Files with this license: include/__cxxabi_config.h [5:5] include/cxxabi.h [5:5] src/abort_message.cpp [5:5] @@ -260,35 +260,35 @@ BELONGS ya.make src/stdlib_new_delete.cpp [5:5] src/stdlib_stdexcept.cpp [5:5] src/stdlib_typeinfo.cpp [5:5] - -KEEP NCSA c26d0b72f92421989c4471ae0acbc943 + +KEEP NCSA c26d0b72f92421989c4471ae0acbc943 BELONGS ya.make - License text: - University of Illinois/NCSA - Open Source License - Scancode info: - Original SPDX id: NCSA - Score : 100.00 - Match type : REFERENCE - Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA - Files with this license: + License text: + University of Illinois/NCSA + Open Source License + Scancode info: + Original SPDX id: NCSA + Score : 100.00 + Match type : REFERENCE + Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA + Files with this license: LICENSE.TXT [249:250] - -KEEP Apache-2.0 WITH LLVM-exception df18889e552d44a4679aff552267f802 + +KEEP Apache-2.0 WITH LLVM-exception df18889e552d44a4679aff552267f802 BELONGS ya.make - License text: - The LLVM Project is under the Apache License v2.0 with LLVM Exceptions: - Scancode info: - Original SPDX id: Apache-2.0 - Score : 100.00 - Match type : NOTICE - Links : http://www.apache.org/licenses/, http://www.apache.org/licenses/LICENSE-2.0, https://spdx.org/licenses/Apache-2.0 - Files with this license: + License text: + The LLVM Project is under the Apache License v2.0 with LLVM Exceptions: + Scancode info: + Original SPDX id: Apache-2.0 + Score : 100.00 + Match type : NOTICE + Links : http://www.apache.org/licenses/, http://www.apache.org/licenses/LICENSE-2.0, https://spdx.org/licenses/Apache-2.0 + Files with this license: LICENSE.TXT [2:2] - Scancode info: - Original SPDX id: LLVM-exception - Score : 100.00 - Match type : NOTICE - Links : http://llvm.org/foundation/relicensing/LICENSE.txt, https://spdx.org/licenses/LLVM-exception - Files with this license: + Scancode info: + Original SPDX id: LLVM-exception + Score : 100.00 + Match type : NOTICE + Links : http://llvm.org/foundation/relicensing/LICENSE.txt, https://spdx.org/licenses/LLVM-exception + Files with this license: LICENSE.TXT [2:2] diff --git a/contrib/libs/cxxsupp/libcxxabi/.yandex_meta/licenses.list.txt b/contrib/libs/cxxsupp/libcxxabi/.yandex_meta/licenses.list.txt index af81e45ab6..093aacbb5a 100644 --- a/contrib/libs/cxxsupp/libcxxabi/.yandex_meta/licenses.list.txt +++ b/contrib/libs/cxxsupp/libcxxabi/.yandex_meta/licenses.list.txt @@ -1,381 +1,381 @@ ====================Apache-2.0==================== - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - -====================Apache-2.0 WITH LLVM-exception==================== ----- LLVM Exceptions to the Apache 2.0 License ---- - -As an exception, if, as a result of your compiling your source code, portions -of this Software are embedded into an Object form of such source code, you -may redistribute such embedded portions in such Object form without complying -with the conditions of Sections 4(a), 4(b) and 4(d) of the License. - -In addition, if you combine or link compiled forms of this Software with -software that is licensed under the GPLv2 ("Combined Software") and if a -court of competent jurisdiction determines that the patent provision (Section -3), the indemnity provision (Section 9) or other Section of the License -conflicts with the conditions of the GPLv2, you may retroactively and -prospectively choose to deem waived or otherwise exclude such Section(s) of -the License, but only in their entirety and only with respect to the Combined -Software. - - -====================Apache-2.0 WITH LLVM-exception==================== + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +====================Apache-2.0 WITH LLVM-exception==================== +---- LLVM Exceptions to the Apache 2.0 License ---- + +As an exception, if, as a result of your compiling your source code, portions +of this Software are embedded into an Object form of such source code, you +may redistribute such embedded portions in such Object form without complying +with the conditions of Sections 4(a), 4(b) and 4(d) of the License. + +In addition, if you combine or link compiled forms of this Software with +software that is licensed under the GPLv2 ("Combined Software") and if a +court of competent jurisdiction determines that the patent provision (Section +3), the indemnity provision (Section 9) or other Section of the License +conflicts with the conditions of the GPLv2, you may retroactively and +prospectively choose to deem waived or otherwise exclude such Section(s) of +the License, but only in their entirety and only with respect to the Combined +Software. + + +====================Apache-2.0 WITH LLVM-exception==================== // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. - - + + ====================Apache-2.0 WITH LLVM-exception==================== // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception - - + + ====================Apache-2.0 WITH LLVM-exception==================== The LLVM Project is under the Apache License v2.0 with LLVM Exceptions: -====================COPYRIGHT==================== +====================COPYRIGHT==================== Copyright (c) 2009-2014 by the contributors listed in CREDITS.TXT - - -====================COPYRIGHT==================== -Copyright (c) 2009-2019 by the contributors listed in CREDITS.TXT - - + + +====================COPYRIGHT==================== +Copyright (c) 2009-2019 by the contributors listed in CREDITS.TXT + + ====================File: CREDITS.TXT==================== This file is a partial list of people who have contributed to the LLVM/libc++abi project. If you have contributed a patch or made some other contribution to LLVM/libc++abi, please submit a patch to this file to add yourself, and it will be done! - + The list is sorted by surname and formatted to allow easy grepping and beautification by scripts. The fields are: name (N), email (E), web-address (W), PGP key ID and fingerprint (P), description (D), and snail-mail address (S). - + N: Aaron Ballman E: aaron@aaronballman.com D: Minor patches - + N: Logan Chien E: logan.chien@mediatek.com D: ARM EHABI Unwind & Exception Handling - + N: Marshall Clow E: mclow.lists@gmail.com E: marshall@idio.com D: Architect and primary coauthor of libc++abi - + N: Matthew Dempsky E: matthew@dempsky.org D: Minor patches and bug fixes. - + N: Nowar Gu E: wenhan.gu@gmail.com D: Minor patches and fixes - + N: Howard Hinnant E: hhinnant@apple.com D: Architect and primary coauthor of libc++abi - + N: Dana Jansens E: danakj@chromium.org D: ARM EHABI Unwind & Exception Handling - + N: Nick Kledzik E: kledzik@apple.com - + N: Antoine Labour E: piman@chromium.org D: ARM EHABI Unwind & Exception Handling - + N: Bruce Mitchener, Jr. E: bruce.mitchener@gmail.com D: Minor typo fixes - + N: Andrew Morrow E: andrew.c.morrow@gmail.com D: Minor patches and fixes - + N: Erik Olofsson E: erik.olofsson@hansoft.se E: erik@olofsson.info D: Minor patches and fixes - + N: Jon Roelofs E: jroelofs@jroelofs.com D: ARM EHABI Unwind & Exception Handling, Bare-metal - + N: Nico Weber E: thakis@chromium.org D: ARM EHABI Unwind & Exception Handling - + N: Albert J. Wong E: ajwong@google.com D: ARM EHABI Unwind & Exception Handling - - - -====================MIT==================== -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -====================NCSA==================== -Legacy LLVM License (https://llvm.org/docs/DeveloperPolicy.html#legacy): - - -====================NCSA==================== -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal with -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimers. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimers in the - documentation and/or other materials provided with the distribution. - - * Neither the names of the LLVM Team, University of Illinois at - Urbana-Champaign, nor the names of its contributors may be used to - endorse or promote products derived from this Software without specific - prior written permission. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE -SOFTWARE. - - -====================NCSA==================== -University of Illinois/NCSA -Open Source License - - -====================NCSA AND MIT==================== + + + +====================MIT==================== +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +====================NCSA==================== +Legacy LLVM License (https://llvm.org/docs/DeveloperPolicy.html#legacy): + + +====================NCSA==================== +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal with +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimers. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimers in the + documentation and/or other materials provided with the distribution. + + * Neither the names of the LLVM Team, University of Illinois at + Urbana-Champaign, nor the names of its contributors may be used to + endorse or promote products derived from this Software without specific + prior written permission. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE +SOFTWARE. + + +====================NCSA==================== +University of Illinois/NCSA +Open Source License + + +====================NCSA AND MIT==================== The libc++abi library is dual licensed under both the University of Illinois -"BSD-Like" license and the MIT license. As a user of this code you may choose -to use it under either license. As a contributor, you agree to allow your code -to be used under both. - -Full text of the relevant licenses is included below. +"BSD-Like" license and the MIT license. As a user of this code you may choose +to use it under either license. As a contributor, you agree to allow your code +to be used under both. + +Full text of the relevant licenses is included below. diff --git a/contrib/libs/cxxsupp/libcxxabi/CREDITS.TXT b/contrib/libs/cxxsupp/libcxxabi/CREDITS.TXT index fbb6cbf38b..e328cc6fc2 100644 --- a/contrib/libs/cxxsupp/libcxxabi/CREDITS.TXT +++ b/contrib/libs/cxxsupp/libcxxabi/CREDITS.TXT @@ -1,71 +1,71 @@ -This file is a partial list of people who have contributed to the LLVM/libc++abi -project. If you have contributed a patch or made some other contribution to -LLVM/libc++abi, please submit a patch to this file to add yourself, and it will be -done! - -The list is sorted by surname and formatted to allow easy grepping and -beautification by scripts. The fields are: name (N), email (E), web-address -(W), PGP key ID and fingerprint (P), description (D), and snail-mail address -(S). - -N: Aaron Ballman -E: aaron@aaronballman.com -D: Minor patches - -N: Logan Chien -E: logan.chien@mediatek.com -D: ARM EHABI Unwind & Exception Handling - -N: Marshall Clow -E: mclow.lists@gmail.com -E: marshall@idio.com -D: Architect and primary coauthor of libc++abi - -N: Matthew Dempsky -E: matthew@dempsky.org -D: Minor patches and bug fixes. - -N: Nowar Gu -E: wenhan.gu@gmail.com -D: Minor patches and fixes - -N: Howard Hinnant -E: hhinnant@apple.com -D: Architect and primary coauthor of libc++abi - -N: Dana Jansens -E: danakj@chromium.org -D: ARM EHABI Unwind & Exception Handling - -N: Nick Kledzik -E: kledzik@apple.com - -N: Antoine Labour -E: piman@chromium.org -D: ARM EHABI Unwind & Exception Handling - -N: Bruce Mitchener, Jr. -E: bruce.mitchener@gmail.com -D: Minor typo fixes - -N: Andrew Morrow -E: andrew.c.morrow@gmail.com -D: Minor patches and fixes - -N: Erik Olofsson -E: erik.olofsson@hansoft.se -E: erik@olofsson.info -D: Minor patches and fixes - -N: Jon Roelofs -E: jroelofs@jroelofs.com -D: ARM EHABI Unwind & Exception Handling, Bare-metal - -N: Nico Weber -E: thakis@chromium.org -D: ARM EHABI Unwind & Exception Handling - -N: Albert J. Wong -E: ajwong@google.com -D: ARM EHABI Unwind & Exception Handling - +This file is a partial list of people who have contributed to the LLVM/libc++abi +project. If you have contributed a patch or made some other contribution to +LLVM/libc++abi, please submit a patch to this file to add yourself, and it will be +done! + +The list is sorted by surname and formatted to allow easy grepping and +beautification by scripts. The fields are: name (N), email (E), web-address +(W), PGP key ID and fingerprint (P), description (D), and snail-mail address +(S). + +N: Aaron Ballman +E: aaron@aaronballman.com +D: Minor patches + +N: Logan Chien +E: logan.chien@mediatek.com +D: ARM EHABI Unwind & Exception Handling + +N: Marshall Clow +E: mclow.lists@gmail.com +E: marshall@idio.com +D: Architect and primary coauthor of libc++abi + +N: Matthew Dempsky +E: matthew@dempsky.org +D: Minor patches and bug fixes. + +N: Nowar Gu +E: wenhan.gu@gmail.com +D: Minor patches and fixes + +N: Howard Hinnant +E: hhinnant@apple.com +D: Architect and primary coauthor of libc++abi + +N: Dana Jansens +E: danakj@chromium.org +D: ARM EHABI Unwind & Exception Handling + +N: Nick Kledzik +E: kledzik@apple.com + +N: Antoine Labour +E: piman@chromium.org +D: ARM EHABI Unwind & Exception Handling + +N: Bruce Mitchener, Jr. +E: bruce.mitchener@gmail.com +D: Minor typo fixes + +N: Andrew Morrow +E: andrew.c.morrow@gmail.com +D: Minor patches and fixes + +N: Erik Olofsson +E: erik.olofsson@hansoft.se +E: erik@olofsson.info +D: Minor patches and fixes + +N: Jon Roelofs +E: jroelofs@jroelofs.com +D: ARM EHABI Unwind & Exception Handling, Bare-metal + +N: Nico Weber +E: thakis@chromium.org +D: ARM EHABI Unwind & Exception Handling + +N: Albert J. Wong +E: ajwong@google.com +D: ARM EHABI Unwind & Exception Handling + diff --git a/contrib/libs/cxxsupp/libcxxabi/LICENSE.TXT b/contrib/libs/cxxsupp/libcxxabi/LICENSE.TXT index b75c0441bc..b65bf60b2d 100644 --- a/contrib/libs/cxxsupp/libcxxabi/LICENSE.TXT +++ b/contrib/libs/cxxsupp/libcxxabi/LICENSE.TXT @@ -1,311 +1,311 @@ -============================================================================== -The LLVM Project is under the Apache License v2.0 with LLVM Exceptions: -============================================================================== - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - ----- LLVM Exceptions to the Apache 2.0 License ---- - -As an exception, if, as a result of your compiling your source code, portions -of this Software are embedded into an Object form of such source code, you -may redistribute such embedded portions in such Object form without complying -with the conditions of Sections 4(a), 4(b) and 4(d) of the License. - -In addition, if you combine or link compiled forms of this Software with -software that is licensed under the GPLv2 ("Combined Software") and if a -court of competent jurisdiction determines that the patent provision (Section -3), the indemnity provision (Section 9) or other Section of the License -conflicts with the conditions of the GPLv2, you may retroactively and -prospectively choose to deem waived or otherwise exclude such Section(s) of -the License, but only in their entirety and only with respect to the Combined -Software. - -============================================================================== -Software from third parties included in the LLVM Project: -============================================================================== -The LLVM Project contains third party software which is under different license -terms. All such code will be identified clearly using at least one of two -mechanisms: -1) It will be in a separate directory tree with its own `LICENSE.txt` or - `LICENSE` file at the top containing the specific license and restrictions - which apply to that software, or -2) It will contain specific license and restriction terms at the top of every - file. - -============================================================================== -Legacy LLVM License (https://llvm.org/docs/DeveloperPolicy.html#legacy): -============================================================================== - -The libc++abi library is dual licensed under both the University of Illinois -"BSD-Like" license and the MIT license. As a user of this code you may choose -to use it under either license. As a contributor, you agree to allow your code -to be used under both. - -Full text of the relevant licenses is included below. - -============================================================================== - -University of Illinois/NCSA -Open Source License - -Copyright (c) 2009-2019 by the contributors listed in CREDITS.TXT - -All rights reserved. - -Developed by: - - LLVM Team - - University of Illinois at Urbana-Champaign - - http://llvm.org - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal with -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimers. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimers in the - documentation and/or other materials provided with the distribution. - - * Neither the names of the LLVM Team, University of Illinois at - Urbana-Champaign, nor the names of its contributors may be used to - endorse or promote products derived from this Software without specific - prior written permission. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE -SOFTWARE. - -============================================================================== - -Copyright (c) 2009-2014 by the contributors listed in CREDITS.TXT - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +============================================================================== +The LLVM Project is under the Apache License v2.0 with LLVM Exceptions: +============================================================================== + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +---- LLVM Exceptions to the Apache 2.0 License ---- + +As an exception, if, as a result of your compiling your source code, portions +of this Software are embedded into an Object form of such source code, you +may redistribute such embedded portions in such Object form without complying +with the conditions of Sections 4(a), 4(b) and 4(d) of the License. + +In addition, if you combine or link compiled forms of this Software with +software that is licensed under the GPLv2 ("Combined Software") and if a +court of competent jurisdiction determines that the patent provision (Section +3), the indemnity provision (Section 9) or other Section of the License +conflicts with the conditions of the GPLv2, you may retroactively and +prospectively choose to deem waived or otherwise exclude such Section(s) of +the License, but only in their entirety and only with respect to the Combined +Software. + +============================================================================== +Software from third parties included in the LLVM Project: +============================================================================== +The LLVM Project contains third party software which is under different license +terms. All such code will be identified clearly using at least one of two +mechanisms: +1) It will be in a separate directory tree with its own `LICENSE.txt` or + `LICENSE` file at the top containing the specific license and restrictions + which apply to that software, or +2) It will contain specific license and restriction terms at the top of every + file. + +============================================================================== +Legacy LLVM License (https://llvm.org/docs/DeveloperPolicy.html#legacy): +============================================================================== + +The libc++abi library is dual licensed under both the University of Illinois +"BSD-Like" license and the MIT license. As a user of this code you may choose +to use it under either license. As a contributor, you agree to allow your code +to be used under both. + +Full text of the relevant licenses is included below. + +============================================================================== + +University of Illinois/NCSA +Open Source License + +Copyright (c) 2009-2019 by the contributors listed in CREDITS.TXT + +All rights reserved. + +Developed by: + + LLVM Team + + University of Illinois at Urbana-Champaign + + http://llvm.org + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal with +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimers. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimers in the + documentation and/or other materials provided with the distribution. + + * Neither the names of the LLVM Team, University of Illinois at + Urbana-Champaign, nor the names of its contributors may be used to + endorse or promote products derived from this Software without specific + prior written permission. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE +SOFTWARE. + +============================================================================== + +Copyright (c) 2009-2014 by the contributors listed in CREDITS.TXT + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/contrib/libs/cxxsupp/libcxxabi/include/__cxxabi_config.h b/contrib/libs/cxxsupp/libcxxabi/include/__cxxabi_config.h index 7bc39ada8d..3537f9d1f2 100644 --- a/contrib/libs/cxxsupp/libcxxabi/include/__cxxabi_config.h +++ b/contrib/libs/cxxsupp/libcxxabi/include/__cxxabi_config.h @@ -1,100 +1,100 @@ //===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#ifndef ____CXXABI_CONFIG_H -#define ____CXXABI_CONFIG_H - -#if defined(__arm__) && !defined(__USING_SJLJ_EXCEPTIONS__) && \ - !defined(__ARM_DWARF_EH__) -#define _LIBCXXABI_ARM_EHABI -#endif - -#if !defined(__has_attribute) -#define __has_attribute(_attribute_) 0 -#endif - -#if defined(__clang__) -# define _LIBCXXABI_COMPILER_CLANG -# ifndef __apple_build_version__ -# define _LIBCXXABI_CLANG_VER (__clang_major__ * 100 + __clang_minor__) -# endif -#elif defined(__GNUC__) -# define _LIBCXXABI_COMPILER_GCC -#elif defined(_MSC_VER) -# define _LIBCXXABI_COMPILER_MSVC -#elif defined(__IBMCPP__) -# define _LIBCXXABI_COMPILER_IBM -#endif - -#if defined(_WIN32) - #if defined(_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS) - #define _LIBCXXABI_HIDDEN - #define _LIBCXXABI_DATA_VIS - #define _LIBCXXABI_FUNC_VIS - #define _LIBCXXABI_TYPE_VIS - #elif defined(_LIBCXXABI_BUILDING_LIBRARY) - #define _LIBCXXABI_HIDDEN - #define _LIBCXXABI_DATA_VIS __declspec(dllexport) - #define _LIBCXXABI_FUNC_VIS __declspec(dllexport) - #define _LIBCXXABI_TYPE_VIS __declspec(dllexport) - #else - #define _LIBCXXABI_HIDDEN - #define _LIBCXXABI_DATA_VIS __declspec(dllimport) - #define _LIBCXXABI_FUNC_VIS __declspec(dllimport) - #define _LIBCXXABI_TYPE_VIS __declspec(dllimport) - #endif -#else - #if !defined(_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS) - #define _LIBCXXABI_HIDDEN __attribute__((__visibility__("hidden"))) - #define _LIBCXXABI_DATA_VIS __attribute__((__visibility__("default"))) - #define _LIBCXXABI_FUNC_VIS __attribute__((__visibility__("default"))) - #if __has_attribute(__type_visibility__) - #define _LIBCXXABI_TYPE_VIS __attribute__((__type_visibility__("default"))) - #else - #define _LIBCXXABI_TYPE_VIS __attribute__((__visibility__("default"))) - #endif - #else - #define _LIBCXXABI_HIDDEN - #define _LIBCXXABI_DATA_VIS - #define _LIBCXXABI_FUNC_VIS - #define _LIBCXXABI_TYPE_VIS - #endif -#endif - -#if defined(_LIBCXXABI_COMPILER_MSVC) -#define _LIBCXXABI_WEAK -#else -#define _LIBCXXABI_WEAK __attribute__((__weak__)) -#endif - -#if defined(__clang__) -#define _LIBCXXABI_COMPILER_CLANG -#elif defined(__GNUC__) -#define _LIBCXXABI_COMPILER_GCC -#endif - -#if __has_attribute(__no_sanitize__) && defined(_LIBCXXABI_COMPILER_CLANG) -#define _LIBCXXABI_NO_CFI __attribute__((__no_sanitize__("cfi"))) -#else -#define _LIBCXXABI_NO_CFI -#endif - -// wasm32 follows the arm32 ABI convention of using 32-bit guard. -#if defined(__arm__) || defined(__wasm32__) || defined(__ARM64_ARCH_8_32__) -# define _LIBCXXABI_GUARD_ABI_ARM -#endif - -#if defined(_LIBCXXABI_COMPILER_CLANG) -# if !__has_feature(cxx_exceptions) -# define _LIBCXXABI_NO_EXCEPTIONS -# endif +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef ____CXXABI_CONFIG_H +#define ____CXXABI_CONFIG_H + +#if defined(__arm__) && !defined(__USING_SJLJ_EXCEPTIONS__) && \ + !defined(__ARM_DWARF_EH__) +#define _LIBCXXABI_ARM_EHABI +#endif + +#if !defined(__has_attribute) +#define __has_attribute(_attribute_) 0 +#endif + +#if defined(__clang__) +# define _LIBCXXABI_COMPILER_CLANG +# ifndef __apple_build_version__ +# define _LIBCXXABI_CLANG_VER (__clang_major__ * 100 + __clang_minor__) +# endif +#elif defined(__GNUC__) +# define _LIBCXXABI_COMPILER_GCC +#elif defined(_MSC_VER) +# define _LIBCXXABI_COMPILER_MSVC +#elif defined(__IBMCPP__) +# define _LIBCXXABI_COMPILER_IBM +#endif + +#if defined(_WIN32) + #if defined(_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS) + #define _LIBCXXABI_HIDDEN + #define _LIBCXXABI_DATA_VIS + #define _LIBCXXABI_FUNC_VIS + #define _LIBCXXABI_TYPE_VIS + #elif defined(_LIBCXXABI_BUILDING_LIBRARY) + #define _LIBCXXABI_HIDDEN + #define _LIBCXXABI_DATA_VIS __declspec(dllexport) + #define _LIBCXXABI_FUNC_VIS __declspec(dllexport) + #define _LIBCXXABI_TYPE_VIS __declspec(dllexport) + #else + #define _LIBCXXABI_HIDDEN + #define _LIBCXXABI_DATA_VIS __declspec(dllimport) + #define _LIBCXXABI_FUNC_VIS __declspec(dllimport) + #define _LIBCXXABI_TYPE_VIS __declspec(dllimport) + #endif +#else + #if !defined(_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS) + #define _LIBCXXABI_HIDDEN __attribute__((__visibility__("hidden"))) + #define _LIBCXXABI_DATA_VIS __attribute__((__visibility__("default"))) + #define _LIBCXXABI_FUNC_VIS __attribute__((__visibility__("default"))) + #if __has_attribute(__type_visibility__) + #define _LIBCXXABI_TYPE_VIS __attribute__((__type_visibility__("default"))) + #else + #define _LIBCXXABI_TYPE_VIS __attribute__((__visibility__("default"))) + #endif + #else + #define _LIBCXXABI_HIDDEN + #define _LIBCXXABI_DATA_VIS + #define _LIBCXXABI_FUNC_VIS + #define _LIBCXXABI_TYPE_VIS + #endif +#endif + +#if defined(_LIBCXXABI_COMPILER_MSVC) +#define _LIBCXXABI_WEAK +#else +#define _LIBCXXABI_WEAK __attribute__((__weak__)) +#endif + +#if defined(__clang__) +#define _LIBCXXABI_COMPILER_CLANG +#elif defined(__GNUC__) +#define _LIBCXXABI_COMPILER_GCC +#endif + +#if __has_attribute(__no_sanitize__) && defined(_LIBCXXABI_COMPILER_CLANG) +#define _LIBCXXABI_NO_CFI __attribute__((__no_sanitize__("cfi"))) +#else +#define _LIBCXXABI_NO_CFI +#endif + +// wasm32 follows the arm32 ABI convention of using 32-bit guard. +#if defined(__arm__) || defined(__wasm32__) || defined(__ARM64_ARCH_8_32__) +# define _LIBCXXABI_GUARD_ABI_ARM +#endif + +#if defined(_LIBCXXABI_COMPILER_CLANG) +# if !__has_feature(cxx_exceptions) +# define _LIBCXXABI_NO_EXCEPTIONS +# endif #elif defined(_LIBCXXABI_COMPILER_GCC) && !defined(__EXCEPTIONS) -# define _LIBCXXABI_NO_EXCEPTIONS -#endif - -#endif // ____CXXABI_CONFIG_H +# define _LIBCXXABI_NO_EXCEPTIONS +#endif + +#endif // ____CXXABI_CONFIG_H diff --git a/contrib/libs/cxxsupp/libcxxabi/include/cxxabi.h b/contrib/libs/cxxsupp/libcxxabi/include/cxxabi.h index eaa324dc68..1ad21bfa0b 100644 --- a/contrib/libs/cxxsupp/libcxxabi/include/cxxabi.h +++ b/contrib/libs/cxxsupp/libcxxabi/include/cxxabi.h @@ -1,177 +1,177 @@ //===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#ifndef __CXXABI_H -#define __CXXABI_H - -/* - * This header provides the interface to the C++ ABI as defined at: - * https://itanium-cxx-abi.github.io/cxx-abi/ - */ - -#include <stddef.h> -#include <stdint.h> - -#include <__cxxabi_config.h> - -#define _LIBCPPABI_VERSION 1002 -#define _LIBCXXABI_NORETURN __attribute__((noreturn)) -#define _LIBCXXABI_ALWAYS_COLD __attribute__((cold)) - -#ifdef __cplusplus - -namespace std { -#if defined(_WIN32) -class _LIBCXXABI_TYPE_VIS type_info; // forward declaration -#else -class type_info; // forward declaration -#endif -} - - -// runtime routines use C calling conventions, but are in __cxxabiv1 namespace -namespace __cxxabiv1 { -extern "C" { - -// 2.4.2 Allocating the Exception Object -extern _LIBCXXABI_FUNC_VIS void * -__cxa_allocate_exception(size_t thrown_size) throw(); -extern _LIBCXXABI_FUNC_VIS void -__cxa_free_exception(void *thrown_exception) throw(); - -// 2.4.3 Throwing the Exception Object -extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_NORETURN void -__cxa_throw(void *thrown_exception, std::type_info *tinfo, - void (*dest)(void *)); - -// 2.5.3 Exception Handlers -extern _LIBCXXABI_FUNC_VIS void * -__cxa_get_exception_ptr(void *exceptionObject) throw(); -extern _LIBCXXABI_FUNC_VIS void * -__cxa_begin_catch(void *exceptionObject) throw(); -extern _LIBCXXABI_FUNC_VIS void __cxa_end_catch(); -#if defined(_LIBCXXABI_ARM_EHABI) -extern _LIBCXXABI_FUNC_VIS bool -__cxa_begin_cleanup(void *exceptionObject) throw(); -extern _LIBCXXABI_FUNC_VIS void __cxa_end_cleanup(); -#endif -extern _LIBCXXABI_FUNC_VIS std::type_info *__cxa_current_exception_type(); - -// 2.5.4 Rethrowing Exceptions -extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_NORETURN void __cxa_rethrow(); - -// 2.6 Auxiliary Runtime APIs -extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_NORETURN void __cxa_bad_cast(void); -extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_NORETURN void __cxa_bad_typeid(void); -extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_NORETURN void -__cxa_throw_bad_array_new_length(void); - -// 3.2.6 Pure Virtual Function API -extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_NORETURN void __cxa_pure_virtual(void); - -// 3.2.7 Deleted Virtual Function API -extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_NORETURN void __cxa_deleted_virtual(void); - -// 3.3.2 One-time Construction API -#if defined(_LIBCXXABI_GUARD_ABI_ARM) -extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_ALWAYS_COLD int __cxa_guard_acquire(uint32_t *); -extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_ALWAYS_COLD void __cxa_guard_release(uint32_t *); -extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_ALWAYS_COLD void __cxa_guard_abort(uint32_t *); -#else -extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_ALWAYS_COLD int __cxa_guard_acquire(uint64_t *); -extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_ALWAYS_COLD void __cxa_guard_release(uint64_t *); -extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_ALWAYS_COLD void __cxa_guard_abort(uint64_t *); -#endif - -// 3.3.3 Array Construction and Destruction API -extern _LIBCXXABI_FUNC_VIS void * -__cxa_vec_new(size_t element_count, size_t element_size, size_t padding_size, - void (*constructor)(void *), void (*destructor)(void *)); - -extern _LIBCXXABI_FUNC_VIS void * -__cxa_vec_new2(size_t element_count, size_t element_size, size_t padding_size, - void (*constructor)(void *), void (*destructor)(void *), - void *(*alloc)(size_t), void (*dealloc)(void *)); - -extern _LIBCXXABI_FUNC_VIS void * -__cxa_vec_new3(size_t element_count, size_t element_size, size_t padding_size, - void (*constructor)(void *), void (*destructor)(void *), - void *(*alloc)(size_t), void (*dealloc)(void *, size_t)); - -extern _LIBCXXABI_FUNC_VIS void -__cxa_vec_ctor(void *array_address, size_t element_count, size_t element_size, - void (*constructor)(void *), void (*destructor)(void *)); - -extern _LIBCXXABI_FUNC_VIS void __cxa_vec_dtor(void *array_address, - size_t element_count, - size_t element_size, - void (*destructor)(void *)); - -extern _LIBCXXABI_FUNC_VIS void __cxa_vec_cleanup(void *array_address, - size_t element_count, - size_t element_size, - void (*destructor)(void *)); - -extern _LIBCXXABI_FUNC_VIS void __cxa_vec_delete(void *array_address, - size_t element_size, - size_t padding_size, - void (*destructor)(void *)); - -extern _LIBCXXABI_FUNC_VIS void -__cxa_vec_delete2(void *array_address, size_t element_size, size_t padding_size, - void (*destructor)(void *), void (*dealloc)(void *)); - -extern _LIBCXXABI_FUNC_VIS void -__cxa_vec_delete3(void *__array_address, size_t element_size, - size_t padding_size, void (*destructor)(void *), - void (*dealloc)(void *, size_t)); - -extern _LIBCXXABI_FUNC_VIS void -__cxa_vec_cctor(void *dest_array, void *src_array, size_t element_count, - size_t element_size, void (*constructor)(void *, void *), - void (*destructor)(void *)); - -// 3.3.5.3 Runtime API -// These functions are part of the C++ ABI, but they are not defined in libc++abi: -// int __cxa_atexit(void (*)(void *), void *, void *); -// void __cxa_finalize(void *); - -// 3.4 Demangler API -extern _LIBCXXABI_FUNC_VIS char *__cxa_demangle(const char *mangled_name, - char *output_buffer, - size_t *length, int *status); - -// Apple additions to support C++ 0x exception_ptr class -// These are primitives to wrap a smart pointer around an exception object -extern _LIBCXXABI_FUNC_VIS void *__cxa_current_primary_exception() throw(); -extern _LIBCXXABI_FUNC_VIS void -__cxa_rethrow_primary_exception(void *primary_exception); -extern _LIBCXXABI_FUNC_VIS void -__cxa_increment_exception_refcount(void *primary_exception) throw(); -extern _LIBCXXABI_FUNC_VIS void -__cxa_decrement_exception_refcount(void *primary_exception) throw(); - -// Apple extension to support std::uncaught_exception() -extern _LIBCXXABI_FUNC_VIS bool __cxa_uncaught_exception() throw(); -extern _LIBCXXABI_FUNC_VIS unsigned int __cxa_uncaught_exceptions() throw(); - -#if defined(__linux__) || defined(__Fuchsia__) -// Linux and Fuchsia TLS support. Not yet an official part of the Itanium ABI. -// https://sourceware.org/glibc/wiki/Destructor%20support%20for%20thread_local%20variables -extern _LIBCXXABI_FUNC_VIS int __cxa_thread_atexit(void (*)(void *), void *, - void *) throw(); -#endif - -} // extern "C" -} // namespace __cxxabiv1 - -namespace abi = __cxxabiv1; - -#endif // __cplusplus - -#endif // __CXXABI_H +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef __CXXABI_H +#define __CXXABI_H + +/* + * This header provides the interface to the C++ ABI as defined at: + * https://itanium-cxx-abi.github.io/cxx-abi/ + */ + +#include <stddef.h> +#include <stdint.h> + +#include <__cxxabi_config.h> + +#define _LIBCPPABI_VERSION 1002 +#define _LIBCXXABI_NORETURN __attribute__((noreturn)) +#define _LIBCXXABI_ALWAYS_COLD __attribute__((cold)) + +#ifdef __cplusplus + +namespace std { +#if defined(_WIN32) +class _LIBCXXABI_TYPE_VIS type_info; // forward declaration +#else +class type_info; // forward declaration +#endif +} + + +// runtime routines use C calling conventions, but are in __cxxabiv1 namespace +namespace __cxxabiv1 { +extern "C" { + +// 2.4.2 Allocating the Exception Object +extern _LIBCXXABI_FUNC_VIS void * +__cxa_allocate_exception(size_t thrown_size) throw(); +extern _LIBCXXABI_FUNC_VIS void +__cxa_free_exception(void *thrown_exception) throw(); + +// 2.4.3 Throwing the Exception Object +extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_NORETURN void +__cxa_throw(void *thrown_exception, std::type_info *tinfo, + void (*dest)(void *)); + +// 2.5.3 Exception Handlers +extern _LIBCXXABI_FUNC_VIS void * +__cxa_get_exception_ptr(void *exceptionObject) throw(); +extern _LIBCXXABI_FUNC_VIS void * +__cxa_begin_catch(void *exceptionObject) throw(); +extern _LIBCXXABI_FUNC_VIS void __cxa_end_catch(); +#if defined(_LIBCXXABI_ARM_EHABI) +extern _LIBCXXABI_FUNC_VIS bool +__cxa_begin_cleanup(void *exceptionObject) throw(); +extern _LIBCXXABI_FUNC_VIS void __cxa_end_cleanup(); +#endif +extern _LIBCXXABI_FUNC_VIS std::type_info *__cxa_current_exception_type(); + +// 2.5.4 Rethrowing Exceptions +extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_NORETURN void __cxa_rethrow(); + +// 2.6 Auxiliary Runtime APIs +extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_NORETURN void __cxa_bad_cast(void); +extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_NORETURN void __cxa_bad_typeid(void); +extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_NORETURN void +__cxa_throw_bad_array_new_length(void); + +// 3.2.6 Pure Virtual Function API +extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_NORETURN void __cxa_pure_virtual(void); + +// 3.2.7 Deleted Virtual Function API +extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_NORETURN void __cxa_deleted_virtual(void); + +// 3.3.2 One-time Construction API +#if defined(_LIBCXXABI_GUARD_ABI_ARM) +extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_ALWAYS_COLD int __cxa_guard_acquire(uint32_t *); +extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_ALWAYS_COLD void __cxa_guard_release(uint32_t *); +extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_ALWAYS_COLD void __cxa_guard_abort(uint32_t *); +#else +extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_ALWAYS_COLD int __cxa_guard_acquire(uint64_t *); +extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_ALWAYS_COLD void __cxa_guard_release(uint64_t *); +extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_ALWAYS_COLD void __cxa_guard_abort(uint64_t *); +#endif + +// 3.3.3 Array Construction and Destruction API +extern _LIBCXXABI_FUNC_VIS void * +__cxa_vec_new(size_t element_count, size_t element_size, size_t padding_size, + void (*constructor)(void *), void (*destructor)(void *)); + +extern _LIBCXXABI_FUNC_VIS void * +__cxa_vec_new2(size_t element_count, size_t element_size, size_t padding_size, + void (*constructor)(void *), void (*destructor)(void *), + void *(*alloc)(size_t), void (*dealloc)(void *)); + +extern _LIBCXXABI_FUNC_VIS void * +__cxa_vec_new3(size_t element_count, size_t element_size, size_t padding_size, + void (*constructor)(void *), void (*destructor)(void *), + void *(*alloc)(size_t), void (*dealloc)(void *, size_t)); + +extern _LIBCXXABI_FUNC_VIS void +__cxa_vec_ctor(void *array_address, size_t element_count, size_t element_size, + void (*constructor)(void *), void (*destructor)(void *)); + +extern _LIBCXXABI_FUNC_VIS void __cxa_vec_dtor(void *array_address, + size_t element_count, + size_t element_size, + void (*destructor)(void *)); + +extern _LIBCXXABI_FUNC_VIS void __cxa_vec_cleanup(void *array_address, + size_t element_count, + size_t element_size, + void (*destructor)(void *)); + +extern _LIBCXXABI_FUNC_VIS void __cxa_vec_delete(void *array_address, + size_t element_size, + size_t padding_size, + void (*destructor)(void *)); + +extern _LIBCXXABI_FUNC_VIS void +__cxa_vec_delete2(void *array_address, size_t element_size, size_t padding_size, + void (*destructor)(void *), void (*dealloc)(void *)); + +extern _LIBCXXABI_FUNC_VIS void +__cxa_vec_delete3(void *__array_address, size_t element_size, + size_t padding_size, void (*destructor)(void *), + void (*dealloc)(void *, size_t)); + +extern _LIBCXXABI_FUNC_VIS void +__cxa_vec_cctor(void *dest_array, void *src_array, size_t element_count, + size_t element_size, void (*constructor)(void *, void *), + void (*destructor)(void *)); + +// 3.3.5.3 Runtime API +// These functions are part of the C++ ABI, but they are not defined in libc++abi: +// int __cxa_atexit(void (*)(void *), void *, void *); +// void __cxa_finalize(void *); + +// 3.4 Demangler API +extern _LIBCXXABI_FUNC_VIS char *__cxa_demangle(const char *mangled_name, + char *output_buffer, + size_t *length, int *status); + +// Apple additions to support C++ 0x exception_ptr class +// These are primitives to wrap a smart pointer around an exception object +extern _LIBCXXABI_FUNC_VIS void *__cxa_current_primary_exception() throw(); +extern _LIBCXXABI_FUNC_VIS void +__cxa_rethrow_primary_exception(void *primary_exception); +extern _LIBCXXABI_FUNC_VIS void +__cxa_increment_exception_refcount(void *primary_exception) throw(); +extern _LIBCXXABI_FUNC_VIS void +__cxa_decrement_exception_refcount(void *primary_exception) throw(); + +// Apple extension to support std::uncaught_exception() +extern _LIBCXXABI_FUNC_VIS bool __cxa_uncaught_exception() throw(); +extern _LIBCXXABI_FUNC_VIS unsigned int __cxa_uncaught_exceptions() throw(); + +#if defined(__linux__) || defined(__Fuchsia__) +// Linux and Fuchsia TLS support. Not yet an official part of the Itanium ABI. +// https://sourceware.org/glibc/wiki/Destructor%20support%20for%20thread_local%20variables +extern _LIBCXXABI_FUNC_VIS int __cxa_thread_atexit(void (*)(void *), void *, + void *) throw(); +#endif + +} // extern "C" +} // namespace __cxxabiv1 + +namespace abi = __cxxabiv1; + +#endif // __cplusplus + +#endif // __CXXABI_H diff --git a/contrib/libs/cxxsupp/libcxxabi/src/abort_message.cpp b/contrib/libs/cxxsupp/libcxxabi/src/abort_message.cpp index 859a5031b9..fe80f598ef 100644 --- a/contrib/libs/cxxsupp/libcxxabi/src/abort_message.cpp +++ b/contrib/libs/cxxsupp/libcxxabi/src/abort_message.cpp @@ -1,79 +1,79 @@ //===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#include <stdlib.h> -#include <stdio.h> -#include <stdarg.h> -#include "abort_message.h" - -#ifdef __BIONIC__ -# include <android/api-level.h> -# if __ANDROID_API__ >= 21 -# include <syslog.h> - extern "C" void android_set_abort_message(const char* msg); -# else -# include <assert.h> -# endif // __ANDROID_API__ >= 21 -#endif // __BIONIC__ - -#if defined(__APPLE__) && __has_include(<CrashReporterClient.h>) -# include <CrashReporterClient.h> -# define _LIBCXXABI_USE_CRASHREPORTER_CLIENT -#endif - -void abort_message(const char* format, ...) -{ - // Write message to stderr. We do this before formatting into a - // variable-size buffer so that we still get some information if - // formatting into the variable-sized buffer fails. -#if !defined(NDEBUG) || !defined(LIBCXXABI_BAREMETAL) - { - fprintf(stderr, "libc++abi: "); - va_list list; - va_start(list, format); - vfprintf(stderr, format, list); - va_end(list); - fprintf(stderr, "\n"); - } -#endif - - // Format the arguments into an allocated buffer. We leak the buffer on - // purpose, since we're about to abort() anyway. -#if defined(_LIBCXXABI_USE_CRASHREPORTER_CLIENT) - char* buffer; - va_list list; - va_start(list, format); - vasprintf(&buffer, format, list); - va_end(list); - - CRSetCrashLogMessage(buffer); -#elif defined(__BIONIC__) - char* buffer; - va_list list; - va_start(list, format); - vasprintf(&buffer, format, list); - va_end(list); - -# if __ANDROID_API__ >= 21 - // Show error in tombstone. - android_set_abort_message(buffer); - - // Show error in logcat. - openlog("libc++abi", 0, 0); - syslog(LOG_CRIT, "%s", buffer); - closelog(); -# else - // The good error reporting wasn't available in Android until L. Since we're - // about to abort anyway, just call __assert2, which will log _somewhere_ - // (tombstone and/or logcat) in older releases. - __assert2(__FILE__, __LINE__, __func__, buffer); -# endif // __ANDROID_API__ >= 21 -#endif // __BIONIC__ - - abort(); -} +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include <stdlib.h> +#include <stdio.h> +#include <stdarg.h> +#include "abort_message.h" + +#ifdef __BIONIC__ +# include <android/api-level.h> +# if __ANDROID_API__ >= 21 +# include <syslog.h> + extern "C" void android_set_abort_message(const char* msg); +# else +# include <assert.h> +# endif // __ANDROID_API__ >= 21 +#endif // __BIONIC__ + +#if defined(__APPLE__) && __has_include(<CrashReporterClient.h>) +# include <CrashReporterClient.h> +# define _LIBCXXABI_USE_CRASHREPORTER_CLIENT +#endif + +void abort_message(const char* format, ...) +{ + // Write message to stderr. We do this before formatting into a + // variable-size buffer so that we still get some information if + // formatting into the variable-sized buffer fails. +#if !defined(NDEBUG) || !defined(LIBCXXABI_BAREMETAL) + { + fprintf(stderr, "libc++abi: "); + va_list list; + va_start(list, format); + vfprintf(stderr, format, list); + va_end(list); + fprintf(stderr, "\n"); + } +#endif + + // Format the arguments into an allocated buffer. We leak the buffer on + // purpose, since we're about to abort() anyway. +#if defined(_LIBCXXABI_USE_CRASHREPORTER_CLIENT) + char* buffer; + va_list list; + va_start(list, format); + vasprintf(&buffer, format, list); + va_end(list); + + CRSetCrashLogMessage(buffer); +#elif defined(__BIONIC__) + char* buffer; + va_list list; + va_start(list, format); + vasprintf(&buffer, format, list); + va_end(list); + +# if __ANDROID_API__ >= 21 + // Show error in tombstone. + android_set_abort_message(buffer); + + // Show error in logcat. + openlog("libc++abi", 0, 0); + syslog(LOG_CRIT, "%s", buffer); + closelog(); +# else + // The good error reporting wasn't available in Android until L. Since we're + // about to abort anyway, just call __assert2, which will log _somewhere_ + // (tombstone and/or logcat) in older releases. + __assert2(__FILE__, __LINE__, __func__, buffer); +# endif // __ANDROID_API__ >= 21 +#endif // __BIONIC__ + + abort(); +} diff --git a/contrib/libs/cxxsupp/libcxxabi/src/abort_message.h b/contrib/libs/cxxsupp/libcxxabi/src/abort_message.h index f1d5c12e25..9746e609c3 100644 --- a/contrib/libs/cxxsupp/libcxxabi/src/abort_message.h +++ b/contrib/libs/cxxsupp/libcxxabi/src/abort_message.h @@ -1,17 +1,17 @@ //===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#ifndef __ABORT_MESSAGE_H_ -#define __ABORT_MESSAGE_H_ - -#include "cxxabi.h" - -extern "C" _LIBCXXABI_HIDDEN _LIBCXXABI_NORETURN void -abort_message(const char *format, ...) __attribute__((format(printf, 1, 2))); - -#endif +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef __ABORT_MESSAGE_H_ +#define __ABORT_MESSAGE_H_ + +#include "cxxabi.h" + +extern "C" _LIBCXXABI_HIDDEN _LIBCXXABI_NORETURN void +abort_message(const char *format, ...) __attribute__((format(printf, 1, 2))); + +#endif diff --git a/contrib/libs/cxxsupp/libcxxabi/src/cxa_aux_runtime.cpp b/contrib/libs/cxxsupp/libcxxabi/src/cxa_aux_runtime.cpp index a42990c7ef..2ef1c693bd 100644 --- a/contrib/libs/cxxsupp/libcxxabi/src/cxa_aux_runtime.cpp +++ b/contrib/libs/cxxsupp/libcxxabi/src/cxa_aux_runtime.cpp @@ -1,43 +1,43 @@ //===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// -// This file implements the "Auxiliary Runtime APIs" -// https://itanium-cxx-abi.github.io/cxx-abi/abi-eh.html#cxx-aux -//===----------------------------------------------------------------------===// - -#include "cxxabi.h" -#include <new> -#include <typeinfo> - -namespace __cxxabiv1 { -extern "C" { -_LIBCXXABI_FUNC_VIS _LIBCXXABI_NORETURN void __cxa_bad_cast(void) { -#ifndef _LIBCXXABI_NO_EXCEPTIONS - throw std::bad_cast(); -#else - std::terminate(); -#endif -} - -_LIBCXXABI_FUNC_VIS _LIBCXXABI_NORETURN void __cxa_bad_typeid(void) { -#ifndef _LIBCXXABI_NO_EXCEPTIONS - throw std::bad_typeid(); -#else - std::terminate(); -#endif -} - -_LIBCXXABI_FUNC_VIS _LIBCXXABI_NORETURN void -__cxa_throw_bad_array_new_length(void) { -#ifndef _LIBCXXABI_NO_EXCEPTIONS - throw std::bad_array_new_length(); -#else - std::terminate(); -#endif -} -} // extern "C" -} // abi +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// +// This file implements the "Auxiliary Runtime APIs" +// https://itanium-cxx-abi.github.io/cxx-abi/abi-eh.html#cxx-aux +//===----------------------------------------------------------------------===// + +#include "cxxabi.h" +#include <new> +#include <typeinfo> + +namespace __cxxabiv1 { +extern "C" { +_LIBCXXABI_FUNC_VIS _LIBCXXABI_NORETURN void __cxa_bad_cast(void) { +#ifndef _LIBCXXABI_NO_EXCEPTIONS + throw std::bad_cast(); +#else + std::terminate(); +#endif +} + +_LIBCXXABI_FUNC_VIS _LIBCXXABI_NORETURN void __cxa_bad_typeid(void) { +#ifndef _LIBCXXABI_NO_EXCEPTIONS + throw std::bad_typeid(); +#else + std::terminate(); +#endif +} + +_LIBCXXABI_FUNC_VIS _LIBCXXABI_NORETURN void +__cxa_throw_bad_array_new_length(void) { +#ifndef _LIBCXXABI_NO_EXCEPTIONS + throw std::bad_array_new_length(); +#else + std::terminate(); +#endif +} +} // extern "C" +} // abi diff --git a/contrib/libs/cxxsupp/libcxxabi/src/cxa_default_handlers.cpp b/contrib/libs/cxxsupp/libcxxabi/src/cxa_default_handlers.cpp index e0ccbe1195..02c3f3584f 100644 --- a/contrib/libs/cxxsupp/libcxxabi/src/cxa_default_handlers.cpp +++ b/contrib/libs/cxxsupp/libcxxabi/src/cxa_default_handlers.cpp @@ -1,138 +1,138 @@ //===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// // This file implements the default terminate_handler, unexpected_handler and // new_handler. -//===----------------------------------------------------------------------===// - -#include <exception> -#include <stdlib.h> -#include "abort_message.h" -#include "cxxabi.h" -#include "cxa_handlers.h" -#include "cxa_exception.h" -#include "private_typeinfo.h" +//===----------------------------------------------------------------------===// + +#include <exception> +#include <stdlib.h> +#include "abort_message.h" +#include "cxxabi.h" +#include "cxa_handlers.h" +#include "cxa_exception.h" +#include "private_typeinfo.h" #include "include/atomic_support.h" // from libc++ - -#if !defined(LIBCXXABI_SILENT_TERMINATE) - -_LIBCPP_SAFE_STATIC -static const char* cause = "uncaught"; - -__attribute__((noreturn)) -static void demangling_terminate_handler() -{ -#ifndef _LIBCXXABI_NO_EXCEPTIONS - // If there might be an uncaught exception - using namespace __cxxabiv1; - __cxa_eh_globals* globals = __cxa_get_globals_fast(); - if (globals) - { - __cxa_exception* exception_header = globals->caughtExceptions; - // If there is an uncaught exception - if (exception_header) - { - _Unwind_Exception* unwind_exception = - reinterpret_cast<_Unwind_Exception*>(exception_header + 1) - 1; - if (__isOurExceptionClass(unwind_exception)) - { - void* thrown_object = - __getExceptionClass(unwind_exception) == kOurDependentExceptionClass ? - ((__cxa_dependent_exception*)exception_header)->primaryException : - exception_header + 1; - const __shim_type_info* thrown_type = - static_cast<const __shim_type_info*>(exception_header->exceptionType); -#if !defined(LIBCXXABI_NON_DEMANGLING_TERMINATE) - // Try to get demangled name of thrown_type - int status; - char buf[1024]; - size_t len = sizeof(buf); - const char* name = __cxa_demangle(thrown_type->name(), buf, &len, &status); - if (status != 0) - name = thrown_type->name(); -#else - const char* name = thrown_type->name(); -#endif - // If the uncaught exception can be caught with std::exception& - const __shim_type_info* catch_type = - static_cast<const __shim_type_info*>(&typeid(std::exception)); - if (catch_type->can_catch(thrown_type, thrown_object)) - { - // Include the what() message from the exception - const std::exception* e = static_cast<const std::exception*>(thrown_object); - abort_message("terminating with %s exception of type %s: %s", - cause, name, e->what()); - } - else - // Else just note that we're terminating with an exception - abort_message("terminating with %s exception of type %s", - cause, name); - } - else - // Else we're terminating with a foreign exception - abort_message("terminating with %s foreign exception", cause); - } - } -#endif - // Else just note that we're terminating - abort_message("terminating"); -} - -__attribute__((noreturn)) -static void demangling_unexpected_handler() -{ - cause = "unexpected"; - std::terminate(); -} - -static constexpr std::terminate_handler default_terminate_handler = demangling_terminate_handler; -static constexpr std::terminate_handler default_unexpected_handler = demangling_unexpected_handler; -#else -static constexpr std::terminate_handler default_terminate_handler = ::abort; -static constexpr std::terminate_handler default_unexpected_handler = std::terminate; -#endif - -// -// Global variables that hold the pointers to the current handler -// -_LIBCXXABI_DATA_VIS -_LIBCPP_SAFE_STATIC std::terminate_handler __cxa_terminate_handler = default_terminate_handler; - -_LIBCXXABI_DATA_VIS -_LIBCPP_SAFE_STATIC std::unexpected_handler __cxa_unexpected_handler = default_unexpected_handler; - + +#if !defined(LIBCXXABI_SILENT_TERMINATE) + +_LIBCPP_SAFE_STATIC +static const char* cause = "uncaught"; + +__attribute__((noreturn)) +static void demangling_terminate_handler() +{ +#ifndef _LIBCXXABI_NO_EXCEPTIONS + // If there might be an uncaught exception + using namespace __cxxabiv1; + __cxa_eh_globals* globals = __cxa_get_globals_fast(); + if (globals) + { + __cxa_exception* exception_header = globals->caughtExceptions; + // If there is an uncaught exception + if (exception_header) + { + _Unwind_Exception* unwind_exception = + reinterpret_cast<_Unwind_Exception*>(exception_header + 1) - 1; + if (__isOurExceptionClass(unwind_exception)) + { + void* thrown_object = + __getExceptionClass(unwind_exception) == kOurDependentExceptionClass ? + ((__cxa_dependent_exception*)exception_header)->primaryException : + exception_header + 1; + const __shim_type_info* thrown_type = + static_cast<const __shim_type_info*>(exception_header->exceptionType); +#if !defined(LIBCXXABI_NON_DEMANGLING_TERMINATE) + // Try to get demangled name of thrown_type + int status; + char buf[1024]; + size_t len = sizeof(buf); + const char* name = __cxa_demangle(thrown_type->name(), buf, &len, &status); + if (status != 0) + name = thrown_type->name(); +#else + const char* name = thrown_type->name(); +#endif + // If the uncaught exception can be caught with std::exception& + const __shim_type_info* catch_type = + static_cast<const __shim_type_info*>(&typeid(std::exception)); + if (catch_type->can_catch(thrown_type, thrown_object)) + { + // Include the what() message from the exception + const std::exception* e = static_cast<const std::exception*>(thrown_object); + abort_message("terminating with %s exception of type %s: %s", + cause, name, e->what()); + } + else + // Else just note that we're terminating with an exception + abort_message("terminating with %s exception of type %s", + cause, name); + } + else + // Else we're terminating with a foreign exception + abort_message("terminating with %s foreign exception", cause); + } + } +#endif + // Else just note that we're terminating + abort_message("terminating"); +} + +__attribute__((noreturn)) +static void demangling_unexpected_handler() +{ + cause = "unexpected"; + std::terminate(); +} + +static constexpr std::terminate_handler default_terminate_handler = demangling_terminate_handler; +static constexpr std::terminate_handler default_unexpected_handler = demangling_unexpected_handler; +#else +static constexpr std::terminate_handler default_terminate_handler = ::abort; +static constexpr std::terminate_handler default_unexpected_handler = std::terminate; +#endif + +// +// Global variables that hold the pointers to the current handler +// +_LIBCXXABI_DATA_VIS +_LIBCPP_SAFE_STATIC std::terminate_handler __cxa_terminate_handler = default_terminate_handler; + +_LIBCXXABI_DATA_VIS +_LIBCPP_SAFE_STATIC std::unexpected_handler __cxa_unexpected_handler = default_unexpected_handler; + _LIBCXXABI_DATA_VIS _LIBCPP_SAFE_STATIC std::new_handler __cxa_new_handler = 0; -namespace std -{ - -unexpected_handler +namespace std +{ + +unexpected_handler set_unexpected(unexpected_handler func) noexcept -{ - if (func == 0) - func = default_unexpected_handler; - return __libcpp_atomic_exchange(&__cxa_unexpected_handler, func, - _AO_Acq_Rel); -} - -terminate_handler +{ + if (func == 0) + func = default_unexpected_handler; + return __libcpp_atomic_exchange(&__cxa_unexpected_handler, func, + _AO_Acq_Rel); +} + +terminate_handler set_terminate(terminate_handler func) noexcept -{ - if (func == 0) - func = default_terminate_handler; - return __libcpp_atomic_exchange(&__cxa_terminate_handler, func, - _AO_Acq_Rel); -} - +{ + if (func == 0) + func = default_terminate_handler; + return __libcpp_atomic_exchange(&__cxa_terminate_handler, func, + _AO_Acq_Rel); +} + new_handler set_new_handler(new_handler handler) noexcept { return __libcpp_atomic_exchange(&__cxa_new_handler, handler, _AO_Acq_Rel); -} +} } diff --git a/contrib/libs/cxxsupp/libcxxabi/src/cxa_demangle.cpp b/contrib/libs/cxxsupp/libcxxabi/src/cxa_demangle.cpp index bee4cfd5a1..8d8f8ab3f9 100644 --- a/contrib/libs/cxxsupp/libcxxabi/src/cxa_demangle.cpp +++ b/contrib/libs/cxxsupp/libcxxabi/src/cxa_demangle.cpp @@ -1,366 +1,366 @@ //===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// FIXME: (possibly) incomplete list of features that clang mangles that this -// file does not yet support: -// - C++ modules TS - -#include "demangle/ItaniumDemangle.h" -#include "__cxxabi_config.h" -#include <cassert> -#include <cctype> -#include <cstdio> -#include <cstdlib> -#include <cstring> -#include <functional> -#include <numeric> -#include <utility> - -using namespace itanium_demangle; - -constexpr const char *itanium_demangle::FloatData<float>::spec; -constexpr const char *itanium_demangle::FloatData<double>::spec; -constexpr const char *itanium_demangle::FloatData<long double>::spec; - -// <discriminator> := _ <non-negative number> # when number < 10 -// := __ <non-negative number> _ # when number >= 10 -// extension := decimal-digit+ # at the end of string -const char *itanium_demangle::parse_discriminator(const char *first, - const char *last) { - // parse but ignore discriminator - if (first != last) { - if (*first == '_') { - const char *t1 = first + 1; - if (t1 != last) { - if (std::isdigit(*t1)) - first = t1 + 1; - else if (*t1 == '_') { - for (++t1; t1 != last && std::isdigit(*t1); ++t1) - ; - if (t1 != last && *t1 == '_') - first = t1 + 1; - } - } - } else if (std::isdigit(*first)) { - const char *t1 = first + 1; - for (; t1 != last && std::isdigit(*t1); ++t1) - ; - if (t1 == last) - first = last; - } - } - return first; -} - -#ifndef NDEBUG -namespace { -struct DumpVisitor { - unsigned Depth = 0; - bool PendingNewline = false; - - template<typename NodeT> static constexpr bool wantsNewline(const NodeT *) { - return true; - } - static bool wantsNewline(NodeArray A) { return !A.empty(); } - static constexpr bool wantsNewline(...) { return false; } - - template<typename ...Ts> static bool anyWantNewline(Ts ...Vs) { - for (bool B : {wantsNewline(Vs)...}) - if (B) - return true; - return false; - } - - void printStr(const char *S) { fprintf(stderr, "%s", S); } - void print(StringView SV) { - fprintf(stderr, "\"%.*s\"", (int)SV.size(), SV.begin()); - } - void print(const Node *N) { - if (N) - N->visit(std::ref(*this)); - else - printStr("<null>"); - } - void print(NodeArray A) { - ++Depth; - printStr("{"); - bool First = true; - for (const Node *N : A) { - if (First) - print(N); - else - printWithComma(N); - First = false; - } - printStr("}"); - --Depth; - } - - // Overload used when T is exactly 'bool', not merely convertible to 'bool'. - void print(bool B) { printStr(B ? "true" : "false"); } - - template <class T> - typename std::enable_if<std::is_unsigned<T>::value>::type print(T N) { - fprintf(stderr, "%llu", (unsigned long long)N); - } - - template <class T> - typename std::enable_if<std::is_signed<T>::value>::type print(T N) { - fprintf(stderr, "%lld", (long long)N); - } - - void print(ReferenceKind RK) { - switch (RK) { - case ReferenceKind::LValue: - return printStr("ReferenceKind::LValue"); - case ReferenceKind::RValue: - return printStr("ReferenceKind::RValue"); - } - } - void print(FunctionRefQual RQ) { - switch (RQ) { - case FunctionRefQual::FrefQualNone: - return printStr("FunctionRefQual::FrefQualNone"); - case FunctionRefQual::FrefQualLValue: - return printStr("FunctionRefQual::FrefQualLValue"); - case FunctionRefQual::FrefQualRValue: - return printStr("FunctionRefQual::FrefQualRValue"); - } - } - void print(Qualifiers Qs) { - if (!Qs) return printStr("QualNone"); - struct QualName { Qualifiers Q; const char *Name; } Names[] = { - {QualConst, "QualConst"}, - {QualVolatile, "QualVolatile"}, - {QualRestrict, "QualRestrict"}, - }; - for (QualName Name : Names) { - if (Qs & Name.Q) { - printStr(Name.Name); - Qs = Qualifiers(Qs & ~Name.Q); - if (Qs) printStr(" | "); - } - } - } - void print(SpecialSubKind SSK) { - switch (SSK) { - case SpecialSubKind::allocator: - return printStr("SpecialSubKind::allocator"); - case SpecialSubKind::basic_string: - return printStr("SpecialSubKind::basic_string"); - case SpecialSubKind::string: - return printStr("SpecialSubKind::string"); - case SpecialSubKind::istream: - return printStr("SpecialSubKind::istream"); - case SpecialSubKind::ostream: - return printStr("SpecialSubKind::ostream"); - case SpecialSubKind::iostream: - return printStr("SpecialSubKind::iostream"); - } - } - void print(TemplateParamKind TPK) { - switch (TPK) { - case TemplateParamKind::Type: - return printStr("TemplateParamKind::Type"); - case TemplateParamKind::NonType: - return printStr("TemplateParamKind::NonType"); - case TemplateParamKind::Template: - return printStr("TemplateParamKind::Template"); - } - } - - void newLine() { - printStr("\n"); - for (unsigned I = 0; I != Depth; ++I) - printStr(" "); - PendingNewline = false; - } - - template<typename T> void printWithPendingNewline(T V) { - print(V); - if (wantsNewline(V)) - PendingNewline = true; - } - - template<typename T> void printWithComma(T V) { - if (PendingNewline || wantsNewline(V)) { - printStr(","); - newLine(); - } else { - printStr(", "); - } - - printWithPendingNewline(V); - } - - struct CtorArgPrinter { - DumpVisitor &Visitor; - - template<typename T, typename ...Rest> void operator()(T V, Rest ...Vs) { - if (Visitor.anyWantNewline(V, Vs...)) - Visitor.newLine(); - Visitor.printWithPendingNewline(V); - int PrintInOrder[] = { (Visitor.printWithComma(Vs), 0)..., 0 }; - (void)PrintInOrder; - } - }; - - template<typename NodeT> void operator()(const NodeT *Node) { - Depth += 2; - fprintf(stderr, "%s(", itanium_demangle::NodeKind<NodeT>::name()); - Node->match(CtorArgPrinter{*this}); - fprintf(stderr, ")"); - Depth -= 2; - } - - void operator()(const ForwardTemplateReference *Node) { - Depth += 2; - fprintf(stderr, "ForwardTemplateReference("); - if (Node->Ref && !Node->Printing) { - Node->Printing = true; - CtorArgPrinter{*this}(Node->Ref); - Node->Printing = false; - } else { - CtorArgPrinter{*this}(Node->Index); - } - fprintf(stderr, ")"); - Depth -= 2; - } -}; -} - -void itanium_demangle::Node::dump() const { - DumpVisitor V; - visit(std::ref(V)); - V.newLine(); -} -#endif - -namespace { -class BumpPointerAllocator { - struct BlockMeta { - BlockMeta* Next; - size_t Current; - }; - - static constexpr size_t AllocSize = 4096; - static constexpr size_t UsableAllocSize = AllocSize - sizeof(BlockMeta); - - alignas(long double) char InitialBuffer[AllocSize]; - BlockMeta* BlockList = nullptr; - - void grow() { - char* NewMeta = static_cast<char *>(std::malloc(AllocSize)); - if (NewMeta == nullptr) - std::terminate(); - BlockList = new (NewMeta) BlockMeta{BlockList, 0}; - } - - void* allocateMassive(size_t NBytes) { - NBytes += sizeof(BlockMeta); - BlockMeta* NewMeta = reinterpret_cast<BlockMeta*>(std::malloc(NBytes)); - if (NewMeta == nullptr) - std::terminate(); - BlockList->Next = new (NewMeta) BlockMeta{BlockList->Next, 0}; - return static_cast<void*>(NewMeta + 1); - } - -public: - BumpPointerAllocator() - : BlockList(new (InitialBuffer) BlockMeta{nullptr, 0}) {} - - void* allocate(size_t N) { - N = (N + 15u) & ~15u; - if (N + BlockList->Current >= UsableAllocSize) { - if (N > UsableAllocSize) - return allocateMassive(N); - grow(); - } - BlockList->Current += N; - return static_cast<void*>(reinterpret_cast<char*>(BlockList + 1) + - BlockList->Current - N); - } - - void reset() { - while (BlockList) { - BlockMeta* Tmp = BlockList; - BlockList = BlockList->Next; - if (reinterpret_cast<char*>(Tmp) != InitialBuffer) - std::free(Tmp); - } - BlockList = new (InitialBuffer) BlockMeta{nullptr, 0}; - } - - ~BumpPointerAllocator() { reset(); } -}; - -class DefaultAllocator { - BumpPointerAllocator Alloc; - -public: - void reset() { Alloc.reset(); } - - template<typename T, typename ...Args> T *makeNode(Args &&...args) { - return new (Alloc.allocate(sizeof(T))) - T(std::forward<Args>(args)...); - } - - void *allocateNodeArray(size_t sz) { - return Alloc.allocate(sizeof(Node *) * sz); - } -}; -} // unnamed namespace - -//===----------------------------------------------------------------------===// -// Code beyond this point should not be synchronized with LLVM. -//===----------------------------------------------------------------------===// - -using Demangler = itanium_demangle::ManglingParser<DefaultAllocator>; - -namespace { -enum : int { - demangle_invalid_args = -3, - demangle_invalid_mangled_name = -2, - demangle_memory_alloc_failure = -1, - demangle_success = 0, -}; -} - -namespace __cxxabiv1 { -extern "C" _LIBCXXABI_FUNC_VIS char * -__cxa_demangle(const char *MangledName, char *Buf, size_t *N, int *Status) { - if (MangledName == nullptr || (Buf != nullptr && N == nullptr)) { - if (Status) - *Status = demangle_invalid_args; - return nullptr; - } - - int InternalStatus = demangle_success; - Demangler Parser(MangledName, MangledName + std::strlen(MangledName)); +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// FIXME: (possibly) incomplete list of features that clang mangles that this +// file does not yet support: +// - C++ modules TS + +#include "demangle/ItaniumDemangle.h" +#include "__cxxabi_config.h" +#include <cassert> +#include <cctype> +#include <cstdio> +#include <cstdlib> +#include <cstring> +#include <functional> +#include <numeric> +#include <utility> + +using namespace itanium_demangle; + +constexpr const char *itanium_demangle::FloatData<float>::spec; +constexpr const char *itanium_demangle::FloatData<double>::spec; +constexpr const char *itanium_demangle::FloatData<long double>::spec; + +// <discriminator> := _ <non-negative number> # when number < 10 +// := __ <non-negative number> _ # when number >= 10 +// extension := decimal-digit+ # at the end of string +const char *itanium_demangle::parse_discriminator(const char *first, + const char *last) { + // parse but ignore discriminator + if (first != last) { + if (*first == '_') { + const char *t1 = first + 1; + if (t1 != last) { + if (std::isdigit(*t1)) + first = t1 + 1; + else if (*t1 == '_') { + for (++t1; t1 != last && std::isdigit(*t1); ++t1) + ; + if (t1 != last && *t1 == '_') + first = t1 + 1; + } + } + } else if (std::isdigit(*first)) { + const char *t1 = first + 1; + for (; t1 != last && std::isdigit(*t1); ++t1) + ; + if (t1 == last) + first = last; + } + } + return first; +} + +#ifndef NDEBUG +namespace { +struct DumpVisitor { + unsigned Depth = 0; + bool PendingNewline = false; + + template<typename NodeT> static constexpr bool wantsNewline(const NodeT *) { + return true; + } + static bool wantsNewline(NodeArray A) { return !A.empty(); } + static constexpr bool wantsNewline(...) { return false; } + + template<typename ...Ts> static bool anyWantNewline(Ts ...Vs) { + for (bool B : {wantsNewline(Vs)...}) + if (B) + return true; + return false; + } + + void printStr(const char *S) { fprintf(stderr, "%s", S); } + void print(StringView SV) { + fprintf(stderr, "\"%.*s\"", (int)SV.size(), SV.begin()); + } + void print(const Node *N) { + if (N) + N->visit(std::ref(*this)); + else + printStr("<null>"); + } + void print(NodeArray A) { + ++Depth; + printStr("{"); + bool First = true; + for (const Node *N : A) { + if (First) + print(N); + else + printWithComma(N); + First = false; + } + printStr("}"); + --Depth; + } + + // Overload used when T is exactly 'bool', not merely convertible to 'bool'. + void print(bool B) { printStr(B ? "true" : "false"); } + + template <class T> + typename std::enable_if<std::is_unsigned<T>::value>::type print(T N) { + fprintf(stderr, "%llu", (unsigned long long)N); + } + + template <class T> + typename std::enable_if<std::is_signed<T>::value>::type print(T N) { + fprintf(stderr, "%lld", (long long)N); + } + + void print(ReferenceKind RK) { + switch (RK) { + case ReferenceKind::LValue: + return printStr("ReferenceKind::LValue"); + case ReferenceKind::RValue: + return printStr("ReferenceKind::RValue"); + } + } + void print(FunctionRefQual RQ) { + switch (RQ) { + case FunctionRefQual::FrefQualNone: + return printStr("FunctionRefQual::FrefQualNone"); + case FunctionRefQual::FrefQualLValue: + return printStr("FunctionRefQual::FrefQualLValue"); + case FunctionRefQual::FrefQualRValue: + return printStr("FunctionRefQual::FrefQualRValue"); + } + } + void print(Qualifiers Qs) { + if (!Qs) return printStr("QualNone"); + struct QualName { Qualifiers Q; const char *Name; } Names[] = { + {QualConst, "QualConst"}, + {QualVolatile, "QualVolatile"}, + {QualRestrict, "QualRestrict"}, + }; + for (QualName Name : Names) { + if (Qs & Name.Q) { + printStr(Name.Name); + Qs = Qualifiers(Qs & ~Name.Q); + if (Qs) printStr(" | "); + } + } + } + void print(SpecialSubKind SSK) { + switch (SSK) { + case SpecialSubKind::allocator: + return printStr("SpecialSubKind::allocator"); + case SpecialSubKind::basic_string: + return printStr("SpecialSubKind::basic_string"); + case SpecialSubKind::string: + return printStr("SpecialSubKind::string"); + case SpecialSubKind::istream: + return printStr("SpecialSubKind::istream"); + case SpecialSubKind::ostream: + return printStr("SpecialSubKind::ostream"); + case SpecialSubKind::iostream: + return printStr("SpecialSubKind::iostream"); + } + } + void print(TemplateParamKind TPK) { + switch (TPK) { + case TemplateParamKind::Type: + return printStr("TemplateParamKind::Type"); + case TemplateParamKind::NonType: + return printStr("TemplateParamKind::NonType"); + case TemplateParamKind::Template: + return printStr("TemplateParamKind::Template"); + } + } + + void newLine() { + printStr("\n"); + for (unsigned I = 0; I != Depth; ++I) + printStr(" "); + PendingNewline = false; + } + + template<typename T> void printWithPendingNewline(T V) { + print(V); + if (wantsNewline(V)) + PendingNewline = true; + } + + template<typename T> void printWithComma(T V) { + if (PendingNewline || wantsNewline(V)) { + printStr(","); + newLine(); + } else { + printStr(", "); + } + + printWithPendingNewline(V); + } + + struct CtorArgPrinter { + DumpVisitor &Visitor; + + template<typename T, typename ...Rest> void operator()(T V, Rest ...Vs) { + if (Visitor.anyWantNewline(V, Vs...)) + Visitor.newLine(); + Visitor.printWithPendingNewline(V); + int PrintInOrder[] = { (Visitor.printWithComma(Vs), 0)..., 0 }; + (void)PrintInOrder; + } + }; + + template<typename NodeT> void operator()(const NodeT *Node) { + Depth += 2; + fprintf(stderr, "%s(", itanium_demangle::NodeKind<NodeT>::name()); + Node->match(CtorArgPrinter{*this}); + fprintf(stderr, ")"); + Depth -= 2; + } + + void operator()(const ForwardTemplateReference *Node) { + Depth += 2; + fprintf(stderr, "ForwardTemplateReference("); + if (Node->Ref && !Node->Printing) { + Node->Printing = true; + CtorArgPrinter{*this}(Node->Ref); + Node->Printing = false; + } else { + CtorArgPrinter{*this}(Node->Index); + } + fprintf(stderr, ")"); + Depth -= 2; + } +}; +} + +void itanium_demangle::Node::dump() const { + DumpVisitor V; + visit(std::ref(V)); + V.newLine(); +} +#endif + +namespace { +class BumpPointerAllocator { + struct BlockMeta { + BlockMeta* Next; + size_t Current; + }; + + static constexpr size_t AllocSize = 4096; + static constexpr size_t UsableAllocSize = AllocSize - sizeof(BlockMeta); + + alignas(long double) char InitialBuffer[AllocSize]; + BlockMeta* BlockList = nullptr; + + void grow() { + char* NewMeta = static_cast<char *>(std::malloc(AllocSize)); + if (NewMeta == nullptr) + std::terminate(); + BlockList = new (NewMeta) BlockMeta{BlockList, 0}; + } + + void* allocateMassive(size_t NBytes) { + NBytes += sizeof(BlockMeta); + BlockMeta* NewMeta = reinterpret_cast<BlockMeta*>(std::malloc(NBytes)); + if (NewMeta == nullptr) + std::terminate(); + BlockList->Next = new (NewMeta) BlockMeta{BlockList->Next, 0}; + return static_cast<void*>(NewMeta + 1); + } + +public: + BumpPointerAllocator() + : BlockList(new (InitialBuffer) BlockMeta{nullptr, 0}) {} + + void* allocate(size_t N) { + N = (N + 15u) & ~15u; + if (N + BlockList->Current >= UsableAllocSize) { + if (N > UsableAllocSize) + return allocateMassive(N); + grow(); + } + BlockList->Current += N; + return static_cast<void*>(reinterpret_cast<char*>(BlockList + 1) + + BlockList->Current - N); + } + + void reset() { + while (BlockList) { + BlockMeta* Tmp = BlockList; + BlockList = BlockList->Next; + if (reinterpret_cast<char*>(Tmp) != InitialBuffer) + std::free(Tmp); + } + BlockList = new (InitialBuffer) BlockMeta{nullptr, 0}; + } + + ~BumpPointerAllocator() { reset(); } +}; + +class DefaultAllocator { + BumpPointerAllocator Alloc; + +public: + void reset() { Alloc.reset(); } + + template<typename T, typename ...Args> T *makeNode(Args &&...args) { + return new (Alloc.allocate(sizeof(T))) + T(std::forward<Args>(args)...); + } + + void *allocateNodeArray(size_t sz) { + return Alloc.allocate(sizeof(Node *) * sz); + } +}; +} // unnamed namespace + +//===----------------------------------------------------------------------===// +// Code beyond this point should not be synchronized with LLVM. +//===----------------------------------------------------------------------===// + +using Demangler = itanium_demangle::ManglingParser<DefaultAllocator>; + +namespace { +enum : int { + demangle_invalid_args = -3, + demangle_invalid_mangled_name = -2, + demangle_memory_alloc_failure = -1, + demangle_success = 0, +}; +} + +namespace __cxxabiv1 { +extern "C" _LIBCXXABI_FUNC_VIS char * +__cxa_demangle(const char *MangledName, char *Buf, size_t *N, int *Status) { + if (MangledName == nullptr || (Buf != nullptr && N == nullptr)) { + if (Status) + *Status = demangle_invalid_args; + return nullptr; + } + + int InternalStatus = demangle_success; + Demangler Parser(MangledName, MangledName + std::strlen(MangledName)); OutputBuffer O; - - Node *AST = Parser.parse(); - - if (AST == nullptr) - InternalStatus = demangle_invalid_mangled_name; + + Node *AST = Parser.parse(); + + if (AST == nullptr) + InternalStatus = demangle_invalid_mangled_name; else if (!initializeOutputBuffer(Buf, N, O, 1024)) - InternalStatus = demangle_memory_alloc_failure; - else { - assert(Parser.ForwardTemplateRefs.empty()); + InternalStatus = demangle_memory_alloc_failure; + else { + assert(Parser.ForwardTemplateRefs.empty()); AST->print(O); O += '\0'; - if (N != nullptr) + if (N != nullptr) *N = O.getCurrentPosition(); Buf = O.getBuffer(); - } - - if (Status) - *Status = InternalStatus; - return InternalStatus == demangle_success ? Buf : nullptr; -} -} // __cxxabiv1 + } + + if (Status) + *Status = InternalStatus; + return InternalStatus == demangle_success ? Buf : nullptr; +} +} // __cxxabiv1 diff --git a/contrib/libs/cxxsupp/libcxxabi/src/cxa_exception.cpp b/contrib/libs/cxxsupp/libcxxabi/src/cxa_exception.cpp index 36388d50da..fe4ec40041 100644 --- a/contrib/libs/cxxsupp/libcxxabi/src/cxa_exception.cpp +++ b/contrib/libs/cxxsupp/libcxxabi/src/cxa_exception.cpp @@ -1,389 +1,389 @@ //===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// -// This file implements the "Exception Handling APIs" -// https://itanium-cxx-abi.github.io/cxx-abi/abi-eh.html -// -//===----------------------------------------------------------------------===// - -#include "cxxabi.h" - -#include <exception> // for std::terminate -#include <string.h> // for memset -#include "cxa_exception.h" -#include "cxa_handlers.h" -#include "fallback_malloc.h" +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// +// This file implements the "Exception Handling APIs" +// https://itanium-cxx-abi.github.io/cxx-abi/abi-eh.html +// +//===----------------------------------------------------------------------===// + +#include "cxxabi.h" + +#include <exception> // for std::terminate +#include <string.h> // for memset +#include "cxa_exception.h" +#include "cxa_handlers.h" +#include "fallback_malloc.h" #include "include/atomic_support.h" // from libc++ - -#if __has_feature(address_sanitizer) + +#if __has_feature(address_sanitizer) #include <sanitizer/asan_interface.h> -#endif - -// +---------------------------+-----------------------------+---------------+ -// | __cxa_exception | _Unwind_Exception CLNGC++\0 | thrown object | -// +---------------------------+-----------------------------+---------------+ -// ^ -// | -// +-------------------------------------------------------+ -// | -// +---------------------------+-----------------------------+ -// | __cxa_dependent_exception | _Unwind_Exception CLNGC++\1 | -// +---------------------------+-----------------------------+ - -namespace __cxxabiv1 { - -// Utility routines -static -inline -__cxa_exception* -cxa_exception_from_thrown_object(void* thrown_object) -{ - return static_cast<__cxa_exception*>(thrown_object) - 1; -} - -// Note: This is never called when exception_header is masquerading as a -// __cxa_dependent_exception. -static -inline -void* -thrown_object_from_cxa_exception(__cxa_exception* exception_header) -{ - return static_cast<void*>(exception_header + 1); -} - -// Get the exception object from the unwind pointer. -// Relies on the structure layout, where the unwind pointer is right in -// front of the user's exception object -static -inline -__cxa_exception* -cxa_exception_from_exception_unwind_exception(_Unwind_Exception* unwind_exception) -{ - return cxa_exception_from_thrown_object(unwind_exception + 1 ); -} - -// Round s up to next multiple of a. -static inline -size_t aligned_allocation_size(size_t s, size_t a) { - return (s + a - 1) & ~(a - 1); -} - -static inline -size_t cxa_exception_size_from_exception_thrown_size(size_t size) { - return aligned_allocation_size(size + sizeof (__cxa_exception), - alignof(__cxa_exception)); -} - -void __setExceptionClass(_Unwind_Exception* unwind_exception, uint64_t newValue) { - ::memcpy(&unwind_exception->exception_class, &newValue, sizeof(newValue)); -} - - -static void setOurExceptionClass(_Unwind_Exception* unwind_exception) { - __setExceptionClass(unwind_exception, kOurExceptionClass); -} - -static void setDependentExceptionClass(_Unwind_Exception* unwind_exception) { - __setExceptionClass(unwind_exception, kOurDependentExceptionClass); -} - -// Is it one of ours? -uint64_t __getExceptionClass(const _Unwind_Exception* unwind_exception) { - // On x86 and some ARM unwinders, unwind_exception->exception_class is - // a uint64_t. On other ARM unwinders, it is a char[8]. - // See: http://infocenter.arm.com/help/topic/com.arm.doc.ihi0038b/IHI0038B_ehabi.pdf - // So we just copy it into a uint64_t to be sure. - uint64_t exClass; - ::memcpy(&exClass, &unwind_exception->exception_class, sizeof(exClass)); - return exClass; -} - -bool __isOurExceptionClass(const _Unwind_Exception* unwind_exception) { - return (__getExceptionClass(unwind_exception) & get_vendor_and_language) == - (kOurExceptionClass & get_vendor_and_language); -} - -static bool isDependentException(_Unwind_Exception* unwind_exception) { - return (__getExceptionClass(unwind_exception) & 0xFF) == 0x01; -} - -// This does not need to be atomic -static inline int incrementHandlerCount(__cxa_exception *exception) { - return ++exception->handlerCount; -} - -// This does not need to be atomic -static inline int decrementHandlerCount(__cxa_exception *exception) { - return --exception->handlerCount; -} - -/* - If reason isn't _URC_FOREIGN_EXCEPTION_CAUGHT, then the terminateHandler - stored in exc is called. Otherwise the exceptionDestructor stored in - exc is called, and then the memory for the exception is deallocated. - - This is never called for a __cxa_dependent_exception. -*/ -static -void -exception_cleanup_func(_Unwind_Reason_Code reason, _Unwind_Exception* unwind_exception) -{ - __cxa_exception* exception_header = cxa_exception_from_exception_unwind_exception(unwind_exception); - if (_URC_FOREIGN_EXCEPTION_CAUGHT != reason) - std::__terminate(exception_header->terminateHandler); - // Just in case there exists a dependent exception that is pointing to this, - // check the reference count and only destroy this if that count goes to zero. - __cxa_decrement_exception_refcount(unwind_exception + 1); -} - -static _LIBCXXABI_NORETURN void failed_throw(__cxa_exception* exception_header) { -// Section 2.5.3 says: -// * For purposes of this ABI, several things are considered exception handlers: -// ** A terminate() call due to a throw. -// and -// * Upon entry, Following initialization of the catch parameter, -// a handler must call: -// * void *__cxa_begin_catch(void *exceptionObject ); - (void) __cxa_begin_catch(&exception_header->unwindHeader); - std::__terminate(exception_header->terminateHandler); -} - -// Return the offset of the __cxa_exception header from the start of the -// allocated buffer. If __cxa_exception's alignment is smaller than the maximum -// useful alignment for the target machine, padding has to be inserted before -// the header to ensure the thrown object that follows the header is -// sufficiently aligned. This happens if _Unwind_exception isn't double-word -// aligned (on Darwin, for example). -static size_t get_cxa_exception_offset() { - struct S { - } __attribute__((aligned)); - - // Compute the maximum alignment for the target machine. - constexpr size_t alignment = alignof(S); - constexpr size_t excp_size = sizeof(__cxa_exception); - constexpr size_t aligned_size = - (excp_size + alignment - 1) / alignment * alignment; - constexpr size_t offset = aligned_size - excp_size; - static_assert((offset == 0 || alignof(_Unwind_Exception) < alignment), - "offset is non-zero only if _Unwind_Exception isn't aligned"); - return offset; -} - -extern "C" { - -// Allocate a __cxa_exception object, and zero-fill it. -// Reserve "thrown_size" bytes on the end for the user's exception -// object. Zero-fill the object. If memory can't be allocated, call -// std::terminate. Return a pointer to the memory to be used for the -// user's exception object. -void *__cxa_allocate_exception(size_t thrown_size) throw() { - size_t actual_size = cxa_exception_size_from_exception_thrown_size(thrown_size); - - // Allocate extra space before the __cxa_exception header to ensure the - // start of the thrown object is sufficiently aligned. - size_t header_offset = get_cxa_exception_offset(); - char *raw_buffer = - (char *)__aligned_malloc_with_fallback(header_offset + actual_size); - if (NULL == raw_buffer) - std::terminate(); - __cxa_exception *exception_header = - static_cast<__cxa_exception *>((void *)(raw_buffer + header_offset)); - ::memset(exception_header, 0, actual_size); - return thrown_object_from_cxa_exception(exception_header); -} - - -// Free a __cxa_exception object allocated with __cxa_allocate_exception. -void __cxa_free_exception(void *thrown_object) throw() { - // Compute the size of the padding before the header. - size_t header_offset = get_cxa_exception_offset(); - char *raw_buffer = - ((char *)cxa_exception_from_thrown_object(thrown_object)) - header_offset; - __aligned_free_with_fallback((void *)raw_buffer); -} - - -// This function shall allocate a __cxa_dependent_exception and -// return a pointer to it. (Really to the object, not past its' end). -// Otherwise, it will work like __cxa_allocate_exception. -void * __cxa_allocate_dependent_exception () { - size_t actual_size = sizeof(__cxa_dependent_exception); - void *ptr = __aligned_malloc_with_fallback(actual_size); - if (NULL == ptr) - std::terminate(); - ::memset(ptr, 0, actual_size); - return ptr; -} - - -// This function shall free a dependent_exception. -// It does not affect the reference count of the primary exception. -void __cxa_free_dependent_exception (void * dependent_exception) { - __aligned_free_with_fallback(dependent_exception); -} - - -// 2.4.3 Throwing the Exception Object -/* -After constructing the exception object with the throw argument value, -the generated code calls the __cxa_throw runtime library routine. This -routine never returns. - -The __cxa_throw routine will do the following: - -* Obtain the __cxa_exception header from the thrown exception object address, -which can be computed as follows: - __cxa_exception *header = ((__cxa_exception *) thrown_exception - 1); -* Save the current unexpected_handler and terminate_handler in the __cxa_exception header. -* Save the tinfo and dest arguments in the __cxa_exception header. -* Set the exception_class field in the unwind header. This is a 64-bit value -representing the ASCII string "XXXXC++\0", where "XXXX" is a -vendor-dependent string. That is, for implementations conforming to this -ABI, the low-order 4 bytes of this 64-bit value will be "C++\0". -* Increment the uncaught_exception flag. -* Call _Unwind_RaiseException in the system unwind library, Its argument is the -pointer to the thrown exception, which __cxa_throw itself received as an argument. -__Unwind_RaiseException begins the process of stack unwinding, described -in Section 2.5. In special cases, such as an inability to find a -handler, _Unwind_RaiseException may return. In that case, __cxa_throw -will call terminate, assuming that there was no handler for the -exception. -*/ -void -__cxa_throw(void *thrown_object, std::type_info *tinfo, void (*dest)(void *)) { - __cxa_eh_globals *globals = __cxa_get_globals(); - __cxa_exception* exception_header = cxa_exception_from_thrown_object(thrown_object); - - exception_header->unexpectedHandler = std::get_unexpected(); - exception_header->terminateHandler = std::get_terminate(); - exception_header->exceptionType = tinfo; - exception_header->exceptionDestructor = dest; - setOurExceptionClass(&exception_header->unwindHeader); - exception_header->referenceCount = 1; // This is a newly allocated exception, no need for thread safety. - globals->uncaughtExceptions += 1; // Not atomically, since globals are thread-local - - exception_header->unwindHeader.exception_cleanup = exception_cleanup_func; - -#if __has_feature(address_sanitizer) - // Inform the ASan runtime that now might be a good time to clean stuff up. - __asan_handle_no_return(); -#endif - -#ifdef __USING_SJLJ_EXCEPTIONS__ - _Unwind_SjLj_RaiseException(&exception_header->unwindHeader); -#else - _Unwind_RaiseException(&exception_header->unwindHeader); -#endif - // This only happens when there is no handler, or some unexpected unwinding - // error happens. - failed_throw(exception_header); -} - - -// 2.5.3 Exception Handlers -/* -The adjusted pointer is computed by the personality routine during phase 1 - and saved in the exception header (either __cxa_exception or - __cxa_dependent_exception). - - Requires: exception is native -*/ -void *__cxa_get_exception_ptr(void *unwind_exception) throw() { -#if defined(_LIBCXXABI_ARM_EHABI) - return reinterpret_cast<void*>( - static_cast<_Unwind_Control_Block*>(unwind_exception)->barrier_cache.bitpattern[0]); -#else - return cxa_exception_from_exception_unwind_exception( - static_cast<_Unwind_Exception*>(unwind_exception))->adjustedPtr; -#endif -} - -#if defined(_LIBCXXABI_ARM_EHABI) -/* -The routine to be called before the cleanup. This will save __cxa_exception in -__cxa_eh_globals, so that __cxa_end_cleanup() can recover later. -*/ -bool __cxa_begin_cleanup(void *unwind_arg) throw() { - _Unwind_Exception* unwind_exception = static_cast<_Unwind_Exception*>(unwind_arg); - __cxa_eh_globals* globals = __cxa_get_globals(); - __cxa_exception* exception_header = - cxa_exception_from_exception_unwind_exception(unwind_exception); - - if (__isOurExceptionClass(unwind_exception)) - { - if (0 == exception_header->propagationCount) - { - exception_header->nextPropagatingException = globals->propagatingExceptions; - globals->propagatingExceptions = exception_header; - } - ++exception_header->propagationCount; - } - else - { - // If the propagatingExceptions stack is not empty, since we can't - // chain the foreign exception, terminate it. - if (NULL != globals->propagatingExceptions) - std::terminate(); - globals->propagatingExceptions = exception_header; - } - return true; -} - -/* -The routine to be called after the cleanup has been performed. It will get the -propagating __cxa_exception from __cxa_eh_globals, and continue the stack -unwinding with _Unwind_Resume. - -According to ARM EHABI 8.4.1, __cxa_end_cleanup() should not clobber any -register, thus we have to write this function in assembly so that we can save -{r1, r2, r3}. We don't have to save r0 because it is the return value and the +#endif + +// +---------------------------+-----------------------------+---------------+ +// | __cxa_exception | _Unwind_Exception CLNGC++\0 | thrown object | +// +---------------------------+-----------------------------+---------------+ +// ^ +// | +// +-------------------------------------------------------+ +// | +// +---------------------------+-----------------------------+ +// | __cxa_dependent_exception | _Unwind_Exception CLNGC++\1 | +// +---------------------------+-----------------------------+ + +namespace __cxxabiv1 { + +// Utility routines +static +inline +__cxa_exception* +cxa_exception_from_thrown_object(void* thrown_object) +{ + return static_cast<__cxa_exception*>(thrown_object) - 1; +} + +// Note: This is never called when exception_header is masquerading as a +// __cxa_dependent_exception. +static +inline +void* +thrown_object_from_cxa_exception(__cxa_exception* exception_header) +{ + return static_cast<void*>(exception_header + 1); +} + +// Get the exception object from the unwind pointer. +// Relies on the structure layout, where the unwind pointer is right in +// front of the user's exception object +static +inline +__cxa_exception* +cxa_exception_from_exception_unwind_exception(_Unwind_Exception* unwind_exception) +{ + return cxa_exception_from_thrown_object(unwind_exception + 1 ); +} + +// Round s up to next multiple of a. +static inline +size_t aligned_allocation_size(size_t s, size_t a) { + return (s + a - 1) & ~(a - 1); +} + +static inline +size_t cxa_exception_size_from_exception_thrown_size(size_t size) { + return aligned_allocation_size(size + sizeof (__cxa_exception), + alignof(__cxa_exception)); +} + +void __setExceptionClass(_Unwind_Exception* unwind_exception, uint64_t newValue) { + ::memcpy(&unwind_exception->exception_class, &newValue, sizeof(newValue)); +} + + +static void setOurExceptionClass(_Unwind_Exception* unwind_exception) { + __setExceptionClass(unwind_exception, kOurExceptionClass); +} + +static void setDependentExceptionClass(_Unwind_Exception* unwind_exception) { + __setExceptionClass(unwind_exception, kOurDependentExceptionClass); +} + +// Is it one of ours? +uint64_t __getExceptionClass(const _Unwind_Exception* unwind_exception) { + // On x86 and some ARM unwinders, unwind_exception->exception_class is + // a uint64_t. On other ARM unwinders, it is a char[8]. + // See: http://infocenter.arm.com/help/topic/com.arm.doc.ihi0038b/IHI0038B_ehabi.pdf + // So we just copy it into a uint64_t to be sure. + uint64_t exClass; + ::memcpy(&exClass, &unwind_exception->exception_class, sizeof(exClass)); + return exClass; +} + +bool __isOurExceptionClass(const _Unwind_Exception* unwind_exception) { + return (__getExceptionClass(unwind_exception) & get_vendor_and_language) == + (kOurExceptionClass & get_vendor_and_language); +} + +static bool isDependentException(_Unwind_Exception* unwind_exception) { + return (__getExceptionClass(unwind_exception) & 0xFF) == 0x01; +} + +// This does not need to be atomic +static inline int incrementHandlerCount(__cxa_exception *exception) { + return ++exception->handlerCount; +} + +// This does not need to be atomic +static inline int decrementHandlerCount(__cxa_exception *exception) { + return --exception->handlerCount; +} + +/* + If reason isn't _URC_FOREIGN_EXCEPTION_CAUGHT, then the terminateHandler + stored in exc is called. Otherwise the exceptionDestructor stored in + exc is called, and then the memory for the exception is deallocated. + + This is never called for a __cxa_dependent_exception. +*/ +static +void +exception_cleanup_func(_Unwind_Reason_Code reason, _Unwind_Exception* unwind_exception) +{ + __cxa_exception* exception_header = cxa_exception_from_exception_unwind_exception(unwind_exception); + if (_URC_FOREIGN_EXCEPTION_CAUGHT != reason) + std::__terminate(exception_header->terminateHandler); + // Just in case there exists a dependent exception that is pointing to this, + // check the reference count and only destroy this if that count goes to zero. + __cxa_decrement_exception_refcount(unwind_exception + 1); +} + +static _LIBCXXABI_NORETURN void failed_throw(__cxa_exception* exception_header) { +// Section 2.5.3 says: +// * For purposes of this ABI, several things are considered exception handlers: +// ** A terminate() call due to a throw. +// and +// * Upon entry, Following initialization of the catch parameter, +// a handler must call: +// * void *__cxa_begin_catch(void *exceptionObject ); + (void) __cxa_begin_catch(&exception_header->unwindHeader); + std::__terminate(exception_header->terminateHandler); +} + +// Return the offset of the __cxa_exception header from the start of the +// allocated buffer. If __cxa_exception's alignment is smaller than the maximum +// useful alignment for the target machine, padding has to be inserted before +// the header to ensure the thrown object that follows the header is +// sufficiently aligned. This happens if _Unwind_exception isn't double-word +// aligned (on Darwin, for example). +static size_t get_cxa_exception_offset() { + struct S { + } __attribute__((aligned)); + + // Compute the maximum alignment for the target machine. + constexpr size_t alignment = alignof(S); + constexpr size_t excp_size = sizeof(__cxa_exception); + constexpr size_t aligned_size = + (excp_size + alignment - 1) / alignment * alignment; + constexpr size_t offset = aligned_size - excp_size; + static_assert((offset == 0 || alignof(_Unwind_Exception) < alignment), + "offset is non-zero only if _Unwind_Exception isn't aligned"); + return offset; +} + +extern "C" { + +// Allocate a __cxa_exception object, and zero-fill it. +// Reserve "thrown_size" bytes on the end for the user's exception +// object. Zero-fill the object. If memory can't be allocated, call +// std::terminate. Return a pointer to the memory to be used for the +// user's exception object. +void *__cxa_allocate_exception(size_t thrown_size) throw() { + size_t actual_size = cxa_exception_size_from_exception_thrown_size(thrown_size); + + // Allocate extra space before the __cxa_exception header to ensure the + // start of the thrown object is sufficiently aligned. + size_t header_offset = get_cxa_exception_offset(); + char *raw_buffer = + (char *)__aligned_malloc_with_fallback(header_offset + actual_size); + if (NULL == raw_buffer) + std::terminate(); + __cxa_exception *exception_header = + static_cast<__cxa_exception *>((void *)(raw_buffer + header_offset)); + ::memset(exception_header, 0, actual_size); + return thrown_object_from_cxa_exception(exception_header); +} + + +// Free a __cxa_exception object allocated with __cxa_allocate_exception. +void __cxa_free_exception(void *thrown_object) throw() { + // Compute the size of the padding before the header. + size_t header_offset = get_cxa_exception_offset(); + char *raw_buffer = + ((char *)cxa_exception_from_thrown_object(thrown_object)) - header_offset; + __aligned_free_with_fallback((void *)raw_buffer); +} + + +// This function shall allocate a __cxa_dependent_exception and +// return a pointer to it. (Really to the object, not past its' end). +// Otherwise, it will work like __cxa_allocate_exception. +void * __cxa_allocate_dependent_exception () { + size_t actual_size = sizeof(__cxa_dependent_exception); + void *ptr = __aligned_malloc_with_fallback(actual_size); + if (NULL == ptr) + std::terminate(); + ::memset(ptr, 0, actual_size); + return ptr; +} + + +// This function shall free a dependent_exception. +// It does not affect the reference count of the primary exception. +void __cxa_free_dependent_exception (void * dependent_exception) { + __aligned_free_with_fallback(dependent_exception); +} + + +// 2.4.3 Throwing the Exception Object +/* +After constructing the exception object with the throw argument value, +the generated code calls the __cxa_throw runtime library routine. This +routine never returns. + +The __cxa_throw routine will do the following: + +* Obtain the __cxa_exception header from the thrown exception object address, +which can be computed as follows: + __cxa_exception *header = ((__cxa_exception *) thrown_exception - 1); +* Save the current unexpected_handler and terminate_handler in the __cxa_exception header. +* Save the tinfo and dest arguments in the __cxa_exception header. +* Set the exception_class field in the unwind header. This is a 64-bit value +representing the ASCII string "XXXXC++\0", where "XXXX" is a +vendor-dependent string. That is, for implementations conforming to this +ABI, the low-order 4 bytes of this 64-bit value will be "C++\0". +* Increment the uncaught_exception flag. +* Call _Unwind_RaiseException in the system unwind library, Its argument is the +pointer to the thrown exception, which __cxa_throw itself received as an argument. +__Unwind_RaiseException begins the process of stack unwinding, described +in Section 2.5. In special cases, such as an inability to find a +handler, _Unwind_RaiseException may return. In that case, __cxa_throw +will call terminate, assuming that there was no handler for the +exception. +*/ +void +__cxa_throw(void *thrown_object, std::type_info *tinfo, void (*dest)(void *)) { + __cxa_eh_globals *globals = __cxa_get_globals(); + __cxa_exception* exception_header = cxa_exception_from_thrown_object(thrown_object); + + exception_header->unexpectedHandler = std::get_unexpected(); + exception_header->terminateHandler = std::get_terminate(); + exception_header->exceptionType = tinfo; + exception_header->exceptionDestructor = dest; + setOurExceptionClass(&exception_header->unwindHeader); + exception_header->referenceCount = 1; // This is a newly allocated exception, no need for thread safety. + globals->uncaughtExceptions += 1; // Not atomically, since globals are thread-local + + exception_header->unwindHeader.exception_cleanup = exception_cleanup_func; + +#if __has_feature(address_sanitizer) + // Inform the ASan runtime that now might be a good time to clean stuff up. + __asan_handle_no_return(); +#endif + +#ifdef __USING_SJLJ_EXCEPTIONS__ + _Unwind_SjLj_RaiseException(&exception_header->unwindHeader); +#else + _Unwind_RaiseException(&exception_header->unwindHeader); +#endif + // This only happens when there is no handler, or some unexpected unwinding + // error happens. + failed_throw(exception_header); +} + + +// 2.5.3 Exception Handlers +/* +The adjusted pointer is computed by the personality routine during phase 1 + and saved in the exception header (either __cxa_exception or + __cxa_dependent_exception). + + Requires: exception is native +*/ +void *__cxa_get_exception_ptr(void *unwind_exception) throw() { +#if defined(_LIBCXXABI_ARM_EHABI) + return reinterpret_cast<void*>( + static_cast<_Unwind_Control_Block*>(unwind_exception)->barrier_cache.bitpattern[0]); +#else + return cxa_exception_from_exception_unwind_exception( + static_cast<_Unwind_Exception*>(unwind_exception))->adjustedPtr; +#endif +} + +#if defined(_LIBCXXABI_ARM_EHABI) +/* +The routine to be called before the cleanup. This will save __cxa_exception in +__cxa_eh_globals, so that __cxa_end_cleanup() can recover later. +*/ +bool __cxa_begin_cleanup(void *unwind_arg) throw() { + _Unwind_Exception* unwind_exception = static_cast<_Unwind_Exception*>(unwind_arg); + __cxa_eh_globals* globals = __cxa_get_globals(); + __cxa_exception* exception_header = + cxa_exception_from_exception_unwind_exception(unwind_exception); + + if (__isOurExceptionClass(unwind_exception)) + { + if (0 == exception_header->propagationCount) + { + exception_header->nextPropagatingException = globals->propagatingExceptions; + globals->propagatingExceptions = exception_header; + } + ++exception_header->propagationCount; + } + else + { + // If the propagatingExceptions stack is not empty, since we can't + // chain the foreign exception, terminate it. + if (NULL != globals->propagatingExceptions) + std::terminate(); + globals->propagatingExceptions = exception_header; + } + return true; +} + +/* +The routine to be called after the cleanup has been performed. It will get the +propagating __cxa_exception from __cxa_eh_globals, and continue the stack +unwinding with _Unwind_Resume. + +According to ARM EHABI 8.4.1, __cxa_end_cleanup() should not clobber any +register, thus we have to write this function in assembly so that we can save +{r1, r2, r3}. We don't have to save r0 because it is the return value and the first argument to _Unwind_Resume(). In addition, we are saving lr in order to align the stack to 16 bytes and lr will be used to identify the caller and its frame information. _Unwind_Resume never return and we need to keep the original lr so just branch to it. -*/ -__attribute__((used)) static _Unwind_Exception * -__cxa_end_cleanup_impl() -{ - __cxa_eh_globals* globals = __cxa_get_globals(); - __cxa_exception* exception_header = globals->propagatingExceptions; - if (NULL == exception_header) - { - // It seems that __cxa_begin_cleanup() is not called properly. - // We have no choice but terminate the program now. - std::terminate(); - } - - if (__isOurExceptionClass(&exception_header->unwindHeader)) - { - --exception_header->propagationCount; - if (0 == exception_header->propagationCount) - { - globals->propagatingExceptions = exception_header->nextPropagatingException; - exception_header->nextPropagatingException = NULL; - } - } - else - { - globals->propagatingExceptions = NULL; - } - return &exception_header->unwindHeader; -} - +*/ +__attribute__((used)) static _Unwind_Exception * +__cxa_end_cleanup_impl() +{ + __cxa_eh_globals* globals = __cxa_get_globals(); + __cxa_exception* exception_header = globals->propagatingExceptions; + if (NULL == exception_header) + { + // It seems that __cxa_begin_cleanup() is not called properly. + // We have no choice but terminate the program now. + std::terminate(); + } + + if (__isOurExceptionClass(&exception_header->unwindHeader)) + { + --exception_header->propagationCount; + if (0 == exception_header->propagationCount) + { + globals->propagatingExceptions = exception_header->nextPropagatingException; + exception_header->nextPropagatingException = NULL; + } + } + else + { + globals->propagatingExceptions = NULL; + } + return &exception_header->unwindHeader; +} + asm(" .pushsection .text.__cxa_end_cleanup,\"ax\",%progbits\n" - " .globl __cxa_end_cleanup\n" - " .type __cxa_end_cleanup,%function\n" - "__cxa_end_cleanup:\n" + " .globl __cxa_end_cleanup\n" + " .type __cxa_end_cleanup,%function\n" + "__cxa_end_cleanup:\n" #if defined(__ARM_FEATURE_BTI_DEFAULT) " bti\n" #endif " push {r1, r2, r3, lr}\n" - " bl __cxa_end_cleanup_impl\n" - " pop {r1, r2, r3, r4}\n" + " bl __cxa_end_cleanup_impl\n" + " pop {r1, r2, r3, r4}\n" " mov lr, r4\n" #if defined(LIBCXXABI_BAREMETAL) " ldr r4, =_Unwind_Resume\n" @@ -393,371 +393,371 @@ asm(" .pushsection .text.__cxa_end_cleanup,\"ax\",%progbits\n" #endif " .popsection"); #endif // defined(_LIBCXXABI_ARM_EHABI) - -/* -This routine can catch foreign or native exceptions. If native, the exception -can be a primary or dependent variety. This routine may remain blissfully -ignorant of whether the native exception is primary or dependent. - -If the exception is native: -* Increment's the exception's handler count. -* Push the exception on the stack of currently-caught exceptions if it is not - already there (from a rethrow). -* Decrements the uncaught_exception count. -* Returns the adjusted pointer to the exception object, which is stored in - the __cxa_exception by the personality routine. - -If the exception is foreign, this means it did not originate from one of throw -routines. The foreign exception does not necessarily have a __cxa_exception -header. However we can catch it here with a catch (...), or with a call -to terminate or unexpected during unwinding. -* Do not try to increment the exception's handler count, we don't know where - it is. -* Push the exception on the stack of currently-caught exceptions only if the - stack is empty. The foreign exception has no way to link to the current - top of stack. If the stack is not empty, call terminate. Even with an - empty stack, this is hacked in by pushing a pointer to an imaginary - __cxa_exception block in front of the foreign exception. It would be better - if the __cxa_eh_globals structure had a stack of _Unwind_Exception, but it - doesn't. It has a stack of __cxa_exception (which has a next* in it). -* Do not decrement the uncaught_exception count because we didn't increment it - in __cxa_throw (or one of our rethrow functions). -* If we haven't terminated, assume the exception object is just past the - _Unwind_Exception and return a pointer to that. -*/ -void* -__cxa_begin_catch(void* unwind_arg) throw() -{ - _Unwind_Exception* unwind_exception = static_cast<_Unwind_Exception*>(unwind_arg); - bool native_exception = __isOurExceptionClass(unwind_exception); - __cxa_eh_globals* globals = __cxa_get_globals(); - // exception_header is a hackish offset from a foreign exception, but it - // works as long as we're careful not to try to access any __cxa_exception - // parts. - __cxa_exception* exception_header = - cxa_exception_from_exception_unwind_exception - ( - static_cast<_Unwind_Exception*>(unwind_exception) - ); - if (native_exception) - { - // Increment the handler count, removing the flag about being rethrown - exception_header->handlerCount = exception_header->handlerCount < 0 ? - -exception_header->handlerCount + 1 : exception_header->handlerCount + 1; - // place the exception on the top of the stack if it's not already - // there by a previous rethrow - if (exception_header != globals->caughtExceptions) - { - exception_header->nextException = globals->caughtExceptions; - globals->caughtExceptions = exception_header; - } - globals->uncaughtExceptions -= 1; // Not atomically, since globals are thread-local -#if defined(_LIBCXXABI_ARM_EHABI) - return reinterpret_cast<void*>(exception_header->unwindHeader.barrier_cache.bitpattern[0]); -#else - return exception_header->adjustedPtr; -#endif - } - // Else this is a foreign exception - // If the caughtExceptions stack is not empty, terminate - if (globals->caughtExceptions != 0) - std::terminate(); - // Push the foreign exception on to the stack - globals->caughtExceptions = exception_header; - return unwind_exception + 1; -} - - -/* -Upon exit for any reason, a handler must call: - void __cxa_end_catch (); - -This routine can be called for either a native or foreign exception. -For a native exception: -* Locates the most recently caught exception and decrements its handler count. -* Removes the exception from the caught exception stack, if the handler count goes to zero. -* If the handler count goes down to zero, and the exception was not re-thrown - by throw, it locates the primary exception (which may be the same as the one - it's handling) and decrements its reference count. If that reference count - goes to zero, the function destroys the exception. In any case, if the current - exception is a dependent exception, it destroys that. - -For a foreign exception: -* If it has been rethrown, there is nothing to do. -* Otherwise delete the exception and pop the catch stack to empty. -*/ -void __cxa_end_catch() { - static_assert(sizeof(__cxa_exception) == sizeof(__cxa_dependent_exception), - "sizeof(__cxa_exception) must be equal to " - "sizeof(__cxa_dependent_exception)"); - static_assert(__builtin_offsetof(__cxa_exception, referenceCount) == - __builtin_offsetof(__cxa_dependent_exception, - primaryException), - "the layout of __cxa_exception must match the layout of " - "__cxa_dependent_exception"); - static_assert(__builtin_offsetof(__cxa_exception, handlerCount) == - __builtin_offsetof(__cxa_dependent_exception, handlerCount), - "the layout of __cxa_exception must match the layout of " - "__cxa_dependent_exception"); - __cxa_eh_globals* globals = __cxa_get_globals_fast(); // __cxa_get_globals called in __cxa_begin_catch - __cxa_exception* exception_header = globals->caughtExceptions; - // If we've rethrown a foreign exception, then globals->caughtExceptions - // will have been made an empty stack by __cxa_rethrow() and there is - // nothing more to be done. Do nothing! - if (NULL != exception_header) - { - bool native_exception = __isOurExceptionClass(&exception_header->unwindHeader); - if (native_exception) - { - // This is a native exception - if (exception_header->handlerCount < 0) - { - // The exception has been rethrown by __cxa_rethrow, so don't delete it - if (0 == incrementHandlerCount(exception_header)) - { - // Remove from the chain of uncaught exceptions - globals->caughtExceptions = exception_header->nextException; - // but don't destroy - } - // Keep handlerCount negative in case there are nested catch's - // that need to be told that this exception is rethrown. Don't - // erase this rethrow flag until the exception is recaught. - } - else - { - // The native exception has not been rethrown - if (0 == decrementHandlerCount(exception_header)) - { - // Remove from the chain of uncaught exceptions - globals->caughtExceptions = exception_header->nextException; - // Destroy this exception, being careful to distinguish - // between dependent and primary exceptions - if (isDependentException(&exception_header->unwindHeader)) - { - // Reset exception_header to primaryException and deallocate the dependent exception - __cxa_dependent_exception* dep_exception_header = - reinterpret_cast<__cxa_dependent_exception*>(exception_header); - exception_header = - cxa_exception_from_thrown_object(dep_exception_header->primaryException); - __cxa_free_dependent_exception(dep_exception_header); - } - // Destroy the primary exception only if its referenceCount goes to 0 - // (this decrement must be atomic) - __cxa_decrement_exception_refcount(thrown_object_from_cxa_exception(exception_header)); - } - } - } - else - { - // The foreign exception has not been rethrown. Pop the stack - // and delete it. If there are nested catch's and they try - // to touch a foreign exception in any way, that is undefined - // behavior. They likely can't since the only way to catch - // a foreign exception is with catch (...)! - _Unwind_DeleteException(&globals->caughtExceptions->unwindHeader); - globals->caughtExceptions = 0; - } - } -} - -// Note: exception_header may be masquerading as a __cxa_dependent_exception -// and that's ok. exceptionType is there too. -// However watch out for foreign exceptions. Return null for them. -std::type_info *__cxa_current_exception_type() { -// get the current exception - __cxa_eh_globals *globals = __cxa_get_globals_fast(); - if (NULL == globals) - return NULL; // If there have never been any exceptions, there are none now. - __cxa_exception *exception_header = globals->caughtExceptions; - if (NULL == exception_header) - return NULL; // No current exception - if (!__isOurExceptionClass(&exception_header->unwindHeader)) - return NULL; - return exception_header->exceptionType; -} - -// 2.5.4 Rethrowing Exceptions -/* This routine can rethrow native or foreign exceptions. -If the exception is native: -* marks the exception object on top of the caughtExceptions stack - (in an implementation-defined way) as being rethrown. -* If the caughtExceptions stack is empty, it calls terminate() - (see [C++FDIS] [except.throw], 15.1.8). -* It then calls _Unwind_RaiseException which should not return - (terminate if it does). - Note: exception_header may be masquerading as a __cxa_dependent_exception - and that's ok. -*/ -void __cxa_rethrow() { - __cxa_eh_globals* globals = __cxa_get_globals(); - __cxa_exception* exception_header = globals->caughtExceptions; - if (NULL == exception_header) - std::terminate(); // throw; called outside of a exception handler - bool native_exception = __isOurExceptionClass(&exception_header->unwindHeader); - if (native_exception) - { - // Mark the exception as being rethrown (reverse the effects of __cxa_begin_catch) - exception_header->handlerCount = -exception_header->handlerCount; - globals->uncaughtExceptions += 1; - // __cxa_end_catch will remove this exception from the caughtExceptions stack if necessary - } - else // this is a foreign exception - { - // The only way to communicate to __cxa_end_catch that we've rethrown - // a foreign exception, so don't delete us, is to pop the stack here - // which must be empty afterwards. Then __cxa_end_catch will do - // nothing - globals->caughtExceptions = 0; - } -#ifdef __USING_SJLJ_EXCEPTIONS__ - _Unwind_SjLj_RaiseException(&exception_header->unwindHeader); -#else - _Unwind_RaiseException(&exception_header->unwindHeader); -#endif - - // If we get here, some kind of unwinding error has occurred. - // There is some weird code generation bug happening with - // Apple clang version 4.0 (tags/Apple/clang-418.0.2) (based on LLVM 3.1svn) - // If we call failed_throw here. Turns up with -O2 or higher, and -Os. - __cxa_begin_catch(&exception_header->unwindHeader); - if (native_exception) - std::__terminate(exception_header->terminateHandler); - // Foreign exception: can't get exception_header->terminateHandler - std::terminate(); -} - -/* - If thrown_object is not null, atomically increment the referenceCount field - of the __cxa_exception header associated with the thrown object referred to - by thrown_object. - - Requires: If thrown_object is not NULL, it is a native exception. -*/ -void -__cxa_increment_exception_refcount(void *thrown_object) throw() { - if (thrown_object != NULL ) - { - __cxa_exception* exception_header = cxa_exception_from_thrown_object(thrown_object); - std::__libcpp_atomic_add(&exception_header->referenceCount, size_t(1)); - } -} - -/* - If thrown_object is not null, atomically decrement the referenceCount field - of the __cxa_exception header associated with the thrown object referred to - by thrown_object. If the referenceCount drops to zero, destroy and - deallocate the exception. - - Requires: If thrown_object is not NULL, it is a native exception. -*/ -_LIBCXXABI_NO_CFI -void __cxa_decrement_exception_refcount(void *thrown_object) throw() { - if (thrown_object != NULL ) - { - __cxa_exception* exception_header = cxa_exception_from_thrown_object(thrown_object); - if (std::__libcpp_atomic_add(&exception_header->referenceCount, size_t(-1)) == 0) - { - if (NULL != exception_header->exceptionDestructor) - exception_header->exceptionDestructor(thrown_object); - __cxa_free_exception(thrown_object); - } - } -} - -/* - Returns a pointer to the thrown object (if any) at the top of the - caughtExceptions stack. Atomically increment the exception's referenceCount. - If there is no such thrown object or if the thrown object is foreign, - returns null. - - We can use __cxa_get_globals_fast here to get the globals because if there have - been no exceptions thrown, ever, on this thread, we can return NULL without - the need to allocate the exception-handling globals. -*/ -void *__cxa_current_primary_exception() throw() { -// get the current exception - __cxa_eh_globals* globals = __cxa_get_globals_fast(); - if (NULL == globals) - return NULL; // If there are no globals, there is no exception - __cxa_exception* exception_header = globals->caughtExceptions; - if (NULL == exception_header) - return NULL; // No current exception - if (!__isOurExceptionClass(&exception_header->unwindHeader)) - return NULL; // Can't capture a foreign exception (no way to refcount it) - if (isDependentException(&exception_header->unwindHeader)) { - __cxa_dependent_exception* dep_exception_header = - reinterpret_cast<__cxa_dependent_exception*>(exception_header); - exception_header = cxa_exception_from_thrown_object(dep_exception_header->primaryException); - } - void* thrown_object = thrown_object_from_cxa_exception(exception_header); - __cxa_increment_exception_refcount(thrown_object); - return thrown_object; -} - -/* - If reason isn't _URC_FOREIGN_EXCEPTION_CAUGHT, then the terminateHandler - stored in exc is called. Otherwise the referenceCount stored in the - primary exception is decremented, destroying the primary if necessary. - Finally the dependent exception is destroyed. -*/ -static -void -dependent_exception_cleanup(_Unwind_Reason_Code reason, _Unwind_Exception* unwind_exception) -{ - __cxa_dependent_exception* dep_exception_header = - reinterpret_cast<__cxa_dependent_exception*>(unwind_exception + 1) - 1; - if (_URC_FOREIGN_EXCEPTION_CAUGHT != reason) - std::__terminate(dep_exception_header->terminateHandler); - __cxa_decrement_exception_refcount(dep_exception_header->primaryException); - __cxa_free_dependent_exception(dep_exception_header); -} - -/* - If thrown_object is not null, allocate, initialize and throw a dependent - exception. -*/ -void -__cxa_rethrow_primary_exception(void* thrown_object) -{ - if ( thrown_object != NULL ) - { - // thrown_object guaranteed to be native because - // __cxa_current_primary_exception returns NULL for foreign exceptions - __cxa_exception* exception_header = cxa_exception_from_thrown_object(thrown_object); - __cxa_dependent_exception* dep_exception_header = - static_cast<__cxa_dependent_exception*>(__cxa_allocate_dependent_exception()); - dep_exception_header->primaryException = thrown_object; - __cxa_increment_exception_refcount(thrown_object); - dep_exception_header->exceptionType = exception_header->exceptionType; - dep_exception_header->unexpectedHandler = std::get_unexpected(); - dep_exception_header->terminateHandler = std::get_terminate(); - setDependentExceptionClass(&dep_exception_header->unwindHeader); - __cxa_get_globals()->uncaughtExceptions += 1; - dep_exception_header->unwindHeader.exception_cleanup = dependent_exception_cleanup; -#ifdef __USING_SJLJ_EXCEPTIONS__ - _Unwind_SjLj_RaiseException(&dep_exception_header->unwindHeader); -#else - _Unwind_RaiseException(&dep_exception_header->unwindHeader); -#endif - // Some sort of unwinding error. Note that terminate is a handler. - __cxa_begin_catch(&dep_exception_header->unwindHeader); - } - // If we return client will call terminate() -} - -bool -__cxa_uncaught_exception() throw() { return __cxa_uncaught_exceptions() != 0; } - -unsigned int -__cxa_uncaught_exceptions() throw() -{ - // This does not report foreign exceptions in flight - __cxa_eh_globals* globals = __cxa_get_globals_fast(); - if (globals == 0) - return 0; - return globals->uncaughtExceptions; -} - -} // extern "C" - -} // abi + +/* +This routine can catch foreign or native exceptions. If native, the exception +can be a primary or dependent variety. This routine may remain blissfully +ignorant of whether the native exception is primary or dependent. + +If the exception is native: +* Increment's the exception's handler count. +* Push the exception on the stack of currently-caught exceptions if it is not + already there (from a rethrow). +* Decrements the uncaught_exception count. +* Returns the adjusted pointer to the exception object, which is stored in + the __cxa_exception by the personality routine. + +If the exception is foreign, this means it did not originate from one of throw +routines. The foreign exception does not necessarily have a __cxa_exception +header. However we can catch it here with a catch (...), or with a call +to terminate or unexpected during unwinding. +* Do not try to increment the exception's handler count, we don't know where + it is. +* Push the exception on the stack of currently-caught exceptions only if the + stack is empty. The foreign exception has no way to link to the current + top of stack. If the stack is not empty, call terminate. Even with an + empty stack, this is hacked in by pushing a pointer to an imaginary + __cxa_exception block in front of the foreign exception. It would be better + if the __cxa_eh_globals structure had a stack of _Unwind_Exception, but it + doesn't. It has a stack of __cxa_exception (which has a next* in it). +* Do not decrement the uncaught_exception count because we didn't increment it + in __cxa_throw (or one of our rethrow functions). +* If we haven't terminated, assume the exception object is just past the + _Unwind_Exception and return a pointer to that. +*/ +void* +__cxa_begin_catch(void* unwind_arg) throw() +{ + _Unwind_Exception* unwind_exception = static_cast<_Unwind_Exception*>(unwind_arg); + bool native_exception = __isOurExceptionClass(unwind_exception); + __cxa_eh_globals* globals = __cxa_get_globals(); + // exception_header is a hackish offset from a foreign exception, but it + // works as long as we're careful not to try to access any __cxa_exception + // parts. + __cxa_exception* exception_header = + cxa_exception_from_exception_unwind_exception + ( + static_cast<_Unwind_Exception*>(unwind_exception) + ); + if (native_exception) + { + // Increment the handler count, removing the flag about being rethrown + exception_header->handlerCount = exception_header->handlerCount < 0 ? + -exception_header->handlerCount + 1 : exception_header->handlerCount + 1; + // place the exception on the top of the stack if it's not already + // there by a previous rethrow + if (exception_header != globals->caughtExceptions) + { + exception_header->nextException = globals->caughtExceptions; + globals->caughtExceptions = exception_header; + } + globals->uncaughtExceptions -= 1; // Not atomically, since globals are thread-local +#if defined(_LIBCXXABI_ARM_EHABI) + return reinterpret_cast<void*>(exception_header->unwindHeader.barrier_cache.bitpattern[0]); +#else + return exception_header->adjustedPtr; +#endif + } + // Else this is a foreign exception + // If the caughtExceptions stack is not empty, terminate + if (globals->caughtExceptions != 0) + std::terminate(); + // Push the foreign exception on to the stack + globals->caughtExceptions = exception_header; + return unwind_exception + 1; +} + + +/* +Upon exit for any reason, a handler must call: + void __cxa_end_catch (); + +This routine can be called for either a native or foreign exception. +For a native exception: +* Locates the most recently caught exception and decrements its handler count. +* Removes the exception from the caught exception stack, if the handler count goes to zero. +* If the handler count goes down to zero, and the exception was not re-thrown + by throw, it locates the primary exception (which may be the same as the one + it's handling) and decrements its reference count. If that reference count + goes to zero, the function destroys the exception. In any case, if the current + exception is a dependent exception, it destroys that. + +For a foreign exception: +* If it has been rethrown, there is nothing to do. +* Otherwise delete the exception and pop the catch stack to empty. +*/ +void __cxa_end_catch() { + static_assert(sizeof(__cxa_exception) == sizeof(__cxa_dependent_exception), + "sizeof(__cxa_exception) must be equal to " + "sizeof(__cxa_dependent_exception)"); + static_assert(__builtin_offsetof(__cxa_exception, referenceCount) == + __builtin_offsetof(__cxa_dependent_exception, + primaryException), + "the layout of __cxa_exception must match the layout of " + "__cxa_dependent_exception"); + static_assert(__builtin_offsetof(__cxa_exception, handlerCount) == + __builtin_offsetof(__cxa_dependent_exception, handlerCount), + "the layout of __cxa_exception must match the layout of " + "__cxa_dependent_exception"); + __cxa_eh_globals* globals = __cxa_get_globals_fast(); // __cxa_get_globals called in __cxa_begin_catch + __cxa_exception* exception_header = globals->caughtExceptions; + // If we've rethrown a foreign exception, then globals->caughtExceptions + // will have been made an empty stack by __cxa_rethrow() and there is + // nothing more to be done. Do nothing! + if (NULL != exception_header) + { + bool native_exception = __isOurExceptionClass(&exception_header->unwindHeader); + if (native_exception) + { + // This is a native exception + if (exception_header->handlerCount < 0) + { + // The exception has been rethrown by __cxa_rethrow, so don't delete it + if (0 == incrementHandlerCount(exception_header)) + { + // Remove from the chain of uncaught exceptions + globals->caughtExceptions = exception_header->nextException; + // but don't destroy + } + // Keep handlerCount negative in case there are nested catch's + // that need to be told that this exception is rethrown. Don't + // erase this rethrow flag until the exception is recaught. + } + else + { + // The native exception has not been rethrown + if (0 == decrementHandlerCount(exception_header)) + { + // Remove from the chain of uncaught exceptions + globals->caughtExceptions = exception_header->nextException; + // Destroy this exception, being careful to distinguish + // between dependent and primary exceptions + if (isDependentException(&exception_header->unwindHeader)) + { + // Reset exception_header to primaryException and deallocate the dependent exception + __cxa_dependent_exception* dep_exception_header = + reinterpret_cast<__cxa_dependent_exception*>(exception_header); + exception_header = + cxa_exception_from_thrown_object(dep_exception_header->primaryException); + __cxa_free_dependent_exception(dep_exception_header); + } + // Destroy the primary exception only if its referenceCount goes to 0 + // (this decrement must be atomic) + __cxa_decrement_exception_refcount(thrown_object_from_cxa_exception(exception_header)); + } + } + } + else + { + // The foreign exception has not been rethrown. Pop the stack + // and delete it. If there are nested catch's and they try + // to touch a foreign exception in any way, that is undefined + // behavior. They likely can't since the only way to catch + // a foreign exception is with catch (...)! + _Unwind_DeleteException(&globals->caughtExceptions->unwindHeader); + globals->caughtExceptions = 0; + } + } +} + +// Note: exception_header may be masquerading as a __cxa_dependent_exception +// and that's ok. exceptionType is there too. +// However watch out for foreign exceptions. Return null for them. +std::type_info *__cxa_current_exception_type() { +// get the current exception + __cxa_eh_globals *globals = __cxa_get_globals_fast(); + if (NULL == globals) + return NULL; // If there have never been any exceptions, there are none now. + __cxa_exception *exception_header = globals->caughtExceptions; + if (NULL == exception_header) + return NULL; // No current exception + if (!__isOurExceptionClass(&exception_header->unwindHeader)) + return NULL; + return exception_header->exceptionType; +} + +// 2.5.4 Rethrowing Exceptions +/* This routine can rethrow native or foreign exceptions. +If the exception is native: +* marks the exception object on top of the caughtExceptions stack + (in an implementation-defined way) as being rethrown. +* If the caughtExceptions stack is empty, it calls terminate() + (see [C++FDIS] [except.throw], 15.1.8). +* It then calls _Unwind_RaiseException which should not return + (terminate if it does). + Note: exception_header may be masquerading as a __cxa_dependent_exception + and that's ok. +*/ +void __cxa_rethrow() { + __cxa_eh_globals* globals = __cxa_get_globals(); + __cxa_exception* exception_header = globals->caughtExceptions; + if (NULL == exception_header) + std::terminate(); // throw; called outside of a exception handler + bool native_exception = __isOurExceptionClass(&exception_header->unwindHeader); + if (native_exception) + { + // Mark the exception as being rethrown (reverse the effects of __cxa_begin_catch) + exception_header->handlerCount = -exception_header->handlerCount; + globals->uncaughtExceptions += 1; + // __cxa_end_catch will remove this exception from the caughtExceptions stack if necessary + } + else // this is a foreign exception + { + // The only way to communicate to __cxa_end_catch that we've rethrown + // a foreign exception, so don't delete us, is to pop the stack here + // which must be empty afterwards. Then __cxa_end_catch will do + // nothing + globals->caughtExceptions = 0; + } +#ifdef __USING_SJLJ_EXCEPTIONS__ + _Unwind_SjLj_RaiseException(&exception_header->unwindHeader); +#else + _Unwind_RaiseException(&exception_header->unwindHeader); +#endif + + // If we get here, some kind of unwinding error has occurred. + // There is some weird code generation bug happening with + // Apple clang version 4.0 (tags/Apple/clang-418.0.2) (based on LLVM 3.1svn) + // If we call failed_throw here. Turns up with -O2 or higher, and -Os. + __cxa_begin_catch(&exception_header->unwindHeader); + if (native_exception) + std::__terminate(exception_header->terminateHandler); + // Foreign exception: can't get exception_header->terminateHandler + std::terminate(); +} + +/* + If thrown_object is not null, atomically increment the referenceCount field + of the __cxa_exception header associated with the thrown object referred to + by thrown_object. + + Requires: If thrown_object is not NULL, it is a native exception. +*/ +void +__cxa_increment_exception_refcount(void *thrown_object) throw() { + if (thrown_object != NULL ) + { + __cxa_exception* exception_header = cxa_exception_from_thrown_object(thrown_object); + std::__libcpp_atomic_add(&exception_header->referenceCount, size_t(1)); + } +} + +/* + If thrown_object is not null, atomically decrement the referenceCount field + of the __cxa_exception header associated with the thrown object referred to + by thrown_object. If the referenceCount drops to zero, destroy and + deallocate the exception. + + Requires: If thrown_object is not NULL, it is a native exception. +*/ +_LIBCXXABI_NO_CFI +void __cxa_decrement_exception_refcount(void *thrown_object) throw() { + if (thrown_object != NULL ) + { + __cxa_exception* exception_header = cxa_exception_from_thrown_object(thrown_object); + if (std::__libcpp_atomic_add(&exception_header->referenceCount, size_t(-1)) == 0) + { + if (NULL != exception_header->exceptionDestructor) + exception_header->exceptionDestructor(thrown_object); + __cxa_free_exception(thrown_object); + } + } +} + +/* + Returns a pointer to the thrown object (if any) at the top of the + caughtExceptions stack. Atomically increment the exception's referenceCount. + If there is no such thrown object or if the thrown object is foreign, + returns null. + + We can use __cxa_get_globals_fast here to get the globals because if there have + been no exceptions thrown, ever, on this thread, we can return NULL without + the need to allocate the exception-handling globals. +*/ +void *__cxa_current_primary_exception() throw() { +// get the current exception + __cxa_eh_globals* globals = __cxa_get_globals_fast(); + if (NULL == globals) + return NULL; // If there are no globals, there is no exception + __cxa_exception* exception_header = globals->caughtExceptions; + if (NULL == exception_header) + return NULL; // No current exception + if (!__isOurExceptionClass(&exception_header->unwindHeader)) + return NULL; // Can't capture a foreign exception (no way to refcount it) + if (isDependentException(&exception_header->unwindHeader)) { + __cxa_dependent_exception* dep_exception_header = + reinterpret_cast<__cxa_dependent_exception*>(exception_header); + exception_header = cxa_exception_from_thrown_object(dep_exception_header->primaryException); + } + void* thrown_object = thrown_object_from_cxa_exception(exception_header); + __cxa_increment_exception_refcount(thrown_object); + return thrown_object; +} + +/* + If reason isn't _URC_FOREIGN_EXCEPTION_CAUGHT, then the terminateHandler + stored in exc is called. Otherwise the referenceCount stored in the + primary exception is decremented, destroying the primary if necessary. + Finally the dependent exception is destroyed. +*/ +static +void +dependent_exception_cleanup(_Unwind_Reason_Code reason, _Unwind_Exception* unwind_exception) +{ + __cxa_dependent_exception* dep_exception_header = + reinterpret_cast<__cxa_dependent_exception*>(unwind_exception + 1) - 1; + if (_URC_FOREIGN_EXCEPTION_CAUGHT != reason) + std::__terminate(dep_exception_header->terminateHandler); + __cxa_decrement_exception_refcount(dep_exception_header->primaryException); + __cxa_free_dependent_exception(dep_exception_header); +} + +/* + If thrown_object is not null, allocate, initialize and throw a dependent + exception. +*/ +void +__cxa_rethrow_primary_exception(void* thrown_object) +{ + if ( thrown_object != NULL ) + { + // thrown_object guaranteed to be native because + // __cxa_current_primary_exception returns NULL for foreign exceptions + __cxa_exception* exception_header = cxa_exception_from_thrown_object(thrown_object); + __cxa_dependent_exception* dep_exception_header = + static_cast<__cxa_dependent_exception*>(__cxa_allocate_dependent_exception()); + dep_exception_header->primaryException = thrown_object; + __cxa_increment_exception_refcount(thrown_object); + dep_exception_header->exceptionType = exception_header->exceptionType; + dep_exception_header->unexpectedHandler = std::get_unexpected(); + dep_exception_header->terminateHandler = std::get_terminate(); + setDependentExceptionClass(&dep_exception_header->unwindHeader); + __cxa_get_globals()->uncaughtExceptions += 1; + dep_exception_header->unwindHeader.exception_cleanup = dependent_exception_cleanup; +#ifdef __USING_SJLJ_EXCEPTIONS__ + _Unwind_SjLj_RaiseException(&dep_exception_header->unwindHeader); +#else + _Unwind_RaiseException(&dep_exception_header->unwindHeader); +#endif + // Some sort of unwinding error. Note that terminate is a handler. + __cxa_begin_catch(&dep_exception_header->unwindHeader); + } + // If we return client will call terminate() +} + +bool +__cxa_uncaught_exception() throw() { return __cxa_uncaught_exceptions() != 0; } + +unsigned int +__cxa_uncaught_exceptions() throw() +{ + // This does not report foreign exceptions in flight + __cxa_eh_globals* globals = __cxa_get_globals_fast(); + if (globals == 0) + return 0; + return globals->uncaughtExceptions; +} + +} // extern "C" + +} // abi diff --git a/contrib/libs/cxxsupp/libcxxabi/src/cxa_exception.h b/contrib/libs/cxxsupp/libcxxabi/src/cxa_exception.h index 7a32fb653b..f865519f68 100644 --- a/contrib/libs/cxxsupp/libcxxabi/src/cxa_exception.h +++ b/contrib/libs/cxxsupp/libcxxabi/src/cxa_exception.h @@ -1,164 +1,164 @@ //===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// -// This file implements the "Exception Handling APIs" -// https://itanium-cxx-abi.github.io/cxx-abi/abi-eh.html -// -//===----------------------------------------------------------------------===// - -#ifndef _CXA_EXCEPTION_H -#define _CXA_EXCEPTION_H - -#include <exception> // for std::unexpected_handler and std::terminate_handler -#include "cxxabi.h" -#include "unwind.h" - -namespace __cxxabiv1 { - -static const uint64_t kOurExceptionClass = 0x434C4E47432B2B00; // CLNGC++\0 -static const uint64_t kOurDependentExceptionClass = 0x434C4E47432B2B01; // CLNGC++\1 -static const uint64_t get_vendor_and_language = 0xFFFFFFFFFFFFFF00; // mask for CLNGC++ - -_LIBCXXABI_HIDDEN uint64_t __getExceptionClass (const _Unwind_Exception*); -_LIBCXXABI_HIDDEN void __setExceptionClass ( _Unwind_Exception*, uint64_t); -_LIBCXXABI_HIDDEN bool __isOurExceptionClass(const _Unwind_Exception*); - -struct _LIBCXXABI_HIDDEN __cxa_exception { -#if defined(__LP64__) || defined(_WIN64) || defined(_LIBCXXABI_ARM_EHABI) - // Now _Unwind_Exception is marked with __attribute__((aligned)), - // which implies __cxa_exception is also aligned. Insert padding - // in the beginning of the struct, rather than before unwindHeader. - void *reserve; - - // This is a new field to support C++ 0x exception_ptr. - // For binary compatibility it is at the start of this - // struct which is prepended to the object thrown in - // __cxa_allocate_exception. - size_t referenceCount; -#endif - - // Manage the exception object itself. - std::type_info *exceptionType; - void (*exceptionDestructor)(void *); - std::unexpected_handler unexpectedHandler; - std::terminate_handler terminateHandler; - - __cxa_exception *nextException; - - int handlerCount; - -#if defined(_LIBCXXABI_ARM_EHABI) - __cxa_exception* nextPropagatingException; - int propagationCount; -#else - int handlerSwitchValue; - const unsigned char *actionRecord; - const unsigned char *languageSpecificData; - void *catchTemp; - void *adjustedPtr; -#endif - -#if !defined(__LP64__) && !defined(_WIN64) && !defined(_LIBCXXABI_ARM_EHABI) - // This is a new field to support C++ 0x exception_ptr. - // For binary compatibility it is placed where the compiler - // previously adding padded to 64-bit align unwindHeader. - size_t referenceCount; -#endif - _Unwind_Exception unwindHeader; -}; - -// http://sourcery.mentor.com/archives/cxx-abi-dev/msg01924.html -// The layout of this structure MUST match the layout of __cxa_exception, with -// primaryException instead of referenceCount. -struct _LIBCXXABI_HIDDEN __cxa_dependent_exception { -#if defined(__LP64__) || defined(_WIN64) || defined(_LIBCXXABI_ARM_EHABI) - void* reserve; // padding. - void* primaryException; -#endif - - std::type_info *exceptionType; - void (*exceptionDestructor)(void *); - std::unexpected_handler unexpectedHandler; - std::terminate_handler terminateHandler; - - __cxa_exception *nextException; - - int handlerCount; - -#if defined(_LIBCXXABI_ARM_EHABI) - __cxa_exception* nextPropagatingException; - int propagationCount; -#else - int handlerSwitchValue; - const unsigned char *actionRecord; - const unsigned char *languageSpecificData; - void * catchTemp; - void *adjustedPtr; -#endif - -#if !defined(__LP64__) && !defined(_WIN64) && !defined(_LIBCXXABI_ARM_EHABI) - void* primaryException; -#endif - _Unwind_Exception unwindHeader; -}; - -// Verify the negative offsets of different fields. -static_assert(sizeof(_Unwind_Exception) + - offsetof(__cxa_exception, unwindHeader) == - sizeof(__cxa_exception), - "unwindHeader has wrong negative offsets"); -static_assert(sizeof(_Unwind_Exception) + - offsetof(__cxa_dependent_exception, unwindHeader) == - sizeof(__cxa_dependent_exception), - "unwindHeader has wrong negative offsets"); - -#if defined(_LIBCXXABI_ARM_EHABI) -static_assert(offsetof(__cxa_exception, propagationCount) + - sizeof(_Unwind_Exception) + sizeof(void*) == - sizeof(__cxa_exception), - "propagationCount has wrong negative offset"); -static_assert(offsetof(__cxa_dependent_exception, propagationCount) + - sizeof(_Unwind_Exception) + sizeof(void*) == - sizeof(__cxa_dependent_exception), - "propagationCount has wrong negative offset"); -#elif defined(__LP64__) || defined(_WIN64) -static_assert(offsetof(__cxa_exception, adjustedPtr) + - sizeof(_Unwind_Exception) + sizeof(void*) == - sizeof(__cxa_exception), - "adjustedPtr has wrong negative offset"); -static_assert(offsetof(__cxa_dependent_exception, adjustedPtr) + - sizeof(_Unwind_Exception) + sizeof(void*) == - sizeof(__cxa_dependent_exception), - "adjustedPtr has wrong negative offset"); -#else -static_assert(offsetof(__cxa_exception, referenceCount) + - sizeof(_Unwind_Exception) + sizeof(void*) == - sizeof(__cxa_exception), - "referenceCount has wrong negative offset"); -static_assert(offsetof(__cxa_dependent_exception, primaryException) + - sizeof(_Unwind_Exception) + sizeof(void*) == - sizeof(__cxa_dependent_exception), - "primaryException has wrong negative offset"); -#endif - -struct _LIBCXXABI_HIDDEN __cxa_eh_globals { - __cxa_exception * caughtExceptions; - unsigned int uncaughtExceptions; -#if defined(_LIBCXXABI_ARM_EHABI) - __cxa_exception* propagatingExceptions; -#endif -}; - -extern "C" _LIBCXXABI_FUNC_VIS __cxa_eh_globals * __cxa_get_globals (); -extern "C" _LIBCXXABI_FUNC_VIS __cxa_eh_globals * __cxa_get_globals_fast (); - -extern "C" _LIBCXXABI_FUNC_VIS void * __cxa_allocate_dependent_exception (); -extern "C" _LIBCXXABI_FUNC_VIS void __cxa_free_dependent_exception (void * dependent_exception); - -} // namespace __cxxabiv1 - +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// +// This file implements the "Exception Handling APIs" +// https://itanium-cxx-abi.github.io/cxx-abi/abi-eh.html +// +//===----------------------------------------------------------------------===// + +#ifndef _CXA_EXCEPTION_H +#define _CXA_EXCEPTION_H + +#include <exception> // for std::unexpected_handler and std::terminate_handler +#include "cxxabi.h" +#include "unwind.h" + +namespace __cxxabiv1 { + +static const uint64_t kOurExceptionClass = 0x434C4E47432B2B00; // CLNGC++\0 +static const uint64_t kOurDependentExceptionClass = 0x434C4E47432B2B01; // CLNGC++\1 +static const uint64_t get_vendor_and_language = 0xFFFFFFFFFFFFFF00; // mask for CLNGC++ + +_LIBCXXABI_HIDDEN uint64_t __getExceptionClass (const _Unwind_Exception*); +_LIBCXXABI_HIDDEN void __setExceptionClass ( _Unwind_Exception*, uint64_t); +_LIBCXXABI_HIDDEN bool __isOurExceptionClass(const _Unwind_Exception*); + +struct _LIBCXXABI_HIDDEN __cxa_exception { +#if defined(__LP64__) || defined(_WIN64) || defined(_LIBCXXABI_ARM_EHABI) + // Now _Unwind_Exception is marked with __attribute__((aligned)), + // which implies __cxa_exception is also aligned. Insert padding + // in the beginning of the struct, rather than before unwindHeader. + void *reserve; + + // This is a new field to support C++ 0x exception_ptr. + // For binary compatibility it is at the start of this + // struct which is prepended to the object thrown in + // __cxa_allocate_exception. + size_t referenceCount; +#endif + + // Manage the exception object itself. + std::type_info *exceptionType; + void (*exceptionDestructor)(void *); + std::unexpected_handler unexpectedHandler; + std::terminate_handler terminateHandler; + + __cxa_exception *nextException; + + int handlerCount; + +#if defined(_LIBCXXABI_ARM_EHABI) + __cxa_exception* nextPropagatingException; + int propagationCount; +#else + int handlerSwitchValue; + const unsigned char *actionRecord; + const unsigned char *languageSpecificData; + void *catchTemp; + void *adjustedPtr; +#endif + +#if !defined(__LP64__) && !defined(_WIN64) && !defined(_LIBCXXABI_ARM_EHABI) + // This is a new field to support C++ 0x exception_ptr. + // For binary compatibility it is placed where the compiler + // previously adding padded to 64-bit align unwindHeader. + size_t referenceCount; +#endif + _Unwind_Exception unwindHeader; +}; + +// http://sourcery.mentor.com/archives/cxx-abi-dev/msg01924.html +// The layout of this structure MUST match the layout of __cxa_exception, with +// primaryException instead of referenceCount. +struct _LIBCXXABI_HIDDEN __cxa_dependent_exception { +#if defined(__LP64__) || defined(_WIN64) || defined(_LIBCXXABI_ARM_EHABI) + void* reserve; // padding. + void* primaryException; +#endif + + std::type_info *exceptionType; + void (*exceptionDestructor)(void *); + std::unexpected_handler unexpectedHandler; + std::terminate_handler terminateHandler; + + __cxa_exception *nextException; + + int handlerCount; + +#if defined(_LIBCXXABI_ARM_EHABI) + __cxa_exception* nextPropagatingException; + int propagationCount; +#else + int handlerSwitchValue; + const unsigned char *actionRecord; + const unsigned char *languageSpecificData; + void * catchTemp; + void *adjustedPtr; +#endif + +#if !defined(__LP64__) && !defined(_WIN64) && !defined(_LIBCXXABI_ARM_EHABI) + void* primaryException; +#endif + _Unwind_Exception unwindHeader; +}; + +// Verify the negative offsets of different fields. +static_assert(sizeof(_Unwind_Exception) + + offsetof(__cxa_exception, unwindHeader) == + sizeof(__cxa_exception), + "unwindHeader has wrong negative offsets"); +static_assert(sizeof(_Unwind_Exception) + + offsetof(__cxa_dependent_exception, unwindHeader) == + sizeof(__cxa_dependent_exception), + "unwindHeader has wrong negative offsets"); + +#if defined(_LIBCXXABI_ARM_EHABI) +static_assert(offsetof(__cxa_exception, propagationCount) + + sizeof(_Unwind_Exception) + sizeof(void*) == + sizeof(__cxa_exception), + "propagationCount has wrong negative offset"); +static_assert(offsetof(__cxa_dependent_exception, propagationCount) + + sizeof(_Unwind_Exception) + sizeof(void*) == + sizeof(__cxa_dependent_exception), + "propagationCount has wrong negative offset"); +#elif defined(__LP64__) || defined(_WIN64) +static_assert(offsetof(__cxa_exception, adjustedPtr) + + sizeof(_Unwind_Exception) + sizeof(void*) == + sizeof(__cxa_exception), + "adjustedPtr has wrong negative offset"); +static_assert(offsetof(__cxa_dependent_exception, adjustedPtr) + + sizeof(_Unwind_Exception) + sizeof(void*) == + sizeof(__cxa_dependent_exception), + "adjustedPtr has wrong negative offset"); +#else +static_assert(offsetof(__cxa_exception, referenceCount) + + sizeof(_Unwind_Exception) + sizeof(void*) == + sizeof(__cxa_exception), + "referenceCount has wrong negative offset"); +static_assert(offsetof(__cxa_dependent_exception, primaryException) + + sizeof(_Unwind_Exception) + sizeof(void*) == + sizeof(__cxa_dependent_exception), + "primaryException has wrong negative offset"); +#endif + +struct _LIBCXXABI_HIDDEN __cxa_eh_globals { + __cxa_exception * caughtExceptions; + unsigned int uncaughtExceptions; +#if defined(_LIBCXXABI_ARM_EHABI) + __cxa_exception* propagatingExceptions; +#endif +}; + +extern "C" _LIBCXXABI_FUNC_VIS __cxa_eh_globals * __cxa_get_globals (); +extern "C" _LIBCXXABI_FUNC_VIS __cxa_eh_globals * __cxa_get_globals_fast (); + +extern "C" _LIBCXXABI_FUNC_VIS void * __cxa_allocate_dependent_exception (); +extern "C" _LIBCXXABI_FUNC_VIS void __cxa_free_dependent_exception (void * dependent_exception); + +} // namespace __cxxabiv1 + #endif // _CXA_EXCEPTION_H diff --git a/contrib/libs/cxxsupp/libcxxabi/src/cxa_exception_storage.cpp b/contrib/libs/cxxsupp/libcxxabi/src/cxa_exception_storage.cpp index 3a3233a1b9..1c2b0ebb60 100644 --- a/contrib/libs/cxxsupp/libcxxabi/src/cxa_exception_storage.cpp +++ b/contrib/libs/cxxsupp/libcxxabi/src/cxa_exception_storage.cpp @@ -1,103 +1,103 @@ //===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// -// This file implements the storage for the "Caught Exception Stack" -// https://itanium-cxx-abi.github.io/cxx-abi/abi-eh.html#cxx-exc-stack -// -//===----------------------------------------------------------------------===// - -#include "cxa_exception.h" - -#include <__threading_support> - -#if defined(_LIBCXXABI_HAS_NO_THREADS) - -namespace __cxxabiv1 { -extern "C" { - static __cxa_eh_globals eh_globals; - __cxa_eh_globals *__cxa_get_globals() { return &eh_globals; } - __cxa_eh_globals *__cxa_get_globals_fast() { return &eh_globals; } +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// +// This file implements the storage for the "Caught Exception Stack" +// https://itanium-cxx-abi.github.io/cxx-abi/abi-eh.html#cxx-exc-stack +// +//===----------------------------------------------------------------------===// + +#include "cxa_exception.h" + +#include <__threading_support> + +#if defined(_LIBCXXABI_HAS_NO_THREADS) + +namespace __cxxabiv1 { +extern "C" { + static __cxa_eh_globals eh_globals; + __cxa_eh_globals *__cxa_get_globals() { return &eh_globals; } + __cxa_eh_globals *__cxa_get_globals_fast() { return &eh_globals; } } // extern "C" } // namespace __cxxabiv1 - -#elif defined(HAS_THREAD_LOCAL) - -namespace __cxxabiv1 { -namespace { + +#elif defined(HAS_THREAD_LOCAL) + +namespace __cxxabiv1 { +namespace { __cxa_eh_globals *__globals() { - static thread_local __cxa_eh_globals eh_globals; - return &eh_globals; - } + static thread_local __cxa_eh_globals eh_globals; + return &eh_globals; + } } // namespace - -extern "C" { + +extern "C" { __cxa_eh_globals *__cxa_get_globals() { return __globals(); } __cxa_eh_globals *__cxa_get_globals_fast() { return __globals(); } } // extern "C" } // namespace __cxxabiv1 - -#else - -#include "abort_message.h" -#include "fallback_malloc.h" - -#if defined(__ELF__) && defined(_LIBCXXABI_LINK_PTHREAD_LIB) -#pragma comment(lib, "pthread") -#endif - -// In general, we treat all threading errors as fatal. -// We cannot call std::terminate() because that will in turn -// call __cxa_get_globals() and cause infinite recursion. - -namespace __cxxabiv1 { -namespace { - std::__libcpp_tls_key key_; - std::__libcpp_exec_once_flag flag_ = _LIBCPP_EXEC_ONCE_INITIALIZER; - + +#else + +#include "abort_message.h" +#include "fallback_malloc.h" + +#if defined(__ELF__) && defined(_LIBCXXABI_LINK_PTHREAD_LIB) +#pragma comment(lib, "pthread") +#endif + +// In general, we treat all threading errors as fatal. +// We cannot call std::terminate() because that will in turn +// call __cxa_get_globals() and cause infinite recursion. + +namespace __cxxabiv1 { +namespace { + std::__libcpp_tls_key key_; + std::__libcpp_exec_once_flag flag_ = _LIBCPP_EXEC_ONCE_INITIALIZER; + void _LIBCPP_TLS_DESTRUCTOR_CC destruct_(void *p) { __free_with_fallback(p); if (0 != std::__libcpp_tls_set(key_, NULL)) - abort_message("cannot zero out thread value for __cxa_get_globals()"); + abort_message("cannot zero out thread value for __cxa_get_globals()"); } - + void construct_() { if (0 != std::__libcpp_tls_create(&key_, destruct_)) - abort_message("cannot create thread specific key for __cxa_get_globals()"); + abort_message("cannot create thread specific key for __cxa_get_globals()"); } } // namespace - -extern "C" { + +extern "C" { __cxa_eh_globals *__cxa_get_globals() { // Try to get the globals for this thread __cxa_eh_globals *retVal = __cxa_get_globals_fast(); - + // If this is the first time we've been asked for these globals, create them if (NULL == retVal) { retVal = static_cast<__cxa_eh_globals*>( __calloc_with_fallback(1, sizeof(__cxa_eh_globals))); if (NULL == retVal) - abort_message("cannot allocate __cxa_eh_globals"); + abort_message("cannot allocate __cxa_eh_globals"); if (0 != std::__libcpp_tls_set(key_, retVal)) - abort_message("std::__libcpp_tls_set failure in __cxa_get_globals()"); + abort_message("std::__libcpp_tls_set failure in __cxa_get_globals()"); } - return retVal; + return retVal; } - - // Note that this implementation will reliably return NULL if not - // preceded by a call to __cxa_get_globals(). This is an extension - // to the Itanium ABI and is taken advantage of in several places in - // libc++abi. + + // Note that this implementation will reliably return NULL if not + // preceded by a call to __cxa_get_globals(). This is an extension + // to the Itanium ABI and is taken advantage of in several places in + // libc++abi. __cxa_eh_globals *__cxa_get_globals_fast() { // First time through, create the key. - if (0 != std::__libcpp_execute_once(&flag_, construct_)) - abort_message("execute once failure in __cxa_get_globals_fast()"); - return static_cast<__cxa_eh_globals*>(std::__libcpp_tls_get(key_)); + if (0 != std::__libcpp_execute_once(&flag_, construct_)) + abort_message("execute once failure in __cxa_get_globals_fast()"); + return static_cast<__cxa_eh_globals*>(std::__libcpp_tls_get(key_)); } } // extern "C" } // namespace __cxxabiv1 - -#endif + +#endif diff --git a/contrib/libs/cxxsupp/libcxxabi/src/cxa_guard.cpp b/contrib/libs/cxxsupp/libcxxabi/src/cxa_guard.cpp index fc1fa90511..82f318080a 100644 --- a/contrib/libs/cxxsupp/libcxxabi/src/cxa_guard.cpp +++ b/contrib/libs/cxxsupp/libcxxabi/src/cxa_guard.cpp @@ -1,53 +1,53 @@ //===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#include "__cxxabi_config.h" -#include "cxxabi.h" - -// Tell the implementation that we're building the actual implementation -// (and not testing it) -#define BUILDING_CXA_GUARD -#include "cxa_guard_impl.h" - -/* - This implementation must be careful to not call code external to this file - which will turn around and try to call __cxa_guard_acquire reentrantly. - For this reason, the headers of this file are as restricted as possible. - Previous implementations of this code for __APPLE__ have used - std::__libcpp_mutex_lock and the abort_message utility without problem. This - implementation also uses std::__libcpp_condvar_wait which has tested - to not be a problem. -*/ - -namespace __cxxabiv1 { - -#if defined(_LIBCXXABI_GUARD_ABI_ARM) -using guard_type = uint32_t; -#else -using guard_type = uint64_t; -#endif - -extern "C" -{ -_LIBCXXABI_FUNC_VIS int __cxa_guard_acquire(guard_type* raw_guard_object) { - SelectedImplementation imp(raw_guard_object); - return static_cast<int>(imp.cxa_guard_acquire()); -} - -_LIBCXXABI_FUNC_VIS void __cxa_guard_release(guard_type *raw_guard_object) { - SelectedImplementation imp(raw_guard_object); - imp.cxa_guard_release(); -} - -_LIBCXXABI_FUNC_VIS void __cxa_guard_abort(guard_type *raw_guard_object) { - SelectedImplementation imp(raw_guard_object); - imp.cxa_guard_abort(); -} -} // extern "C" - -} // __cxxabiv1 +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "__cxxabi_config.h" +#include "cxxabi.h" + +// Tell the implementation that we're building the actual implementation +// (and not testing it) +#define BUILDING_CXA_GUARD +#include "cxa_guard_impl.h" + +/* + This implementation must be careful to not call code external to this file + which will turn around and try to call __cxa_guard_acquire reentrantly. + For this reason, the headers of this file are as restricted as possible. + Previous implementations of this code for __APPLE__ have used + std::__libcpp_mutex_lock and the abort_message utility without problem. This + implementation also uses std::__libcpp_condvar_wait which has tested + to not be a problem. +*/ + +namespace __cxxabiv1 { + +#if defined(_LIBCXXABI_GUARD_ABI_ARM) +using guard_type = uint32_t; +#else +using guard_type = uint64_t; +#endif + +extern "C" +{ +_LIBCXXABI_FUNC_VIS int __cxa_guard_acquire(guard_type* raw_guard_object) { + SelectedImplementation imp(raw_guard_object); + return static_cast<int>(imp.cxa_guard_acquire()); +} + +_LIBCXXABI_FUNC_VIS void __cxa_guard_release(guard_type *raw_guard_object) { + SelectedImplementation imp(raw_guard_object); + imp.cxa_guard_release(); +} + +_LIBCXXABI_FUNC_VIS void __cxa_guard_abort(guard_type *raw_guard_object) { + SelectedImplementation imp(raw_guard_object); + imp.cxa_guard_abort(); +} +} // extern "C" + +} // __cxxabiv1 diff --git a/contrib/libs/cxxsupp/libcxxabi/src/cxa_guard_impl.h b/contrib/libs/cxxsupp/libcxxabi/src/cxa_guard_impl.h index df3f4a48bb..4f61075dae 100644 --- a/contrib/libs/cxxsupp/libcxxabi/src/cxa_guard_impl.h +++ b/contrib/libs/cxxsupp/libcxxabi/src/cxa_guard_impl.h @@ -1,559 +1,559 @@ -//===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// -#ifndef LIBCXXABI_SRC_INCLUDE_CXA_GUARD_IMPL_H -#define LIBCXXABI_SRC_INCLUDE_CXA_GUARD_IMPL_H - -/* cxa_guard_impl.h - Implements the C++ runtime support for function local - * static guards. - * The layout of the guard object is the same across ARM and Itanium. - * - * The first "guard byte" (which is checked by the compiler) is set only upon - * the completion of cxa release. - * - * The second "init byte" does the rest of the bookkeeping. It tracks if - * initialization is complete or pending, and if there are waiting threads. - * - * If the guard variable is 64-bits and the platforms supplies a 32-bit thread - * identifier, it is used to detect recursive initialization. The thread ID of - * the thread currently performing initialization is stored in the second word. - * - * Guard Object Layout: - * ------------------------------------------------------------------------- - * |a: guard byte | a+1: init byte | a+2 : unused ... | a+4: thread-id ... | +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef LIBCXXABI_SRC_INCLUDE_CXA_GUARD_IMPL_H +#define LIBCXXABI_SRC_INCLUDE_CXA_GUARD_IMPL_H + +/* cxa_guard_impl.h - Implements the C++ runtime support for function local + * static guards. + * The layout of the guard object is the same across ARM and Itanium. + * + * The first "guard byte" (which is checked by the compiler) is set only upon + * the completion of cxa release. + * + * The second "init byte" does the rest of the bookkeeping. It tracks if + * initialization is complete or pending, and if there are waiting threads. + * + * If the guard variable is 64-bits and the platforms supplies a 32-bit thread + * identifier, it is used to detect recursive initialization. The thread ID of + * the thread currently performing initialization is stored in the second word. + * + * Guard Object Layout: + * ------------------------------------------------------------------------- + * |a: guard byte | a+1: init byte | a+2 : unused ... | a+4: thread-id ... | * ------------------------------------------------------------------------- - * - * Access Protocol: - * For each implementation the guard byte is checked and set before accessing - * the init byte. - * - * Overall Design: - * The implementation was designed to allow each implementation to be tested - * independent of the C++ runtime or platform support. - * - */ - -#include "__cxxabi_config.h" + * + * Access Protocol: + * For each implementation the guard byte is checked and set before accessing + * the init byte. + * + * Overall Design: + * The implementation was designed to allow each implementation to be tested + * independent of the C++ runtime or platform support. + * + */ + +#include "__cxxabi_config.h" #include "include/atomic_support.h" // from libc++ -#if defined(__has_include) +#if defined(__has_include) # if __has_include(<sys/syscall.h>) # include <sys/syscall.h> # endif # if __has_include(<unistd.h>) # include <unistd.h> # endif -#endif - -#include <stdlib.h> -#include <__threading_support> -#ifndef _LIBCXXABI_HAS_NO_THREADS +#endif + +#include <stdlib.h> +#include <__threading_support> +#ifndef _LIBCXXABI_HAS_NO_THREADS # if defined(__ELF__) && defined(_LIBCXXABI_LINK_PTHREAD_LIB) # pragma comment(lib, "pthread") # endif -#endif - -#if defined(__clang__) +#endif + +#if defined(__clang__) # pragma clang diagnostic push # pragma clang diagnostic ignored "-Wtautological-pointer-compare" -#elif defined(__GNUC__) +#elif defined(__GNUC__) # pragma GCC diagnostic push # pragma GCC diagnostic ignored "-Waddress" -#endif - -// To make testing possible, this header is included from both cxa_guard.cpp -// and a number of tests. -// -// For this reason we place everything in an anonymous namespace -- even though -// we're in a header. We want the actual implementation and the tests to have -// unique definitions of the types in this header (since the tests may depend -// on function local statics). -// -// To enforce this either `BUILDING_CXA_GUARD` or `TESTING_CXA_GUARD` must be -// defined when including this file. Only `src/cxa_guard.cpp` should define -// the former. -#ifdef BUILDING_CXA_GUARD +#endif + +// To make testing possible, this header is included from both cxa_guard.cpp +// and a number of tests. +// +// For this reason we place everything in an anonymous namespace -- even though +// we're in a header. We want the actual implementation and the tests to have +// unique definitions of the types in this header (since the tests may depend +// on function local statics). +// +// To enforce this either `BUILDING_CXA_GUARD` or `TESTING_CXA_GUARD` must be +// defined when including this file. Only `src/cxa_guard.cpp` should define +// the former. +#ifdef BUILDING_CXA_GUARD # include "abort_message.h" # define ABORT_WITH_MESSAGE(...) ::abort_message(__VA_ARGS__) -#elif defined(TESTING_CXA_GUARD) +#elif defined(TESTING_CXA_GUARD) # define ABORT_WITH_MESSAGE(...) ::abort() -#else +#else # error "Either BUILDING_CXA_GUARD or TESTING_CXA_GUARD must be defined" -#endif - -#if __has_feature(thread_sanitizer) -extern "C" void __tsan_acquire(void*); -extern "C" void __tsan_release(void*); -#else +#endif + +#if __has_feature(thread_sanitizer) +extern "C" void __tsan_acquire(void*); +extern "C" void __tsan_release(void*); +#else # define __tsan_acquire(addr) ((void)0) # define __tsan_release(addr) ((void)0) -#endif - -namespace __cxxabiv1 { -// Use an anonymous namespace to ensure that the tests and actual implementation -// have unique definitions of these symbols. -namespace { - -//===----------------------------------------------------------------------===// -// Misc Utilities -//===----------------------------------------------------------------------===// - +#endif + +namespace __cxxabiv1 { +// Use an anonymous namespace to ensure that the tests and actual implementation +// have unique definitions of these symbols. +namespace { + +//===----------------------------------------------------------------------===// +// Misc Utilities +//===----------------------------------------------------------------------===// + template <class T, T (*Init)()> -struct LazyValue { - LazyValue() : is_init(false) {} - - T& get() { - if (!is_init) { - value = Init(); - is_init = true; - } - return value; - } +struct LazyValue { + LazyValue() : is_init(false) {} + + T& get() { + if (!is_init) { + value = Init(); + is_init = true; + } + return value; + } private: - T value; - bool is_init = false; -}; - -template <class IntType> -class AtomicInt { -public: - using MemoryOrder = std::__libcpp_atomic_order; - + T value; + bool is_init = false; +}; + +template <class IntType> +class AtomicInt { +public: + using MemoryOrder = std::__libcpp_atomic_order; + explicit AtomicInt(IntType* b) : b_(b) {} - AtomicInt(AtomicInt const&) = delete; - AtomicInt& operator=(AtomicInt const&) = delete; - + AtomicInt(AtomicInt const&) = delete; + AtomicInt& operator=(AtomicInt const&) = delete; + IntType load(MemoryOrder ord) { return std::__libcpp_atomic_load(b_, ord); } void store(IntType val, MemoryOrder ord) { std::__libcpp_atomic_store(b_, val, ord); } IntType exchange(IntType new_val, MemoryOrder ord) { return std::__libcpp_atomic_exchange(b_, new_val, ord); } bool compare_exchange(IntType* expected, IntType desired, MemoryOrder ord_success, MemoryOrder ord_failure) { - return std::__libcpp_atomic_compare_exchange(b_, expected, desired, ord_success, ord_failure); - } - -private: + return std::__libcpp_atomic_compare_exchange(b_, expected, desired, ord_success, ord_failure); + } + +private: IntType* b_; -}; - -//===----------------------------------------------------------------------===// -// PlatformGetThreadID -//===----------------------------------------------------------------------===// - -#if defined(__APPLE__) && defined(_LIBCPP_HAS_THREAD_API_PTHREAD) -uint32_t PlatformThreadID() { - static_assert(sizeof(mach_port_t) == sizeof(uint32_t), ""); +}; + +//===----------------------------------------------------------------------===// +// PlatformGetThreadID +//===----------------------------------------------------------------------===// + +#if defined(__APPLE__) && defined(_LIBCPP_HAS_THREAD_API_PTHREAD) +uint32_t PlatformThreadID() { + static_assert(sizeof(mach_port_t) == sizeof(uint32_t), ""); return static_cast<uint32_t>(pthread_mach_thread_np(std::__libcpp_thread_get_current_id())); -} -#elif defined(SYS_gettid) && defined(_LIBCPP_HAS_THREAD_API_PTHREAD) -uint32_t PlatformThreadID() { - static_assert(sizeof(pid_t) == sizeof(uint32_t), ""); - return static_cast<uint32_t>(syscall(SYS_gettid)); -} -#else -constexpr uint32_t (*PlatformThreadID)() = nullptr; -#endif - +} +#elif defined(SYS_gettid) && defined(_LIBCPP_HAS_THREAD_API_PTHREAD) +uint32_t PlatformThreadID() { + static_assert(sizeof(pid_t) == sizeof(uint32_t), ""); + return static_cast<uint32_t>(syscall(SYS_gettid)); +} +#else +constexpr uint32_t (*PlatformThreadID)() = nullptr; +#endif + constexpr bool PlatformSupportsThreadID() { return +PlatformThreadID != nullptr; } - -//===----------------------------------------------------------------------===// -// GuardBase -//===----------------------------------------------------------------------===// - -enum class AcquireResult { - INIT_IS_DONE, - INIT_IS_PENDING, -}; -constexpr AcquireResult INIT_IS_DONE = AcquireResult::INIT_IS_DONE; -constexpr AcquireResult INIT_IS_PENDING = AcquireResult::INIT_IS_PENDING; - -static constexpr uint8_t UNSET = 0; -static constexpr uint8_t COMPLETE_BIT = (1 << 0); -static constexpr uint8_t PENDING_BIT = (1 << 1); -static constexpr uint8_t WAITING_BIT = (1 << 2); - -template <class Derived> -struct GuardObject { - GuardObject() = delete; - GuardObject(GuardObject const&) = delete; - GuardObject& operator=(GuardObject const&) = delete; - - explicit GuardObject(uint32_t* g) - : base_address(g), guard_byte_address(reinterpret_cast<uint8_t*>(g)), + +//===----------------------------------------------------------------------===// +// GuardBase +//===----------------------------------------------------------------------===// + +enum class AcquireResult { + INIT_IS_DONE, + INIT_IS_PENDING, +}; +constexpr AcquireResult INIT_IS_DONE = AcquireResult::INIT_IS_DONE; +constexpr AcquireResult INIT_IS_PENDING = AcquireResult::INIT_IS_PENDING; + +static constexpr uint8_t UNSET = 0; +static constexpr uint8_t COMPLETE_BIT = (1 << 0); +static constexpr uint8_t PENDING_BIT = (1 << 1); +static constexpr uint8_t WAITING_BIT = (1 << 2); + +template <class Derived> +struct GuardObject { + GuardObject() = delete; + GuardObject(GuardObject const&) = delete; + GuardObject& operator=(GuardObject const&) = delete; + + explicit GuardObject(uint32_t* g) + : base_address(g), guard_byte_address(reinterpret_cast<uint8_t*>(g)), init_byte_address(reinterpret_cast<uint8_t*>(g) + 1), thread_id_address(nullptr) {} - - explicit GuardObject(uint64_t* g) - : base_address(g), guard_byte_address(reinterpret_cast<uint8_t*>(g)), + + explicit GuardObject(uint64_t* g) + : base_address(g), guard_byte_address(reinterpret_cast<uint8_t*>(g)), init_byte_address(reinterpret_cast<uint8_t*>(g) + 1), thread_id_address(reinterpret_cast<uint32_t*>(g) + 1) {} - -public: - /// Implements __cxa_guard_acquire - AcquireResult cxa_guard_acquire() { - AtomicInt<uint8_t> guard_byte(guard_byte_address); - if (guard_byte.load(std::_AO_Acquire) != UNSET) - return INIT_IS_DONE; - return derived()->acquire_init_byte(); - } - - /// Implements __cxa_guard_release - void cxa_guard_release() { - AtomicInt<uint8_t> guard_byte(guard_byte_address); - // Store complete first, so that when release wakes other folks, they see - // it as having been completed. - guard_byte.store(COMPLETE_BIT, std::_AO_Release); - derived()->release_init_byte(); - } - - /// Implements __cxa_guard_abort - void cxa_guard_abort() { derived()->abort_init_byte(); } - -public: - /// base_address - the address of the original guard object. - void* const base_address; - /// The address of the guard byte at offset 0. - uint8_t* const guard_byte_address; - /// The address of the byte used by the implementation during initialization. - uint8_t* const init_byte_address; - /// An optional address storing an identifier for the thread performing initialization. - /// It's used to detect recursive initialization. - uint32_t* const thread_id_address; - -private: - Derived* derived() { return static_cast<Derived*>(this); } -}; - -//===----------------------------------------------------------------------===// -// Single Threaded Implementation -//===----------------------------------------------------------------------===// - -struct InitByteNoThreads : GuardObject<InitByteNoThreads> { - using GuardObject::GuardObject; - - AcquireResult acquire_init_byte() { - if (*init_byte_address == COMPLETE_BIT) - return INIT_IS_DONE; - if (*init_byte_address & PENDING_BIT) - ABORT_WITH_MESSAGE("__cxa_guard_acquire detected recursive initialization"); - *init_byte_address = PENDING_BIT; - return INIT_IS_PENDING; - } - - void release_init_byte() { *init_byte_address = COMPLETE_BIT; } - void abort_init_byte() { *init_byte_address = UNSET; } -}; - -//===----------------------------------------------------------------------===// -// Global Mutex Implementation -//===----------------------------------------------------------------------===// - -struct LibcppMutex; -struct LibcppCondVar; - -#ifndef _LIBCXXABI_HAS_NO_THREADS -struct LibcppMutex { - LibcppMutex() = default; - LibcppMutex(LibcppMutex const&) = delete; - LibcppMutex& operator=(LibcppMutex const&) = delete; - - bool lock() { return std::__libcpp_mutex_lock(&mutex); } - bool unlock() { return std::__libcpp_mutex_unlock(&mutex); } - -private: - friend struct LibcppCondVar; - std::__libcpp_mutex_t mutex = _LIBCPP_MUTEX_INITIALIZER; -}; - -struct LibcppCondVar { - LibcppCondVar() = default; - LibcppCondVar(LibcppCondVar const&) = delete; - LibcppCondVar& operator=(LibcppCondVar const&) = delete; - + +public: + /// Implements __cxa_guard_acquire + AcquireResult cxa_guard_acquire() { + AtomicInt<uint8_t> guard_byte(guard_byte_address); + if (guard_byte.load(std::_AO_Acquire) != UNSET) + return INIT_IS_DONE; + return derived()->acquire_init_byte(); + } + + /// Implements __cxa_guard_release + void cxa_guard_release() { + AtomicInt<uint8_t> guard_byte(guard_byte_address); + // Store complete first, so that when release wakes other folks, they see + // it as having been completed. + guard_byte.store(COMPLETE_BIT, std::_AO_Release); + derived()->release_init_byte(); + } + + /// Implements __cxa_guard_abort + void cxa_guard_abort() { derived()->abort_init_byte(); } + +public: + /// base_address - the address of the original guard object. + void* const base_address; + /// The address of the guard byte at offset 0. + uint8_t* const guard_byte_address; + /// The address of the byte used by the implementation during initialization. + uint8_t* const init_byte_address; + /// An optional address storing an identifier for the thread performing initialization. + /// It's used to detect recursive initialization. + uint32_t* const thread_id_address; + +private: + Derived* derived() { return static_cast<Derived*>(this); } +}; + +//===----------------------------------------------------------------------===// +// Single Threaded Implementation +//===----------------------------------------------------------------------===// + +struct InitByteNoThreads : GuardObject<InitByteNoThreads> { + using GuardObject::GuardObject; + + AcquireResult acquire_init_byte() { + if (*init_byte_address == COMPLETE_BIT) + return INIT_IS_DONE; + if (*init_byte_address & PENDING_BIT) + ABORT_WITH_MESSAGE("__cxa_guard_acquire detected recursive initialization"); + *init_byte_address = PENDING_BIT; + return INIT_IS_PENDING; + } + + void release_init_byte() { *init_byte_address = COMPLETE_BIT; } + void abort_init_byte() { *init_byte_address = UNSET; } +}; + +//===----------------------------------------------------------------------===// +// Global Mutex Implementation +//===----------------------------------------------------------------------===// + +struct LibcppMutex; +struct LibcppCondVar; + +#ifndef _LIBCXXABI_HAS_NO_THREADS +struct LibcppMutex { + LibcppMutex() = default; + LibcppMutex(LibcppMutex const&) = delete; + LibcppMutex& operator=(LibcppMutex const&) = delete; + + bool lock() { return std::__libcpp_mutex_lock(&mutex); } + bool unlock() { return std::__libcpp_mutex_unlock(&mutex); } + +private: + friend struct LibcppCondVar; + std::__libcpp_mutex_t mutex = _LIBCPP_MUTEX_INITIALIZER; +}; + +struct LibcppCondVar { + LibcppCondVar() = default; + LibcppCondVar(LibcppCondVar const&) = delete; + LibcppCondVar& operator=(LibcppCondVar const&) = delete; + bool wait(LibcppMutex& mut) { return std::__libcpp_condvar_wait(&cond, &mut.mutex); } - bool broadcast() { return std::__libcpp_condvar_broadcast(&cond); } - -private: - std::__libcpp_condvar_t cond = _LIBCPP_CONDVAR_INITIALIZER; -}; -#else -struct LibcppMutex {}; -struct LibcppCondVar {}; -#endif // !defined(_LIBCXXABI_HAS_NO_THREADS) - -template <class Mutex, class CondVar, Mutex& global_mutex, CondVar& global_cond, - uint32_t (*GetThreadID)() = PlatformThreadID> + bool broadcast() { return std::__libcpp_condvar_broadcast(&cond); } + +private: + std::__libcpp_condvar_t cond = _LIBCPP_CONDVAR_INITIALIZER; +}; +#else +struct LibcppMutex {}; +struct LibcppCondVar {}; +#endif // !defined(_LIBCXXABI_HAS_NO_THREADS) + +template <class Mutex, class CondVar, Mutex& global_mutex, CondVar& global_cond, + uint32_t (*GetThreadID)() = PlatformThreadID> struct InitByteGlobalMutex : GuardObject<InitByteGlobalMutex<Mutex, CondVar, global_mutex, global_cond, GetThreadID>> { - - using BaseT = typename InitByteGlobalMutex::GuardObject; - using BaseT::BaseT; - + + using BaseT = typename InitByteGlobalMutex::GuardObject; + using BaseT::BaseT; + explicit InitByteGlobalMutex(uint32_t* g) : BaseT(g), has_thread_id_support(false) {} explicit InitByteGlobalMutex(uint64_t* g) : BaseT(g), has_thread_id_support(PlatformSupportsThreadID()) {} - -public: - AcquireResult acquire_init_byte() { - LockGuard g("__cxa_guard_acquire"); - // Check for possible recursive initialization. - if (has_thread_id_support && (*init_byte_address & PENDING_BIT)) { - if (*thread_id_address == current_thread_id.get()) + +public: + AcquireResult acquire_init_byte() { + LockGuard g("__cxa_guard_acquire"); + // Check for possible recursive initialization. + if (has_thread_id_support && (*init_byte_address & PENDING_BIT)) { + if (*thread_id_address == current_thread_id.get()) ABORT_WITH_MESSAGE("__cxa_guard_acquire detected recursive initialization"); - } - - // Wait until the pending bit is not set. - while (*init_byte_address & PENDING_BIT) { - *init_byte_address |= WAITING_BIT; - global_cond.wait(global_mutex); - } - - if (*init_byte_address == COMPLETE_BIT) - return INIT_IS_DONE; - - if (has_thread_id_support) - *thread_id_address = current_thread_id.get(); - - *init_byte_address = PENDING_BIT; - return INIT_IS_PENDING; - } - - void release_init_byte() { - bool has_waiting; - { - LockGuard g("__cxa_guard_release"); - has_waiting = *init_byte_address & WAITING_BIT; - *init_byte_address = COMPLETE_BIT; - } - if (has_waiting) { - if (global_cond.broadcast()) { - ABORT_WITH_MESSAGE("%s failed to broadcast", "__cxa_guard_release"); - } - } - } - - void abort_init_byte() { - bool has_waiting; - { - LockGuard g("__cxa_guard_abort"); - if (has_thread_id_support) - *thread_id_address = 0; - has_waiting = *init_byte_address & WAITING_BIT; - *init_byte_address = UNSET; - } - if (has_waiting) { - if (global_cond.broadcast()) { - ABORT_WITH_MESSAGE("%s failed to broadcast", "__cxa_guard_abort"); - } - } - } - -private: - using BaseT::init_byte_address; - using BaseT::thread_id_address; - const bool has_thread_id_support; - LazyValue<uint32_t, GetThreadID> current_thread_id; - -private: - struct LockGuard { - LockGuard() = delete; - LockGuard(LockGuard const&) = delete; - LockGuard& operator=(LockGuard const&) = delete; - + } + + // Wait until the pending bit is not set. + while (*init_byte_address & PENDING_BIT) { + *init_byte_address |= WAITING_BIT; + global_cond.wait(global_mutex); + } + + if (*init_byte_address == COMPLETE_BIT) + return INIT_IS_DONE; + + if (has_thread_id_support) + *thread_id_address = current_thread_id.get(); + + *init_byte_address = PENDING_BIT; + return INIT_IS_PENDING; + } + + void release_init_byte() { + bool has_waiting; + { + LockGuard g("__cxa_guard_release"); + has_waiting = *init_byte_address & WAITING_BIT; + *init_byte_address = COMPLETE_BIT; + } + if (has_waiting) { + if (global_cond.broadcast()) { + ABORT_WITH_MESSAGE("%s failed to broadcast", "__cxa_guard_release"); + } + } + } + + void abort_init_byte() { + bool has_waiting; + { + LockGuard g("__cxa_guard_abort"); + if (has_thread_id_support) + *thread_id_address = 0; + has_waiting = *init_byte_address & WAITING_BIT; + *init_byte_address = UNSET; + } + if (has_waiting) { + if (global_cond.broadcast()) { + ABORT_WITH_MESSAGE("%s failed to broadcast", "__cxa_guard_abort"); + } + } + } + +private: + using BaseT::init_byte_address; + using BaseT::thread_id_address; + const bool has_thread_id_support; + LazyValue<uint32_t, GetThreadID> current_thread_id; + +private: + struct LockGuard { + LockGuard() = delete; + LockGuard(LockGuard const&) = delete; + LockGuard& operator=(LockGuard const&) = delete; + explicit LockGuard(const char* calling_func) : calling_func_(calling_func) { - if (global_mutex.lock()) - ABORT_WITH_MESSAGE("%s failed to acquire mutex", calling_func_); - } - - ~LockGuard() { - if (global_mutex.unlock()) - ABORT_WITH_MESSAGE("%s failed to release mutex", calling_func_); - } - - private: - const char* const calling_func_; - }; -}; - -//===----------------------------------------------------------------------===// -// Futex Implementation -//===----------------------------------------------------------------------===// - -#if defined(SYS_futex) -void PlatformFutexWait(int* addr, int expect) { - constexpr int WAIT = 0; - syscall(SYS_futex, addr, WAIT, expect, 0); - __tsan_acquire(addr); -} -void PlatformFutexWake(int* addr) { - constexpr int WAKE = 1; - __tsan_release(addr); - syscall(SYS_futex, addr, WAKE, INT_MAX); -} -#else -constexpr void (*PlatformFutexWait)(int*, int) = nullptr; -constexpr void (*PlatformFutexWake)(int*) = nullptr; -#endif - + if (global_mutex.lock()) + ABORT_WITH_MESSAGE("%s failed to acquire mutex", calling_func_); + } + + ~LockGuard() { + if (global_mutex.unlock()) + ABORT_WITH_MESSAGE("%s failed to release mutex", calling_func_); + } + + private: + const char* const calling_func_; + }; +}; + +//===----------------------------------------------------------------------===// +// Futex Implementation +//===----------------------------------------------------------------------===// + +#if defined(SYS_futex) +void PlatformFutexWait(int* addr, int expect) { + constexpr int WAIT = 0; + syscall(SYS_futex, addr, WAIT, expect, 0); + __tsan_acquire(addr); +} +void PlatformFutexWake(int* addr) { + constexpr int WAKE = 1; + __tsan_release(addr); + syscall(SYS_futex, addr, WAKE, INT_MAX); +} +#else +constexpr void (*PlatformFutexWait)(int*, int) = nullptr; +constexpr void (*PlatformFutexWake)(int*) = nullptr; +#endif + constexpr bool PlatformSupportsFutex() { return +PlatformFutexWait != nullptr; } - -/// InitByteFutex - Manages initialization using atomics and the futex syscall -/// for waiting and waking. + +/// InitByteFutex - Manages initialization using atomics and the futex syscall +/// for waiting and waking. template <void (*Wait)(int*, int) = PlatformFutexWait, void (*Wake)(int*) = PlatformFutexWake, - uint32_t (*GetThreadIDArg)() = PlatformThreadID> -struct InitByteFutex : GuardObject<InitByteFutex<Wait, Wake, GetThreadIDArg>> { - using BaseT = typename InitByteFutex::GuardObject; - - /// ARM Constructor + uint32_t (*GetThreadIDArg)() = PlatformThreadID> +struct InitByteFutex : GuardObject<InitByteFutex<Wait, Wake, GetThreadIDArg>> { + using BaseT = typename InitByteFutex::GuardObject; + + /// ARM Constructor explicit InitByteFutex(uint32_t* g) : BaseT(g), init_byte(this->init_byte_address), has_thread_id_support(this->thread_id_address && GetThreadIDArg), thread_id(this->thread_id_address) {} - - /// Itanium Constructor + + /// Itanium Constructor explicit InitByteFutex(uint64_t* g) : BaseT(g), init_byte(this->init_byte_address), has_thread_id_support(this->thread_id_address && GetThreadIDArg), thread_id(this->thread_id_address) {} - -public: - AcquireResult acquire_init_byte() { - while (true) { - uint8_t last_val = UNSET; + +public: + AcquireResult acquire_init_byte() { + while (true) { + uint8_t last_val = UNSET; if (init_byte.compare_exchange(&last_val, PENDING_BIT, std::_AO_Acq_Rel, std::_AO_Acquire)) { - if (has_thread_id_support) { - thread_id.store(current_thread_id.get(), std::_AO_Relaxed); - } - return INIT_IS_PENDING; - } - - if (last_val == COMPLETE_BIT) - return INIT_IS_DONE; - - if (last_val & PENDING_BIT) { - - // Check for recursive initialization - if (has_thread_id_support && thread_id.load(std::_AO_Relaxed) == current_thread_id.get()) { + if (has_thread_id_support) { + thread_id.store(current_thread_id.get(), std::_AO_Relaxed); + } + return INIT_IS_PENDING; + } + + if (last_val == COMPLETE_BIT) + return INIT_IS_DONE; + + if (last_val & PENDING_BIT) { + + // Check for recursive initialization + if (has_thread_id_support && thread_id.load(std::_AO_Relaxed) == current_thread_id.get()) { ABORT_WITH_MESSAGE("__cxa_guard_acquire detected recursive initialization"); - } - - if ((last_val & WAITING_BIT) == 0) { - // This compare exchange can fail for several reasons - // (1) another thread finished the whole thing before we got here - // (2) another thread set the waiting bit we were trying to thread - // (3) another thread had an exception and failed to finish + } + + if ((last_val & WAITING_BIT) == 0) { + // This compare exchange can fail for several reasons + // (1) another thread finished the whole thing before we got here + // (2) another thread set the waiting bit we were trying to thread + // (3) another thread had an exception and failed to finish if (!init_byte.compare_exchange(&last_val, PENDING_BIT | WAITING_BIT, std::_AO_Acq_Rel, std::_AO_Release)) { - // (1) success, via someone else's work! - if (last_val == COMPLETE_BIT) - return INIT_IS_DONE; - - // (3) someone else, bailed on doing the work, retry from the start! - if (last_val == UNSET) - continue; - - // (2) the waiting bit got set, so we are happy to keep waiting - } - } - wait_on_initialization(); - } - } - } - - void release_init_byte() { - uint8_t old = init_byte.exchange(COMPLETE_BIT, std::_AO_Acq_Rel); - if (old & WAITING_BIT) - wake_all(); - } - - void abort_init_byte() { - if (has_thread_id_support) - thread_id.store(0, std::_AO_Relaxed); - + // (1) success, via someone else's work! + if (last_val == COMPLETE_BIT) + return INIT_IS_DONE; + + // (3) someone else, bailed on doing the work, retry from the start! + if (last_val == UNSET) + continue; + + // (2) the waiting bit got set, so we are happy to keep waiting + } + } + wait_on_initialization(); + } + } + } + + void release_init_byte() { + uint8_t old = init_byte.exchange(COMPLETE_BIT, std::_AO_Acq_Rel); + if (old & WAITING_BIT) + wake_all(); + } + + void abort_init_byte() { + if (has_thread_id_support) + thread_id.store(0, std::_AO_Relaxed); + uint8_t old = init_byte.exchange(UNSET, std::_AO_Acq_Rel); - if (old & WAITING_BIT) - wake_all(); - } - -private: - /// Use the futex to wait on the current guard variable. Futex expects a - /// 32-bit 4-byte aligned address as the first argument, so we have to use use - /// the base address of the guard variable (not the init byte). - void wait_on_initialization() { + if (old & WAITING_BIT) + wake_all(); + } + +private: + /// Use the futex to wait on the current guard variable. Futex expects a + /// 32-bit 4-byte aligned address as the first argument, so we have to use use + /// the base address of the guard variable (not the init byte). + void wait_on_initialization() { Wait(static_cast<int*>(this->base_address), expected_value_for_futex(PENDING_BIT | WAITING_BIT)); - } - void wake_all() { Wake(static_cast<int*>(this->base_address)); } - -private: - AtomicInt<uint8_t> init_byte; - - const bool has_thread_id_support; - // Unsafe to use unless has_thread_id_support - AtomicInt<uint32_t> thread_id; - LazyValue<uint32_t, GetThreadIDArg> current_thread_id; - - /// Create the expected integer value for futex `wait(int* addr, int expected)`. - /// We pass the base address as the first argument, So this function creates - /// an zero-initialized integer with `b` copied at the correct offset. - static int expected_value_for_futex(uint8_t b) { - int dest_val = 0; - std::memcpy(reinterpret_cast<char*>(&dest_val) + 1, &b, 1); - return dest_val; - } - - static_assert(Wait != nullptr && Wake != nullptr, ""); -}; - -//===----------------------------------------------------------------------===// -// -//===----------------------------------------------------------------------===// - -template <class T> -struct GlobalStatic { - static T instance; -}; -template <class T> -_LIBCPP_SAFE_STATIC T GlobalStatic<T>::instance = {}; - + } + void wake_all() { Wake(static_cast<int*>(this->base_address)); } + +private: + AtomicInt<uint8_t> init_byte; + + const bool has_thread_id_support; + // Unsafe to use unless has_thread_id_support + AtomicInt<uint32_t> thread_id; + LazyValue<uint32_t, GetThreadIDArg> current_thread_id; + + /// Create the expected integer value for futex `wait(int* addr, int expected)`. + /// We pass the base address as the first argument, So this function creates + /// an zero-initialized integer with `b` copied at the correct offset. + static int expected_value_for_futex(uint8_t b) { + int dest_val = 0; + std::memcpy(reinterpret_cast<char*>(&dest_val) + 1, &b, 1); + return dest_val; + } + + static_assert(Wait != nullptr && Wake != nullptr, ""); +}; + +//===----------------------------------------------------------------------===// +// +//===----------------------------------------------------------------------===// + +template <class T> +struct GlobalStatic { + static T instance; +}; +template <class T> +_LIBCPP_SAFE_STATIC T GlobalStatic<T>::instance = {}; + enum class Implementation { NoThreads, GlobalLock, Futex }; - -template <Implementation Impl> -struct SelectImplementation; - -template <> -struct SelectImplementation<Implementation::NoThreads> { - using type = InitByteNoThreads; -}; - -template <> -struct SelectImplementation<Implementation::GlobalLock> { + +template <Implementation Impl> +struct SelectImplementation; + +template <> +struct SelectImplementation<Implementation::NoThreads> { + using type = InitByteNoThreads; +}; + +template <> +struct SelectImplementation<Implementation::GlobalLock> { using type = InitByteGlobalMutex<LibcppMutex, LibcppCondVar, GlobalStatic<LibcppMutex>::instance, GlobalStatic<LibcppCondVar>::instance, PlatformThreadID>; -}; - -template <> -struct SelectImplementation<Implementation::Futex> { +}; + +template <> +struct SelectImplementation<Implementation::Futex> { using type = InitByteFutex<PlatformFutexWait, PlatformFutexWake, PlatformThreadID>; -}; - -// TODO(EricWF): We should prefer the futex implementation when available. But -// it should be done in a separate step from adding the implementation. -constexpr Implementation CurrentImplementation = -#if defined(_LIBCXXABI_HAS_NO_THREADS) - Implementation::NoThreads; -#elif defined(_LIBCXXABI_USE_FUTEX) - Implementation::Futex; -#else +}; + +// TODO(EricWF): We should prefer the futex implementation when available. But +// it should be done in a separate step from adding the implementation. +constexpr Implementation CurrentImplementation = +#if defined(_LIBCXXABI_HAS_NO_THREADS) + Implementation::NoThreads; +#elif defined(_LIBCXXABI_USE_FUTEX) + Implementation::Futex; +#else Implementation::GlobalLock; -#endif - +#endif + static_assert(CurrentImplementation != Implementation::Futex || PlatformSupportsFutex(), "Futex selected but not supported"); - + using SelectedImplementation = SelectImplementation<CurrentImplementation>::type; - -} // end namespace -} // end namespace __cxxabiv1 - -#if defined(__clang__) + +} // end namespace +} // end namespace __cxxabiv1 + +#if defined(__clang__) # pragma clang diagnostic pop -#elif defined(__GNUC__) +#elif defined(__GNUC__) # pragma GCC diagnostic pop -#endif - -#endif // LIBCXXABI_SRC_INCLUDE_CXA_GUARD_IMPL_H +#endif + +#endif // LIBCXXABI_SRC_INCLUDE_CXA_GUARD_IMPL_H diff --git a/contrib/libs/cxxsupp/libcxxabi/src/cxa_handlers.cpp b/contrib/libs/cxxsupp/libcxxabi/src/cxa_handlers.cpp index 344250dde0..2ee473dea3 100644 --- a/contrib/libs/cxxsupp/libcxxabi/src/cxa_handlers.cpp +++ b/contrib/libs/cxxsupp/libcxxabi/src/cxa_handlers.cpp @@ -1,101 +1,101 @@ //===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// -// This file implements the functionality associated with the terminate_handler, +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// +// This file implements the functionality associated with the terminate_handler, // unexpected_handler, and new_handler. -//===----------------------------------------------------------------------===// - -#include <stdexcept> -#include <new> -#include <exception> -#include "abort_message.h" -#include "cxxabi.h" -#include "cxa_handlers.h" -#include "cxa_exception.h" -#include "private_typeinfo.h" +//===----------------------------------------------------------------------===// + +#include <stdexcept> +#include <new> +#include <exception> +#include "abort_message.h" +#include "cxxabi.h" +#include "cxa_handlers.h" +#include "cxa_exception.h" +#include "private_typeinfo.h" #include "include/atomic_support.h" // from libc++ - -namespace std -{ - -unexpected_handler + +namespace std +{ + +unexpected_handler get_unexpected() noexcept -{ - return __libcpp_atomic_load(&__cxa_unexpected_handler, _AO_Acquire); -} - -void -__unexpected(unexpected_handler func) -{ - func(); - // unexpected handler should not return - abort_message("unexpected_handler unexpectedly returned"); -} - -__attribute__((noreturn)) -void -unexpected() -{ - __unexpected(get_unexpected()); -} - -terminate_handler +{ + return __libcpp_atomic_load(&__cxa_unexpected_handler, _AO_Acquire); +} + +void +__unexpected(unexpected_handler func) +{ + func(); + // unexpected handler should not return + abort_message("unexpected_handler unexpectedly returned"); +} + +__attribute__((noreturn)) +void +unexpected() +{ + __unexpected(get_unexpected()); +} + +terminate_handler get_terminate() noexcept -{ - return __libcpp_atomic_load(&__cxa_terminate_handler, _AO_Acquire); -} - -void +{ + return __libcpp_atomic_load(&__cxa_terminate_handler, _AO_Acquire); +} + +void __terminate(terminate_handler func) noexcept -{ -#ifndef _LIBCXXABI_NO_EXCEPTIONS - try - { +{ +#ifndef _LIBCXXABI_NO_EXCEPTIONS + try + { #endif // _LIBCXXABI_NO_EXCEPTIONS - func(); - // handler should not return - abort_message("terminate_handler unexpectedly returned"); -#ifndef _LIBCXXABI_NO_EXCEPTIONS - } - catch (...) - { - // handler should not throw exception - abort_message("terminate_handler unexpectedly threw an exception"); - } + func(); + // handler should not return + abort_message("terminate_handler unexpectedly returned"); +#ifndef _LIBCXXABI_NO_EXCEPTIONS + } + catch (...) + { + // handler should not throw exception + abort_message("terminate_handler unexpectedly threw an exception"); + } #endif // _LIBCXXABI_NO_EXCEPTIONS -} - -__attribute__((noreturn)) -void +} + +__attribute__((noreturn)) +void terminate() noexcept -{ -#ifndef _LIBCXXABI_NO_EXCEPTIONS - // If there might be an uncaught exception - using namespace __cxxabiv1; - __cxa_eh_globals* globals = __cxa_get_globals_fast(); - if (globals) - { - __cxa_exception* exception_header = globals->caughtExceptions; - if (exception_header) - { - _Unwind_Exception* unwind_exception = - reinterpret_cast<_Unwind_Exception*>(exception_header + 1) - 1; - if (__isOurExceptionClass(unwind_exception)) - __terminate(exception_header->terminateHandler); - } - } -#endif - __terminate(get_terminate()); -} - -new_handler +{ +#ifndef _LIBCXXABI_NO_EXCEPTIONS + // If there might be an uncaught exception + using namespace __cxxabiv1; + __cxa_eh_globals* globals = __cxa_get_globals_fast(); + if (globals) + { + __cxa_exception* exception_header = globals->caughtExceptions; + if (exception_header) + { + _Unwind_Exception* unwind_exception = + reinterpret_cast<_Unwind_Exception*>(exception_header + 1) - 1; + if (__isOurExceptionClass(unwind_exception)) + __terminate(exception_header->terminateHandler); + } + } +#endif + __terminate(get_terminate()); +} + +new_handler get_new_handler() noexcept -{ - return __libcpp_atomic_load(&__cxa_new_handler, _AO_Acquire); -} - -} // std +{ + return __libcpp_atomic_load(&__cxa_new_handler, _AO_Acquire); +} + +} // std diff --git a/contrib/libs/cxxsupp/libcxxabi/src/cxa_handlers.h b/contrib/libs/cxxsupp/libcxxabi/src/cxa_handlers.h index 3d8dc6b2de..075432657a 100644 --- a/contrib/libs/cxxsupp/libcxxabi/src/cxa_handlers.h +++ b/contrib/libs/cxxsupp/libcxxabi/src/cxa_handlers.h @@ -1,55 +1,55 @@ //===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// -// This file implements the functionality associated with the terminate_handler, -// unexpected_handler, and new_handler. -//===----------------------------------------------------------------------===// - -#ifndef _CXA_HANDLERS_H -#define _CXA_HANDLERS_H - -#include "__cxxabi_config.h" - -#include <exception> - -namespace std -{ - -_LIBCXXABI_HIDDEN _LIBCXXABI_NORETURN -void -__unexpected(unexpected_handler func); - -_LIBCXXABI_HIDDEN _LIBCXXABI_NORETURN -void +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// +// This file implements the functionality associated with the terminate_handler, +// unexpected_handler, and new_handler. +//===----------------------------------------------------------------------===// + +#ifndef _CXA_HANDLERS_H +#define _CXA_HANDLERS_H + +#include "__cxxabi_config.h" + +#include <exception> + +namespace std +{ + +_LIBCXXABI_HIDDEN _LIBCXXABI_NORETURN +void +__unexpected(unexpected_handler func); + +_LIBCXXABI_HIDDEN _LIBCXXABI_NORETURN +void __terminate(terminate_handler func) noexcept; - -} // std - -extern "C" -{ - -_LIBCXXABI_DATA_VIS extern void (*__cxa_terminate_handler)(); -_LIBCXXABI_DATA_VIS extern void (*__cxa_unexpected_handler)(); -_LIBCXXABI_DATA_VIS extern void (*__cxa_new_handler)(); - -/* - - At some point in the future these three symbols will become - C++11 atomic variables: - - extern std::atomic<std::terminate_handler> __cxa_terminate_handler; - extern std::atomic<std::unexpected_handler> __cxa_unexpected_handler; - extern std::atomic<std::new_handler> __cxa_new_handler; - - This change will not impact their ABI. But it will allow for a - portable performance optimization. - -*/ - -} // extern "C" - + +} // std + +extern "C" +{ + +_LIBCXXABI_DATA_VIS extern void (*__cxa_terminate_handler)(); +_LIBCXXABI_DATA_VIS extern void (*__cxa_unexpected_handler)(); +_LIBCXXABI_DATA_VIS extern void (*__cxa_new_handler)(); + +/* + + At some point in the future these three symbols will become + C++11 atomic variables: + + extern std::atomic<std::terminate_handler> __cxa_terminate_handler; + extern std::atomic<std::unexpected_handler> __cxa_unexpected_handler; + extern std::atomic<std::new_handler> __cxa_new_handler; + + This change will not impact their ABI. But it will allow for a + portable performance optimization. + +*/ + +} // extern "C" + #endif // _CXA_HANDLERS_H diff --git a/contrib/libs/cxxsupp/libcxxabi/src/cxa_personality.cpp b/contrib/libs/cxxsupp/libcxxabi/src/cxa_personality.cpp index f6e135f137..024d8a4991 100644 --- a/contrib/libs/cxxsupp/libcxxabi/src/cxa_personality.cpp +++ b/contrib/libs/cxxsupp/libcxxabi/src/cxa_personality.cpp @@ -1,936 +1,936 @@ //===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// -// This file implements the "Exception Handling APIs" -// https://itanium-cxx-abi.github.io/cxx-abi/abi-eh.html -// http://www.intel.com/design/itanium/downloads/245358.htm -// -//===----------------------------------------------------------------------===// - -#include <assert.h> -#include <stdlib.h> -#include <string.h> -#include <typeinfo> - -#include "__cxxabi_config.h" -#include "cxa_exception.h" -#include "cxa_handlers.h" -#include "private_typeinfo.h" -#include "unwind.h" - -#if defined(__SEH__) && !defined(__USING_SJLJ_EXCEPTIONS__) -#include <windows.h> -#include <winnt.h> - -extern "C" EXCEPTION_DISPOSITION _GCC_specific_handler(PEXCEPTION_RECORD, - void *, PCONTEXT, - PDISPATCHER_CONTEXT, - _Unwind_Personality_Fn); -#endif - -/* - Exception Header Layout: - -+---------------------------+-----------------------------+---------------+ -| __cxa_exception | _Unwind_Exception CLNGC++\0 | thrown object | -+---------------------------+-----------------------------+---------------+ - ^ - | - +-------------------------------------------------------+ - | -+---------------------------+-----------------------------+ -| __cxa_dependent_exception | _Unwind_Exception CLNGC++\1 | -+---------------------------+-----------------------------+ - - Exception Handling Table Layout: - -+-----------------+--------+ -| lpStartEncoding | (char) | -+---------+-------+--------+---------------+-----------------------+ -| lpStart | (encoded with lpStartEncoding) | defaults to funcStart | -+---------+-----+--------+-----------------+---------------+-------+ -| ttypeEncoding | (char) | Encoding of the type_info table | -+---------------+-+------+----+----------------------------+----------------+ -| classInfoOffset | (ULEB128) | Offset to type_info table, defaults to null | -+-----------------++--------+-+----------------------------+----------------+ -| callSiteEncoding | (char) | Encoding for Call Site Table | -+------------------+--+-----+-----+------------------------+--------------------------+ -| callSiteTableLength | (ULEB128) | Call Site Table length, used to find Action table | -+---------------------+-----------+---------------------------------------------------+ -#ifndef __USING_SJLJ_EXCEPTIONS__ -+---------------------+-----------+------------------------------------------------+ -| Beginning of Call Site Table The current ip lies within the | -| ... (start, length) range of one of these | -| call sites. There may be action needed. | -| +-------------+---------------------------------+------------------------------+ | -| | start | (encoded with callSiteEncoding) | offset relative to funcStart | | -| | length | (encoded with callSiteEncoding) | length of code fragment | | -| | landingPad | (encoded with callSiteEncoding) | offset relative to lpStart | | -| | actionEntry | (ULEB128) | Action Table Index 1-based | | -| | | | actionEntry == 0 -> cleanup | | -| +-------------+---------------------------------+------------------------------+ | -| ... | -+----------------------------------------------------------------------------------+ -#else // __USING_SJLJ_EXCEPTIONS__ -+---------------------+-----------+------------------------------------------------+ -| Beginning of Call Site Table The current ip is a 1-based index into | -| ... this table. Or it is -1 meaning no | -| action is needed. Or it is 0 meaning | -| terminate. | -| +-------------+---------------------------------+------------------------------+ | -| | landingPad | (ULEB128) | offset relative to lpStart | | -| | actionEntry | (ULEB128) | Action Table Index 1-based | | -| | | | actionEntry == 0 -> cleanup | | -| +-------------+---------------------------------+------------------------------+ | -| ... | -+----------------------------------------------------------------------------------+ +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// +// This file implements the "Exception Handling APIs" +// https://itanium-cxx-abi.github.io/cxx-abi/abi-eh.html +// http://www.intel.com/design/itanium/downloads/245358.htm +// +//===----------------------------------------------------------------------===// + +#include <assert.h> +#include <stdlib.h> +#include <string.h> +#include <typeinfo> + +#include "__cxxabi_config.h" +#include "cxa_exception.h" +#include "cxa_handlers.h" +#include "private_typeinfo.h" +#include "unwind.h" + +#if defined(__SEH__) && !defined(__USING_SJLJ_EXCEPTIONS__) +#include <windows.h> +#include <winnt.h> + +extern "C" EXCEPTION_DISPOSITION _GCC_specific_handler(PEXCEPTION_RECORD, + void *, PCONTEXT, + PDISPATCHER_CONTEXT, + _Unwind_Personality_Fn); +#endif + +/* + Exception Header Layout: + ++---------------------------+-----------------------------+---------------+ +| __cxa_exception | _Unwind_Exception CLNGC++\0 | thrown object | ++---------------------------+-----------------------------+---------------+ + ^ + | + +-------------------------------------------------------+ + | ++---------------------------+-----------------------------+ +| __cxa_dependent_exception | _Unwind_Exception CLNGC++\1 | ++---------------------------+-----------------------------+ + + Exception Handling Table Layout: + ++-----------------+--------+ +| lpStartEncoding | (char) | ++---------+-------+--------+---------------+-----------------------+ +| lpStart | (encoded with lpStartEncoding) | defaults to funcStart | ++---------+-----+--------+-----------------+---------------+-------+ +| ttypeEncoding | (char) | Encoding of the type_info table | ++---------------+-+------+----+----------------------------+----------------+ +| classInfoOffset | (ULEB128) | Offset to type_info table, defaults to null | ++-----------------++--------+-+----------------------------+----------------+ +| callSiteEncoding | (char) | Encoding for Call Site Table | ++------------------+--+-----+-----+------------------------+--------------------------+ +| callSiteTableLength | (ULEB128) | Call Site Table length, used to find Action table | ++---------------------+-----------+---------------------------------------------------+ +#ifndef __USING_SJLJ_EXCEPTIONS__ ++---------------------+-----------+------------------------------------------------+ +| Beginning of Call Site Table The current ip lies within the | +| ... (start, length) range of one of these | +| call sites. There may be action needed. | +| +-------------+---------------------------------+------------------------------+ | +| | start | (encoded with callSiteEncoding) | offset relative to funcStart | | +| | length | (encoded with callSiteEncoding) | length of code fragment | | +| | landingPad | (encoded with callSiteEncoding) | offset relative to lpStart | | +| | actionEntry | (ULEB128) | Action Table Index 1-based | | +| | | | actionEntry == 0 -> cleanup | | +| +-------------+---------------------------------+------------------------------+ | +| ... | ++----------------------------------------------------------------------------------+ +#else // __USING_SJLJ_EXCEPTIONS__ ++---------------------+-----------+------------------------------------------------+ +| Beginning of Call Site Table The current ip is a 1-based index into | +| ... this table. Or it is -1 meaning no | +| action is needed. Or it is 0 meaning | +| terminate. | +| +-------------+---------------------------------+------------------------------+ | +| | landingPad | (ULEB128) | offset relative to lpStart | | +| | actionEntry | (ULEB128) | Action Table Index 1-based | | +| | | | actionEntry == 0 -> cleanup | | +| +-------------+---------------------------------+------------------------------+ | +| ... | ++----------------------------------------------------------------------------------+ #endif // __USING_SJLJ_EXCEPTIONS__ -+---------------------------------------------------------------------+ -| Beginning of Action Table ttypeIndex == 0 : cleanup | -| ... ttypeIndex > 0 : catch | -| ttypeIndex < 0 : exception spec | -| +--------------+-----------+--------------------------------------+ | -| | ttypeIndex | (SLEB128) | Index into type_info Table (1-based) | | -| | actionOffset | (SLEB128) | Offset into next Action Table entry | | -| +--------------+-----------+--------------------------------------+ | -| ... | -+---------------------------------------------------------------------+-----------------+ -| type_info Table, but classInfoOffset does *not* point here! | -| +----------------+------------------------------------------------+-----------------+ | -| | Nth type_info* | Encoded with ttypeEncoding, 0 means catch(...) | ttypeIndex == N | | -| +----------------+------------------------------------------------+-----------------+ | -| ... | -| +----------------+------------------------------------------------+-----------------+ | -| | 1st type_info* | Encoded with ttypeEncoding, 0 means catch(...) | ttypeIndex == 1 | | -| +----------------+------------------------------------------------+-----------------+ | -| +---------------------------------------+-----------+------------------------------+ | -| | 1st ttypeIndex for 1st exception spec | (ULEB128) | classInfoOffset points here! | | -| | ... | (ULEB128) | | | -| | Mth ttypeIndex for 1st exception spec | (ULEB128) | | | -| | 0 | (ULEB128) | | | -| +---------------------------------------+------------------------------------------+ | -| ... | -| +---------------------------------------+------------------------------------------+ | -| | 0 | (ULEB128) | throw() | | -| +---------------------------------------+------------------------------------------+ | -| ... | -| +---------------------------------------+------------------------------------------+ | -| | 1st ttypeIndex for Nth exception spec | (ULEB128) | | | -| | ... | (ULEB128) | | | -| | Mth ttypeIndex for Nth exception spec | (ULEB128) | | | -| | 0 | (ULEB128) | | | -| +---------------------------------------+------------------------------------------+ | -+---------------------------------------------------------------------------------------+ - -Notes: - -* ttypeIndex in the Action Table, and in the exception spec table, is an index, - not a byte count, if positive. It is a negative index offset of - classInfoOffset and the sizeof entry depends on ttypeEncoding. - But if ttypeIndex is negative, it is a positive 1-based byte offset into the - type_info Table. - And if ttypeIndex is zero, it refers to a catch (...). - -* landingPad can be 0, this implies there is nothing to be done. - -* landingPad != 0 and actionEntry == 0 implies a cleanup needs to be done - @landingPad. - -* A cleanup can also be found under landingPad != 0 and actionEntry != 0 in - the Action Table with ttypeIndex == 0. -*/ - -namespace __cxxabiv1 -{ - -namespace -{ - -template <class AsType> -uintptr_t readPointerHelper(const uint8_t*& p) { - AsType value; - memcpy(&value, p, sizeof(AsType)); - p += sizeof(AsType); - return static_cast<uintptr_t>(value); -} - -} // end namespace - -extern "C" -{ - -// private API - -// Heavily borrowed from llvm/examples/ExceptionDemo/ExceptionDemo.cpp - -// DWARF Constants -enum -{ - DW_EH_PE_absptr = 0x00, - DW_EH_PE_uleb128 = 0x01, - DW_EH_PE_udata2 = 0x02, - DW_EH_PE_udata4 = 0x03, - DW_EH_PE_udata8 = 0x04, - DW_EH_PE_sleb128 = 0x09, - DW_EH_PE_sdata2 = 0x0A, - DW_EH_PE_sdata4 = 0x0B, - DW_EH_PE_sdata8 = 0x0C, - DW_EH_PE_pcrel = 0x10, - DW_EH_PE_textrel = 0x20, - DW_EH_PE_datarel = 0x30, - DW_EH_PE_funcrel = 0x40, - DW_EH_PE_aligned = 0x50, - DW_EH_PE_indirect = 0x80, - DW_EH_PE_omit = 0xFF -}; - -/// Read a uleb128 encoded value and advance pointer -/// See Variable Length Data Appendix C in: -/// @link http://dwarfstd.org/Dwarf4.pdf @unlink -/// @param data reference variable holding memory pointer to decode from -/// @returns decoded value -static -uintptr_t -readULEB128(const uint8_t** data) -{ - uintptr_t result = 0; - uintptr_t shift = 0; - unsigned char byte; - const uint8_t *p = *data; - do - { - byte = *p++; - result |= static_cast<uintptr_t>(byte & 0x7F) << shift; - shift += 7; - } while (byte & 0x80); - *data = p; - return result; -} - -/// Read a sleb128 encoded value and advance pointer -/// See Variable Length Data Appendix C in: -/// @link http://dwarfstd.org/Dwarf4.pdf @unlink -/// @param data reference variable holding memory pointer to decode from -/// @returns decoded value -static -intptr_t -readSLEB128(const uint8_t** data) -{ - uintptr_t result = 0; - uintptr_t shift = 0; - unsigned char byte; - const uint8_t *p = *data; - do - { - byte = *p++; - result |= static_cast<uintptr_t>(byte & 0x7F) << shift; - shift += 7; - } while (byte & 0x80); - *data = p; - if ((byte & 0x40) && (shift < (sizeof(result) << 3))) - result |= static_cast<uintptr_t>(~0) << shift; - return static_cast<intptr_t>(result); -} - -/// Read a pointer encoded value and advance pointer -/// See Variable Length Data in: -/// @link http://dwarfstd.org/Dwarf3.pdf @unlink -/// @param data reference variable holding memory pointer to decode from -/// @param encoding dwarf encoding type ++---------------------------------------------------------------------+ +| Beginning of Action Table ttypeIndex == 0 : cleanup | +| ... ttypeIndex > 0 : catch | +| ttypeIndex < 0 : exception spec | +| +--------------+-----------+--------------------------------------+ | +| | ttypeIndex | (SLEB128) | Index into type_info Table (1-based) | | +| | actionOffset | (SLEB128) | Offset into next Action Table entry | | +| +--------------+-----------+--------------------------------------+ | +| ... | ++---------------------------------------------------------------------+-----------------+ +| type_info Table, but classInfoOffset does *not* point here! | +| +----------------+------------------------------------------------+-----------------+ | +| | Nth type_info* | Encoded with ttypeEncoding, 0 means catch(...) | ttypeIndex == N | | +| +----------------+------------------------------------------------+-----------------+ | +| ... | +| +----------------+------------------------------------------------+-----------------+ | +| | 1st type_info* | Encoded with ttypeEncoding, 0 means catch(...) | ttypeIndex == 1 | | +| +----------------+------------------------------------------------+-----------------+ | +| +---------------------------------------+-----------+------------------------------+ | +| | 1st ttypeIndex for 1st exception spec | (ULEB128) | classInfoOffset points here! | | +| | ... | (ULEB128) | | | +| | Mth ttypeIndex for 1st exception spec | (ULEB128) | | | +| | 0 | (ULEB128) | | | +| +---------------------------------------+------------------------------------------+ | +| ... | +| +---------------------------------------+------------------------------------------+ | +| | 0 | (ULEB128) | throw() | | +| +---------------------------------------+------------------------------------------+ | +| ... | +| +---------------------------------------+------------------------------------------+ | +| | 1st ttypeIndex for Nth exception spec | (ULEB128) | | | +| | ... | (ULEB128) | | | +| | Mth ttypeIndex for Nth exception spec | (ULEB128) | | | +| | 0 | (ULEB128) | | | +| +---------------------------------------+------------------------------------------+ | ++---------------------------------------------------------------------------------------+ + +Notes: + +* ttypeIndex in the Action Table, and in the exception spec table, is an index, + not a byte count, if positive. It is a negative index offset of + classInfoOffset and the sizeof entry depends on ttypeEncoding. + But if ttypeIndex is negative, it is a positive 1-based byte offset into the + type_info Table. + And if ttypeIndex is zero, it refers to a catch (...). + +* landingPad can be 0, this implies there is nothing to be done. + +* landingPad != 0 and actionEntry == 0 implies a cleanup needs to be done + @landingPad. + +* A cleanup can also be found under landingPad != 0 and actionEntry != 0 in + the Action Table with ttypeIndex == 0. +*/ + +namespace __cxxabiv1 +{ + +namespace +{ + +template <class AsType> +uintptr_t readPointerHelper(const uint8_t*& p) { + AsType value; + memcpy(&value, p, sizeof(AsType)); + p += sizeof(AsType); + return static_cast<uintptr_t>(value); +} + +} // end namespace + +extern "C" +{ + +// private API + +// Heavily borrowed from llvm/examples/ExceptionDemo/ExceptionDemo.cpp + +// DWARF Constants +enum +{ + DW_EH_PE_absptr = 0x00, + DW_EH_PE_uleb128 = 0x01, + DW_EH_PE_udata2 = 0x02, + DW_EH_PE_udata4 = 0x03, + DW_EH_PE_udata8 = 0x04, + DW_EH_PE_sleb128 = 0x09, + DW_EH_PE_sdata2 = 0x0A, + DW_EH_PE_sdata4 = 0x0B, + DW_EH_PE_sdata8 = 0x0C, + DW_EH_PE_pcrel = 0x10, + DW_EH_PE_textrel = 0x20, + DW_EH_PE_datarel = 0x30, + DW_EH_PE_funcrel = 0x40, + DW_EH_PE_aligned = 0x50, + DW_EH_PE_indirect = 0x80, + DW_EH_PE_omit = 0xFF +}; + +/// Read a uleb128 encoded value and advance pointer +/// See Variable Length Data Appendix C in: +/// @link http://dwarfstd.org/Dwarf4.pdf @unlink +/// @param data reference variable holding memory pointer to decode from +/// @returns decoded value +static +uintptr_t +readULEB128(const uint8_t** data) +{ + uintptr_t result = 0; + uintptr_t shift = 0; + unsigned char byte; + const uint8_t *p = *data; + do + { + byte = *p++; + result |= static_cast<uintptr_t>(byte & 0x7F) << shift; + shift += 7; + } while (byte & 0x80); + *data = p; + return result; +} + +/// Read a sleb128 encoded value and advance pointer +/// See Variable Length Data Appendix C in: +/// @link http://dwarfstd.org/Dwarf4.pdf @unlink +/// @param data reference variable holding memory pointer to decode from +/// @returns decoded value +static +intptr_t +readSLEB128(const uint8_t** data) +{ + uintptr_t result = 0; + uintptr_t shift = 0; + unsigned char byte; + const uint8_t *p = *data; + do + { + byte = *p++; + result |= static_cast<uintptr_t>(byte & 0x7F) << shift; + shift += 7; + } while (byte & 0x80); + *data = p; + if ((byte & 0x40) && (shift < (sizeof(result) << 3))) + result |= static_cast<uintptr_t>(~0) << shift; + return static_cast<intptr_t>(result); +} + +/// Read a pointer encoded value and advance pointer +/// See Variable Length Data in: +/// @link http://dwarfstd.org/Dwarf3.pdf @unlink +/// @param data reference variable holding memory pointer to decode from +/// @param encoding dwarf encoding type /// @param base for adding relative offset, default to 0 -/// @returns decoded value -static -uintptr_t +/// @returns decoded value +static +uintptr_t readEncodedPointer(const uint8_t** data, uint8_t encoding, uintptr_t base = 0) -{ - uintptr_t result = 0; - if (encoding == DW_EH_PE_omit) - return result; - const uint8_t* p = *data; - // first get value - switch (encoding & 0x0F) - { - case DW_EH_PE_absptr: - result = readPointerHelper<uintptr_t>(p); - break; - case DW_EH_PE_uleb128: - result = readULEB128(&p); - break; - case DW_EH_PE_sleb128: - result = static_cast<uintptr_t>(readSLEB128(&p)); - break; - case DW_EH_PE_udata2: - result = readPointerHelper<uint16_t>(p); - break; - case DW_EH_PE_udata4: - result = readPointerHelper<uint32_t>(p); - break; - case DW_EH_PE_udata8: - result = readPointerHelper<uint64_t>(p); - break; - case DW_EH_PE_sdata2: - result = readPointerHelper<int16_t>(p); - break; - case DW_EH_PE_sdata4: - result = readPointerHelper<int32_t>(p); - break; - case DW_EH_PE_sdata8: - result = readPointerHelper<int64_t>(p); - break; - default: - // not supported - abort(); - break; - } - // then add relative offset - switch (encoding & 0x70) - { - case DW_EH_PE_absptr: - // do nothing - break; - case DW_EH_PE_pcrel: - if (result) - result += (uintptr_t)(*data); - break; +{ + uintptr_t result = 0; + if (encoding == DW_EH_PE_omit) + return result; + const uint8_t* p = *data; + // first get value + switch (encoding & 0x0F) + { + case DW_EH_PE_absptr: + result = readPointerHelper<uintptr_t>(p); + break; + case DW_EH_PE_uleb128: + result = readULEB128(&p); + break; + case DW_EH_PE_sleb128: + result = static_cast<uintptr_t>(readSLEB128(&p)); + break; + case DW_EH_PE_udata2: + result = readPointerHelper<uint16_t>(p); + break; + case DW_EH_PE_udata4: + result = readPointerHelper<uint32_t>(p); + break; + case DW_EH_PE_udata8: + result = readPointerHelper<uint64_t>(p); + break; + case DW_EH_PE_sdata2: + result = readPointerHelper<int16_t>(p); + break; + case DW_EH_PE_sdata4: + result = readPointerHelper<int32_t>(p); + break; + case DW_EH_PE_sdata8: + result = readPointerHelper<int64_t>(p); + break; + default: + // not supported + abort(); + break; + } + // then add relative offset + switch (encoding & 0x70) + { + case DW_EH_PE_absptr: + // do nothing + break; + case DW_EH_PE_pcrel: + if (result) + result += (uintptr_t)(*data); + break; case DW_EH_PE_datarel: assert((base != 0) && "DW_EH_PE_datarel is invalid with a base of 0"); if (result) result += base; break; - case DW_EH_PE_textrel: - case DW_EH_PE_funcrel: - case DW_EH_PE_aligned: - default: - // not supported - abort(); - break; - } - // then apply indirection - if (result && (encoding & DW_EH_PE_indirect)) - result = *((uintptr_t*)result); - *data = p; - return result; -} - -static -void -call_terminate(bool native_exception, _Unwind_Exception* unwind_exception) -{ - __cxa_begin_catch(unwind_exception); - if (native_exception) - { - // Use the stored terminate_handler if possible - __cxa_exception* exception_header = (__cxa_exception*)(unwind_exception+1) - 1; - std::__terminate(exception_header->terminateHandler); - } - std::terminate(); -} - -#if defined(_LIBCXXABI_ARM_EHABI) -static const void* read_target2_value(const void* ptr) -{ - uintptr_t offset = *reinterpret_cast<const uintptr_t*>(ptr); - if (!offset) - return 0; - // "ARM EABI provides a TARGET2 relocation to describe these typeinfo - // pointers. The reason being it allows their precise semantics to be - // deferred to the linker. For bare-metal they turn into absolute - // relocations. For linux they turn into GOT-REL relocations." - // https://gcc.gnu.org/ml/gcc-patches/2009-08/msg00264.html -#if defined(LIBCXXABI_BAREMETAL) - return reinterpret_cast<const void*>(reinterpret_cast<uintptr_t>(ptr) + - offset); -#else - return *reinterpret_cast<const void **>(reinterpret_cast<uintptr_t>(ptr) + - offset); -#endif -} - -static const __shim_type_info* -get_shim_type_info(uint64_t ttypeIndex, const uint8_t* classInfo, - uint8_t ttypeEncoding, bool native_exception, + case DW_EH_PE_textrel: + case DW_EH_PE_funcrel: + case DW_EH_PE_aligned: + default: + // not supported + abort(); + break; + } + // then apply indirection + if (result && (encoding & DW_EH_PE_indirect)) + result = *((uintptr_t*)result); + *data = p; + return result; +} + +static +void +call_terminate(bool native_exception, _Unwind_Exception* unwind_exception) +{ + __cxa_begin_catch(unwind_exception); + if (native_exception) + { + // Use the stored terminate_handler if possible + __cxa_exception* exception_header = (__cxa_exception*)(unwind_exception+1) - 1; + std::__terminate(exception_header->terminateHandler); + } + std::terminate(); +} + +#if defined(_LIBCXXABI_ARM_EHABI) +static const void* read_target2_value(const void* ptr) +{ + uintptr_t offset = *reinterpret_cast<const uintptr_t*>(ptr); + if (!offset) + return 0; + // "ARM EABI provides a TARGET2 relocation to describe these typeinfo + // pointers. The reason being it allows their precise semantics to be + // deferred to the linker. For bare-metal they turn into absolute + // relocations. For linux they turn into GOT-REL relocations." + // https://gcc.gnu.org/ml/gcc-patches/2009-08/msg00264.html +#if defined(LIBCXXABI_BAREMETAL) + return reinterpret_cast<const void*>(reinterpret_cast<uintptr_t>(ptr) + + offset); +#else + return *reinterpret_cast<const void **>(reinterpret_cast<uintptr_t>(ptr) + + offset); +#endif +} + +static const __shim_type_info* +get_shim_type_info(uint64_t ttypeIndex, const uint8_t* classInfo, + uint8_t ttypeEncoding, bool native_exception, _Unwind_Exception* unwind_exception, uintptr_t /*base*/ = 0) -{ - if (classInfo == 0) - { - // this should not happen. Indicates corrupted eh_table. - call_terminate(native_exception, unwind_exception); - } - - assert(((ttypeEncoding == DW_EH_PE_absptr) || // LLVM or GCC 4.6 - (ttypeEncoding == DW_EH_PE_pcrel) || // GCC 4.7 baremetal - (ttypeEncoding == (DW_EH_PE_pcrel | DW_EH_PE_indirect))) && // GCC 4.7 linux - "Unexpected TTypeEncoding"); - (void)ttypeEncoding; - - const uint8_t* ttypePtr = classInfo - ttypeIndex * sizeof(uintptr_t); - return reinterpret_cast<const __shim_type_info *>( - read_target2_value(ttypePtr)); -} -#else // !defined(_LIBCXXABI_ARM_EHABI) -static -const __shim_type_info* -get_shim_type_info(uint64_t ttypeIndex, const uint8_t* classInfo, - uint8_t ttypeEncoding, bool native_exception, +{ + if (classInfo == 0) + { + // this should not happen. Indicates corrupted eh_table. + call_terminate(native_exception, unwind_exception); + } + + assert(((ttypeEncoding == DW_EH_PE_absptr) || // LLVM or GCC 4.6 + (ttypeEncoding == DW_EH_PE_pcrel) || // GCC 4.7 baremetal + (ttypeEncoding == (DW_EH_PE_pcrel | DW_EH_PE_indirect))) && // GCC 4.7 linux + "Unexpected TTypeEncoding"); + (void)ttypeEncoding; + + const uint8_t* ttypePtr = classInfo - ttypeIndex * sizeof(uintptr_t); + return reinterpret_cast<const __shim_type_info *>( + read_target2_value(ttypePtr)); +} +#else // !defined(_LIBCXXABI_ARM_EHABI) +static +const __shim_type_info* +get_shim_type_info(uint64_t ttypeIndex, const uint8_t* classInfo, + uint8_t ttypeEncoding, bool native_exception, _Unwind_Exception* unwind_exception, uintptr_t base = 0) -{ - if (classInfo == 0) - { - // this should not happen. Indicates corrupted eh_table. - call_terminate(native_exception, unwind_exception); - } - switch (ttypeEncoding & 0x0F) - { - case DW_EH_PE_absptr: - ttypeIndex *= sizeof(void*); - break; - case DW_EH_PE_udata2: - case DW_EH_PE_sdata2: - ttypeIndex *= 2; - break; - case DW_EH_PE_udata4: - case DW_EH_PE_sdata4: - ttypeIndex *= 4; - break; - case DW_EH_PE_udata8: - case DW_EH_PE_sdata8: - ttypeIndex *= 8; - break; - default: - // this should not happen. Indicates corrupted eh_table. - call_terminate(native_exception, unwind_exception); - } - classInfo -= ttypeIndex; +{ + if (classInfo == 0) + { + // this should not happen. Indicates corrupted eh_table. + call_terminate(native_exception, unwind_exception); + } + switch (ttypeEncoding & 0x0F) + { + case DW_EH_PE_absptr: + ttypeIndex *= sizeof(void*); + break; + case DW_EH_PE_udata2: + case DW_EH_PE_sdata2: + ttypeIndex *= 2; + break; + case DW_EH_PE_udata4: + case DW_EH_PE_sdata4: + ttypeIndex *= 4; + break; + case DW_EH_PE_udata8: + case DW_EH_PE_sdata8: + ttypeIndex *= 8; + break; + default: + // this should not happen. Indicates corrupted eh_table. + call_terminate(native_exception, unwind_exception); + } + classInfo -= ttypeIndex; return (const __shim_type_info*)readEncodedPointer(&classInfo, ttypeEncoding, base); -} -#endif // !defined(_LIBCXXABI_ARM_EHABI) - -/* - This is checking a thrown exception type, excpType, against a possibly empty - list of catchType's which make up an exception spec. - - An exception spec acts like a catch handler, but in reverse. This "catch - handler" will catch an excpType if and only if none of the catchType's in - the list will catch a excpType. If any catchType in the list can catch an - excpType, then this exception spec does not catch the excpType. -*/ -#if defined(_LIBCXXABI_ARM_EHABI) -static -bool -exception_spec_can_catch(int64_t specIndex, const uint8_t* classInfo, - uint8_t ttypeEncoding, const __shim_type_info* excpType, +} +#endif // !defined(_LIBCXXABI_ARM_EHABI) + +/* + This is checking a thrown exception type, excpType, against a possibly empty + list of catchType's which make up an exception spec. + + An exception spec acts like a catch handler, but in reverse. This "catch + handler" will catch an excpType if and only if none of the catchType's in + the list will catch a excpType. If any catchType in the list can catch an + excpType, then this exception spec does not catch the excpType. +*/ +#if defined(_LIBCXXABI_ARM_EHABI) +static +bool +exception_spec_can_catch(int64_t specIndex, const uint8_t* classInfo, + uint8_t ttypeEncoding, const __shim_type_info* excpType, void* adjustedPtr, _Unwind_Exception* unwind_exception, uintptr_t /*base*/ = 0) -{ - if (classInfo == 0) - { - // this should not happen. Indicates corrupted eh_table. - call_terminate(false, unwind_exception); - } - - assert(((ttypeEncoding == DW_EH_PE_absptr) || // LLVM or GCC 4.6 - (ttypeEncoding == DW_EH_PE_pcrel) || // GCC 4.7 baremetal - (ttypeEncoding == (DW_EH_PE_pcrel | DW_EH_PE_indirect))) && // GCC 4.7 linux - "Unexpected TTypeEncoding"); - (void)ttypeEncoding; - - // specIndex is negative of 1-based byte offset into classInfo; - specIndex = -specIndex; - --specIndex; - const void** temp = reinterpret_cast<const void**>( - reinterpret_cast<uintptr_t>(classInfo) + - static_cast<uintptr_t>(specIndex) * sizeof(uintptr_t)); - // If any type in the spec list can catch excpType, return false, else return true - // adjustments to adjustedPtr are ignored. - while (true) - { - // ARM EHABI exception specification table (filter table) consists of - // several pointers which will directly point to the type info object - // (instead of ttypeIndex). The table will be terminated with 0. - const void** ttypePtr = temp++; - if (*ttypePtr == 0) - break; - // We can get the __shim_type_info simply by performing a - // R_ARM_TARGET2 relocation, and cast the result to __shim_type_info. - const __shim_type_info* catchType = - static_cast<const __shim_type_info*>(read_target2_value(ttypePtr)); - void* tempPtr = adjustedPtr; - if (catchType->can_catch(excpType, tempPtr)) - return false; - } - return true; -} -#else -static -bool -exception_spec_can_catch(int64_t specIndex, const uint8_t* classInfo, - uint8_t ttypeEncoding, const __shim_type_info* excpType, +{ + if (classInfo == 0) + { + // this should not happen. Indicates corrupted eh_table. + call_terminate(false, unwind_exception); + } + + assert(((ttypeEncoding == DW_EH_PE_absptr) || // LLVM or GCC 4.6 + (ttypeEncoding == DW_EH_PE_pcrel) || // GCC 4.7 baremetal + (ttypeEncoding == (DW_EH_PE_pcrel | DW_EH_PE_indirect))) && // GCC 4.7 linux + "Unexpected TTypeEncoding"); + (void)ttypeEncoding; + + // specIndex is negative of 1-based byte offset into classInfo; + specIndex = -specIndex; + --specIndex; + const void** temp = reinterpret_cast<const void**>( + reinterpret_cast<uintptr_t>(classInfo) + + static_cast<uintptr_t>(specIndex) * sizeof(uintptr_t)); + // If any type in the spec list can catch excpType, return false, else return true + // adjustments to adjustedPtr are ignored. + while (true) + { + // ARM EHABI exception specification table (filter table) consists of + // several pointers which will directly point to the type info object + // (instead of ttypeIndex). The table will be terminated with 0. + const void** ttypePtr = temp++; + if (*ttypePtr == 0) + break; + // We can get the __shim_type_info simply by performing a + // R_ARM_TARGET2 relocation, and cast the result to __shim_type_info. + const __shim_type_info* catchType = + static_cast<const __shim_type_info*>(read_target2_value(ttypePtr)); + void* tempPtr = adjustedPtr; + if (catchType->can_catch(excpType, tempPtr)) + return false; + } + return true; +} +#else +static +bool +exception_spec_can_catch(int64_t specIndex, const uint8_t* classInfo, + uint8_t ttypeEncoding, const __shim_type_info* excpType, void* adjustedPtr, _Unwind_Exception* unwind_exception, uintptr_t base = 0) -{ - if (classInfo == 0) - { - // this should not happen. Indicates corrupted eh_table. - call_terminate(false, unwind_exception); - } - // specIndex is negative of 1-based byte offset into classInfo; - specIndex = -specIndex; - --specIndex; - const uint8_t* temp = classInfo + specIndex; - // If any type in the spec list can catch excpType, return false, else return true - // adjustments to adjustedPtr are ignored. - while (true) - { - uint64_t ttypeIndex = readULEB128(&temp); - if (ttypeIndex == 0) - break; - const __shim_type_info* catchType = get_shim_type_info(ttypeIndex, - classInfo, - ttypeEncoding, - true, +{ + if (classInfo == 0) + { + // this should not happen. Indicates corrupted eh_table. + call_terminate(false, unwind_exception); + } + // specIndex is negative of 1-based byte offset into classInfo; + specIndex = -specIndex; + --specIndex; + const uint8_t* temp = classInfo + specIndex; + // If any type in the spec list can catch excpType, return false, else return true + // adjustments to adjustedPtr are ignored. + while (true) + { + uint64_t ttypeIndex = readULEB128(&temp); + if (ttypeIndex == 0) + break; + const __shim_type_info* catchType = get_shim_type_info(ttypeIndex, + classInfo, + ttypeEncoding, + true, unwind_exception, base); - void* tempPtr = adjustedPtr; - if (catchType->can_catch(excpType, tempPtr)) - return false; - } - return true; -} -#endif - -static -void* -get_thrown_object_ptr(_Unwind_Exception* unwind_exception) -{ - // Even for foreign exceptions, the exception object is *probably* at unwind_exception + 1 - // Regardless, this library is prohibited from touching a foreign exception - void* adjustedPtr = unwind_exception + 1; - if (__getExceptionClass(unwind_exception) == kOurDependentExceptionClass) - adjustedPtr = ((__cxa_dependent_exception*)adjustedPtr - 1)->primaryException; - return adjustedPtr; -} - -namespace -{ - -struct scan_results -{ - int64_t ttypeIndex; // > 0 catch handler, < 0 exception spec handler, == 0 a cleanup - const uint8_t* actionRecord; // Currently unused. Retained to ease future maintenance. - const uint8_t* languageSpecificData; // Needed only for __cxa_call_unexpected - uintptr_t landingPad; // null -> nothing found, else something found - void* adjustedPtr; // Used in cxa_exception.cpp - _Unwind_Reason_Code reason; // One of _URC_FATAL_PHASE1_ERROR, - // _URC_FATAL_PHASE2_ERROR, - // _URC_CONTINUE_UNWIND, - // _URC_HANDLER_FOUND -}; - -} // unnamed namespace - -static -void -set_registers(_Unwind_Exception* unwind_exception, _Unwind_Context* context, - const scan_results& results) -{ -#if defined(__USING_SJLJ_EXCEPTIONS__) -#define __builtin_eh_return_data_regno(regno) regno + void* tempPtr = adjustedPtr; + if (catchType->can_catch(excpType, tempPtr)) + return false; + } + return true; +} +#endif + +static +void* +get_thrown_object_ptr(_Unwind_Exception* unwind_exception) +{ + // Even for foreign exceptions, the exception object is *probably* at unwind_exception + 1 + // Regardless, this library is prohibited from touching a foreign exception + void* adjustedPtr = unwind_exception + 1; + if (__getExceptionClass(unwind_exception) == kOurDependentExceptionClass) + adjustedPtr = ((__cxa_dependent_exception*)adjustedPtr - 1)->primaryException; + return adjustedPtr; +} + +namespace +{ + +struct scan_results +{ + int64_t ttypeIndex; // > 0 catch handler, < 0 exception spec handler, == 0 a cleanup + const uint8_t* actionRecord; // Currently unused. Retained to ease future maintenance. + const uint8_t* languageSpecificData; // Needed only for __cxa_call_unexpected + uintptr_t landingPad; // null -> nothing found, else something found + void* adjustedPtr; // Used in cxa_exception.cpp + _Unwind_Reason_Code reason; // One of _URC_FATAL_PHASE1_ERROR, + // _URC_FATAL_PHASE2_ERROR, + // _URC_CONTINUE_UNWIND, + // _URC_HANDLER_FOUND +}; + +} // unnamed namespace + +static +void +set_registers(_Unwind_Exception* unwind_exception, _Unwind_Context* context, + const scan_results& results) +{ +#if defined(__USING_SJLJ_EXCEPTIONS__) +#define __builtin_eh_return_data_regno(regno) regno #elif defined(__ibmxl__) // IBM xlclang++ compiler does not support __builtin_eh_return_data_regno. #define __builtin_eh_return_data_regno(regno) regno + 3 -#endif - _Unwind_SetGR(context, __builtin_eh_return_data_regno(0), - reinterpret_cast<uintptr_t>(unwind_exception)); - _Unwind_SetGR(context, __builtin_eh_return_data_regno(1), - static_cast<uintptr_t>(results.ttypeIndex)); - _Unwind_SetIP(context, results.landingPad); -} - -/* - There are 3 types of scans needed: - - 1. Scan for handler with native or foreign exception. If handler found, - save state and return _URC_HANDLER_FOUND, else return _URC_CONTINUE_UNWIND. - May also report an error on invalid input. - May terminate for invalid exception table. - _UA_SEARCH_PHASE - - 2. Scan for handler with foreign exception. Must return _URC_HANDLER_FOUND, - or call terminate. - _UA_CLEANUP_PHASE && _UA_HANDLER_FRAME && !native_exception - - 3. Scan for cleanups. If a handler is found and this isn't forced unwind, - then terminate, otherwise ignore the handler and keep looking for cleanup. - If a cleanup is found, return _URC_HANDLER_FOUND, else return _URC_CONTINUE_UNWIND. - May also report an error on invalid input. - May terminate for invalid exception table. - _UA_CLEANUP_PHASE && !_UA_HANDLER_FRAME -*/ - -static void scan_eh_tab(scan_results &results, _Unwind_Action actions, - bool native_exception, - _Unwind_Exception *unwind_exception, - _Unwind_Context *context) { - // Initialize results to found nothing but an error - results.ttypeIndex = 0; - results.actionRecord = 0; - results.languageSpecificData = 0; - results.landingPad = 0; - results.adjustedPtr = 0; - results.reason = _URC_FATAL_PHASE1_ERROR; - // Check for consistent actions - if (actions & _UA_SEARCH_PHASE) - { - // Do Phase 1 - if (actions & (_UA_CLEANUP_PHASE | _UA_HANDLER_FRAME | _UA_FORCE_UNWIND)) - { - // None of these flags should be set during Phase 1 - // Client error - results.reason = _URC_FATAL_PHASE1_ERROR; - return; - } - } - else if (actions & _UA_CLEANUP_PHASE) - { - if ((actions & _UA_HANDLER_FRAME) && (actions & _UA_FORCE_UNWIND)) - { - // _UA_HANDLER_FRAME should only be set if phase 1 found a handler. - // If _UA_FORCE_UNWIND is set, phase 1 shouldn't have happened. - // Client error - results.reason = _URC_FATAL_PHASE2_ERROR; - return; - } - } - else // Neither _UA_SEARCH_PHASE nor _UA_CLEANUP_PHASE is set - { - // One of these should be set. - // Client error - results.reason = _URC_FATAL_PHASE1_ERROR; - return; - } - // Start scan by getting exception table address - const uint8_t *lsda = (const uint8_t *)_Unwind_GetLanguageSpecificData(context); - if (lsda == 0) - { - // There is no exception table - results.reason = _URC_CONTINUE_UNWIND; - return; - } - results.languageSpecificData = lsda; +#endif + _Unwind_SetGR(context, __builtin_eh_return_data_regno(0), + reinterpret_cast<uintptr_t>(unwind_exception)); + _Unwind_SetGR(context, __builtin_eh_return_data_regno(1), + static_cast<uintptr_t>(results.ttypeIndex)); + _Unwind_SetIP(context, results.landingPad); +} + +/* + There are 3 types of scans needed: + + 1. Scan for handler with native or foreign exception. If handler found, + save state and return _URC_HANDLER_FOUND, else return _URC_CONTINUE_UNWIND. + May also report an error on invalid input. + May terminate for invalid exception table. + _UA_SEARCH_PHASE + + 2. Scan for handler with foreign exception. Must return _URC_HANDLER_FOUND, + or call terminate. + _UA_CLEANUP_PHASE && _UA_HANDLER_FRAME && !native_exception + + 3. Scan for cleanups. If a handler is found and this isn't forced unwind, + then terminate, otherwise ignore the handler and keep looking for cleanup. + If a cleanup is found, return _URC_HANDLER_FOUND, else return _URC_CONTINUE_UNWIND. + May also report an error on invalid input. + May terminate for invalid exception table. + _UA_CLEANUP_PHASE && !_UA_HANDLER_FRAME +*/ + +static void scan_eh_tab(scan_results &results, _Unwind_Action actions, + bool native_exception, + _Unwind_Exception *unwind_exception, + _Unwind_Context *context) { + // Initialize results to found nothing but an error + results.ttypeIndex = 0; + results.actionRecord = 0; + results.languageSpecificData = 0; + results.landingPad = 0; + results.adjustedPtr = 0; + results.reason = _URC_FATAL_PHASE1_ERROR; + // Check for consistent actions + if (actions & _UA_SEARCH_PHASE) + { + // Do Phase 1 + if (actions & (_UA_CLEANUP_PHASE | _UA_HANDLER_FRAME | _UA_FORCE_UNWIND)) + { + // None of these flags should be set during Phase 1 + // Client error + results.reason = _URC_FATAL_PHASE1_ERROR; + return; + } + } + else if (actions & _UA_CLEANUP_PHASE) + { + if ((actions & _UA_HANDLER_FRAME) && (actions & _UA_FORCE_UNWIND)) + { + // _UA_HANDLER_FRAME should only be set if phase 1 found a handler. + // If _UA_FORCE_UNWIND is set, phase 1 shouldn't have happened. + // Client error + results.reason = _URC_FATAL_PHASE2_ERROR; + return; + } + } + else // Neither _UA_SEARCH_PHASE nor _UA_CLEANUP_PHASE is set + { + // One of these should be set. + // Client error + results.reason = _URC_FATAL_PHASE1_ERROR; + return; + } + // Start scan by getting exception table address + const uint8_t *lsda = (const uint8_t *)_Unwind_GetLanguageSpecificData(context); + if (lsda == 0) + { + // There is no exception table + results.reason = _URC_CONTINUE_UNWIND; + return; + } + results.languageSpecificData = lsda; #if defined(_AIX) uintptr_t base = _Unwind_GetDataRelBase(context); #else uintptr_t base = 0; #endif - // Get the current instruction pointer and offset it before next - // instruction in the current frame which threw the exception. - uintptr_t ip = _Unwind_GetIP(context) - 1; - // Get beginning current frame's code (as defined by the - // emitted dwarf code) - uintptr_t funcStart = _Unwind_GetRegionStart(context); -#ifdef __USING_SJLJ_EXCEPTIONS__ - if (ip == uintptr_t(-1)) - { - // no action - results.reason = _URC_CONTINUE_UNWIND; - return; - } - else if (ip == 0) - call_terminate(native_exception, unwind_exception); - // ip is 1-based index into call site table -#else // !__USING_SJLJ_EXCEPTIONS__ - uintptr_t ipOffset = ip - funcStart; + // Get the current instruction pointer and offset it before next + // instruction in the current frame which threw the exception. + uintptr_t ip = _Unwind_GetIP(context) - 1; + // Get beginning current frame's code (as defined by the + // emitted dwarf code) + uintptr_t funcStart = _Unwind_GetRegionStart(context); +#ifdef __USING_SJLJ_EXCEPTIONS__ + if (ip == uintptr_t(-1)) + { + // no action + results.reason = _URC_CONTINUE_UNWIND; + return; + } + else if (ip == 0) + call_terminate(native_exception, unwind_exception); + // ip is 1-based index into call site table +#else // !__USING_SJLJ_EXCEPTIONS__ + uintptr_t ipOffset = ip - funcStart; #endif // !defined(_USING_SLJL_EXCEPTIONS__) - const uint8_t* classInfo = NULL; - // Note: See JITDwarfEmitter::EmitExceptionTable(...) for corresponding - // dwarf emission - // Parse LSDA header. - uint8_t lpStartEncoding = *lsda++; + const uint8_t* classInfo = NULL; + // Note: See JITDwarfEmitter::EmitExceptionTable(...) for corresponding + // dwarf emission + // Parse LSDA header. + uint8_t lpStartEncoding = *lsda++; const uint8_t* lpStart = (const uint8_t*)readEncodedPointer(&lsda, lpStartEncoding, base); - if (lpStart == 0) - lpStart = (const uint8_t*)funcStart; - uint8_t ttypeEncoding = *lsda++; - if (ttypeEncoding != DW_EH_PE_omit) - { - // Calculate type info locations in emitted dwarf code which - // were flagged by type info arguments to llvm.eh.selector - // intrinsic - uintptr_t classInfoOffset = readULEB128(&lsda); - classInfo = lsda + classInfoOffset; - } - // Walk call-site table looking for range that - // includes current PC. - uint8_t callSiteEncoding = *lsda++; -#ifdef __USING_SJLJ_EXCEPTIONS__ - (void)callSiteEncoding; // When using SjLj exceptions, callSiteEncoding is never used -#endif - uint32_t callSiteTableLength = static_cast<uint32_t>(readULEB128(&lsda)); - const uint8_t* callSiteTableStart = lsda; - const uint8_t* callSiteTableEnd = callSiteTableStart + callSiteTableLength; - const uint8_t* actionTableStart = callSiteTableEnd; - const uint8_t* callSitePtr = callSiteTableStart; - while (callSitePtr < callSiteTableEnd) - { - // There is one entry per call site. -#ifndef __USING_SJLJ_EXCEPTIONS__ - // The call sites are non-overlapping in [start, start+length) - // The call sites are ordered in increasing value of start - uintptr_t start = readEncodedPointer(&callSitePtr, callSiteEncoding); - uintptr_t length = readEncodedPointer(&callSitePtr, callSiteEncoding); - uintptr_t landingPad = readEncodedPointer(&callSitePtr, callSiteEncoding); - uintptr_t actionEntry = readULEB128(&callSitePtr); - if ((start <= ipOffset) && (ipOffset < (start + length))) -#else // __USING_SJLJ_EXCEPTIONS__ - // ip is 1-based index into this table - uintptr_t landingPad = readULEB128(&callSitePtr); - uintptr_t actionEntry = readULEB128(&callSitePtr); - if (--ip == 0) + if (lpStart == 0) + lpStart = (const uint8_t*)funcStart; + uint8_t ttypeEncoding = *lsda++; + if (ttypeEncoding != DW_EH_PE_omit) + { + // Calculate type info locations in emitted dwarf code which + // were flagged by type info arguments to llvm.eh.selector + // intrinsic + uintptr_t classInfoOffset = readULEB128(&lsda); + classInfo = lsda + classInfoOffset; + } + // Walk call-site table looking for range that + // includes current PC. + uint8_t callSiteEncoding = *lsda++; +#ifdef __USING_SJLJ_EXCEPTIONS__ + (void)callSiteEncoding; // When using SjLj exceptions, callSiteEncoding is never used +#endif + uint32_t callSiteTableLength = static_cast<uint32_t>(readULEB128(&lsda)); + const uint8_t* callSiteTableStart = lsda; + const uint8_t* callSiteTableEnd = callSiteTableStart + callSiteTableLength; + const uint8_t* actionTableStart = callSiteTableEnd; + const uint8_t* callSitePtr = callSiteTableStart; + while (callSitePtr < callSiteTableEnd) + { + // There is one entry per call site. +#ifndef __USING_SJLJ_EXCEPTIONS__ + // The call sites are non-overlapping in [start, start+length) + // The call sites are ordered in increasing value of start + uintptr_t start = readEncodedPointer(&callSitePtr, callSiteEncoding); + uintptr_t length = readEncodedPointer(&callSitePtr, callSiteEncoding); + uintptr_t landingPad = readEncodedPointer(&callSitePtr, callSiteEncoding); + uintptr_t actionEntry = readULEB128(&callSitePtr); + if ((start <= ipOffset) && (ipOffset < (start + length))) +#else // __USING_SJLJ_EXCEPTIONS__ + // ip is 1-based index into this table + uintptr_t landingPad = readULEB128(&callSitePtr); + uintptr_t actionEntry = readULEB128(&callSitePtr); + if (--ip == 0) #endif // __USING_SJLJ_EXCEPTIONS__ - { - // Found the call site containing ip. -#ifndef __USING_SJLJ_EXCEPTIONS__ - if (landingPad == 0) - { - // No handler here - results.reason = _URC_CONTINUE_UNWIND; - return; - } - landingPad = (uintptr_t)lpStart + landingPad; -#else // __USING_SJLJ_EXCEPTIONS__ - ++landingPad; + { + // Found the call site containing ip. +#ifndef __USING_SJLJ_EXCEPTIONS__ + if (landingPad == 0) + { + // No handler here + results.reason = _URC_CONTINUE_UNWIND; + return; + } + landingPad = (uintptr_t)lpStart + landingPad; +#else // __USING_SJLJ_EXCEPTIONS__ + ++landingPad; #endif // __USING_SJLJ_EXCEPTIONS__ results.landingPad = landingPad; - if (actionEntry == 0) - { - // Found a cleanup - results.reason = actions & _UA_SEARCH_PHASE - ? _URC_CONTINUE_UNWIND - : _URC_HANDLER_FOUND; - return; - } - // Convert 1-based byte offset into - const uint8_t* action = actionTableStart + (actionEntry - 1); - bool hasCleanup = false; - // Scan action entries until you find a matching handler, cleanup, or the end of action list - while (true) - { - const uint8_t* actionRecord = action; - int64_t ttypeIndex = readSLEB128(&action); - if (ttypeIndex > 0) - { - // Found a catch, does it actually catch? - // First check for catch (...) - const __shim_type_info* catchType = - get_shim_type_info(static_cast<uint64_t>(ttypeIndex), - classInfo, ttypeEncoding, + if (actionEntry == 0) + { + // Found a cleanup + results.reason = actions & _UA_SEARCH_PHASE + ? _URC_CONTINUE_UNWIND + : _URC_HANDLER_FOUND; + return; + } + // Convert 1-based byte offset into + const uint8_t* action = actionTableStart + (actionEntry - 1); + bool hasCleanup = false; + // Scan action entries until you find a matching handler, cleanup, or the end of action list + while (true) + { + const uint8_t* actionRecord = action; + int64_t ttypeIndex = readSLEB128(&action); + if (ttypeIndex > 0) + { + // Found a catch, does it actually catch? + // First check for catch (...) + const __shim_type_info* catchType = + get_shim_type_info(static_cast<uint64_t>(ttypeIndex), + classInfo, ttypeEncoding, native_exception, unwind_exception, base); - if (catchType == 0) - { - // Found catch (...) catches everything, including - // foreign exceptions. This is search phase, cleanup - // phase with foreign exception, or forced unwinding. - assert(actions & (_UA_SEARCH_PHASE | _UA_HANDLER_FRAME | - _UA_FORCE_UNWIND)); - results.ttypeIndex = ttypeIndex; - results.actionRecord = actionRecord; - results.adjustedPtr = - get_thrown_object_ptr(unwind_exception); - results.reason = _URC_HANDLER_FOUND; - return; - } - // Else this is a catch (T) clause and will never - // catch a foreign exception - else if (native_exception) - { - __cxa_exception* exception_header = (__cxa_exception*)(unwind_exception+1) - 1; - void* adjustedPtr = get_thrown_object_ptr(unwind_exception); - const __shim_type_info* excpType = - static_cast<const __shim_type_info*>(exception_header->exceptionType); - if (adjustedPtr == 0 || excpType == 0) - { - // Something very bad happened - call_terminate(native_exception, unwind_exception); - } - if (catchType->can_catch(excpType, adjustedPtr)) - { - // Found a matching handler. This is either search - // phase or forced unwinding. - assert(actions & - (_UA_SEARCH_PHASE | _UA_FORCE_UNWIND)); - results.ttypeIndex = ttypeIndex; - results.actionRecord = actionRecord; - results.adjustedPtr = adjustedPtr; - results.reason = _URC_HANDLER_FOUND; - return; - } - } - // Scan next action ... - } - else if (ttypeIndex < 0) - { - // Found an exception specification. - if (actions & _UA_FORCE_UNWIND) { - // Skip if forced unwinding. - } else if (native_exception) { - // Does the exception spec catch this native exception? - __cxa_exception* exception_header = (__cxa_exception*)(unwind_exception+1) - 1; - void* adjustedPtr = get_thrown_object_ptr(unwind_exception); - const __shim_type_info* excpType = - static_cast<const __shim_type_info*>(exception_header->exceptionType); - if (adjustedPtr == 0 || excpType == 0) - { - // Something very bad happened - call_terminate(native_exception, unwind_exception); - } - if (exception_spec_can_catch(ttypeIndex, classInfo, - ttypeEncoding, excpType, + if (catchType == 0) + { + // Found catch (...) catches everything, including + // foreign exceptions. This is search phase, cleanup + // phase with foreign exception, or forced unwinding. + assert(actions & (_UA_SEARCH_PHASE | _UA_HANDLER_FRAME | + _UA_FORCE_UNWIND)); + results.ttypeIndex = ttypeIndex; + results.actionRecord = actionRecord; + results.adjustedPtr = + get_thrown_object_ptr(unwind_exception); + results.reason = _URC_HANDLER_FOUND; + return; + } + // Else this is a catch (T) clause and will never + // catch a foreign exception + else if (native_exception) + { + __cxa_exception* exception_header = (__cxa_exception*)(unwind_exception+1) - 1; + void* adjustedPtr = get_thrown_object_ptr(unwind_exception); + const __shim_type_info* excpType = + static_cast<const __shim_type_info*>(exception_header->exceptionType); + if (adjustedPtr == 0 || excpType == 0) + { + // Something very bad happened + call_terminate(native_exception, unwind_exception); + } + if (catchType->can_catch(excpType, adjustedPtr)) + { + // Found a matching handler. This is either search + // phase or forced unwinding. + assert(actions & + (_UA_SEARCH_PHASE | _UA_FORCE_UNWIND)); + results.ttypeIndex = ttypeIndex; + results.actionRecord = actionRecord; + results.adjustedPtr = adjustedPtr; + results.reason = _URC_HANDLER_FOUND; + return; + } + } + // Scan next action ... + } + else if (ttypeIndex < 0) + { + // Found an exception specification. + if (actions & _UA_FORCE_UNWIND) { + // Skip if forced unwinding. + } else if (native_exception) { + // Does the exception spec catch this native exception? + __cxa_exception* exception_header = (__cxa_exception*)(unwind_exception+1) - 1; + void* adjustedPtr = get_thrown_object_ptr(unwind_exception); + const __shim_type_info* excpType = + static_cast<const __shim_type_info*>(exception_header->exceptionType); + if (adjustedPtr == 0 || excpType == 0) + { + // Something very bad happened + call_terminate(native_exception, unwind_exception); + } + if (exception_spec_can_catch(ttypeIndex, classInfo, + ttypeEncoding, excpType, adjustedPtr, unwind_exception, base)) - { - // Native exception caught by exception - // specification. - assert(actions & _UA_SEARCH_PHASE); - results.ttypeIndex = ttypeIndex; - results.actionRecord = actionRecord; - results.adjustedPtr = adjustedPtr; - results.reason = _URC_HANDLER_FOUND; - return; - } - } else { - // foreign exception caught by exception spec - results.ttypeIndex = ttypeIndex; - results.actionRecord = actionRecord; - results.adjustedPtr = - get_thrown_object_ptr(unwind_exception); - results.reason = _URC_HANDLER_FOUND; - return; - } - // Scan next action ... - } else { - hasCleanup = true; - } - const uint8_t* temp = action; - int64_t actionOffset = readSLEB128(&temp); - if (actionOffset == 0) - { - // End of action list. If this is phase 2 and we have found - // a cleanup (ttypeIndex=0), return _URC_HANDLER_FOUND; - // otherwise return _URC_CONTINUE_UNWIND. - results.reason = hasCleanup && actions & _UA_CLEANUP_PHASE - ? _URC_HANDLER_FOUND - : _URC_CONTINUE_UNWIND; - return; - } - // Go to next action - action += actionOffset; - } // there is no break out of this loop, only return - } -#ifndef __USING_SJLJ_EXCEPTIONS__ - else if (ipOffset < start) - { - // There is no call site for this ip - // Something bad has happened. We should never get here. - // Possible stack corruption. - call_terminate(native_exception, unwind_exception); - } + { + // Native exception caught by exception + // specification. + assert(actions & _UA_SEARCH_PHASE); + results.ttypeIndex = ttypeIndex; + results.actionRecord = actionRecord; + results.adjustedPtr = adjustedPtr; + results.reason = _URC_HANDLER_FOUND; + return; + } + } else { + // foreign exception caught by exception spec + results.ttypeIndex = ttypeIndex; + results.actionRecord = actionRecord; + results.adjustedPtr = + get_thrown_object_ptr(unwind_exception); + results.reason = _URC_HANDLER_FOUND; + return; + } + // Scan next action ... + } else { + hasCleanup = true; + } + const uint8_t* temp = action; + int64_t actionOffset = readSLEB128(&temp); + if (actionOffset == 0) + { + // End of action list. If this is phase 2 and we have found + // a cleanup (ttypeIndex=0), return _URC_HANDLER_FOUND; + // otherwise return _URC_CONTINUE_UNWIND. + results.reason = hasCleanup && actions & _UA_CLEANUP_PHASE + ? _URC_HANDLER_FOUND + : _URC_CONTINUE_UNWIND; + return; + } + // Go to next action + action += actionOffset; + } // there is no break out of this loop, only return + } +#ifndef __USING_SJLJ_EXCEPTIONS__ + else if (ipOffset < start) + { + // There is no call site for this ip + // Something bad has happened. We should never get here. + // Possible stack corruption. + call_terminate(native_exception, unwind_exception); + } #endif // !__USING_SJLJ_EXCEPTIONS__ - } // there might be some tricky cases which break out of this loop - - // It is possible that no eh table entry specify how to handle - // this exception. By spec, terminate it immediately. - call_terminate(native_exception, unwind_exception); -} - -// public API - -/* -The personality function branches on actions like so: - -_UA_SEARCH_PHASE - - If _UA_CLEANUP_PHASE or _UA_HANDLER_FRAME or _UA_FORCE_UNWIND there's - an error from above, return _URC_FATAL_PHASE1_ERROR. - - Scan for anything that could stop unwinding: - - 1. A catch clause that will catch this exception - (will never catch foreign). - 2. A catch (...) (will always catch foreign). - 3. An exception spec that will catch this exception - (will always catch foreign). - If a handler is found - If not foreign - Save state in header - return _URC_HANDLER_FOUND - Else a handler not found - return _URC_CONTINUE_UNWIND - -_UA_CLEANUP_PHASE - - If _UA_HANDLER_FRAME - If _UA_FORCE_UNWIND - How did this happen? return _URC_FATAL_PHASE2_ERROR - If foreign - Do _UA_SEARCH_PHASE to recover state - else - Recover state from header - Transfer control to landing pad. return _URC_INSTALL_CONTEXT - - Else - - This branch handles both normal C++ non-catching handlers (cleanups) - and forced unwinding. - Scan for anything that can not stop unwinding: - - 1. A cleanup. - - If a cleanup is found - transfer control to it. return _URC_INSTALL_CONTEXT - Else a cleanup is not found: return _URC_CONTINUE_UNWIND -*/ - -#if !defined(_LIBCXXABI_ARM_EHABI) -#if defined(__SEH__) && !defined(__USING_SJLJ_EXCEPTIONS__) -static _Unwind_Reason_Code __gxx_personality_imp -#else -_LIBCXXABI_FUNC_VIS _Unwind_Reason_Code -#ifdef __USING_SJLJ_EXCEPTIONS__ -__gxx_personality_sj0 -#else -__gxx_personality_v0 -#endif -#endif - (int version, _Unwind_Action actions, uint64_t exceptionClass, - _Unwind_Exception* unwind_exception, _Unwind_Context* context) -{ - if (version != 1 || unwind_exception == 0 || context == 0) - return _URC_FATAL_PHASE1_ERROR; - - bool native_exception = (exceptionClass & get_vendor_and_language) == - (kOurExceptionClass & get_vendor_and_language); - scan_results results; - // Process a catch handler for a native exception first. - if (actions == (_UA_CLEANUP_PHASE | _UA_HANDLER_FRAME) && - native_exception) { - // Reload the results from the phase 1 cache. - __cxa_exception* exception_header = - (__cxa_exception*)(unwind_exception + 1) - 1; - results.ttypeIndex = exception_header->handlerSwitchValue; - results.actionRecord = exception_header->actionRecord; - results.languageSpecificData = exception_header->languageSpecificData; - results.landingPad = - reinterpret_cast<uintptr_t>(exception_header->catchTemp); - results.adjustedPtr = exception_header->adjustedPtr; - - // Jump to the handler. - set_registers(unwind_exception, context, results); + } // there might be some tricky cases which break out of this loop + + // It is possible that no eh table entry specify how to handle + // this exception. By spec, terminate it immediately. + call_terminate(native_exception, unwind_exception); +} + +// public API + +/* +The personality function branches on actions like so: + +_UA_SEARCH_PHASE + + If _UA_CLEANUP_PHASE or _UA_HANDLER_FRAME or _UA_FORCE_UNWIND there's + an error from above, return _URC_FATAL_PHASE1_ERROR. + + Scan for anything that could stop unwinding: + + 1. A catch clause that will catch this exception + (will never catch foreign). + 2. A catch (...) (will always catch foreign). + 3. An exception spec that will catch this exception + (will always catch foreign). + If a handler is found + If not foreign + Save state in header + return _URC_HANDLER_FOUND + Else a handler not found + return _URC_CONTINUE_UNWIND + +_UA_CLEANUP_PHASE + + If _UA_HANDLER_FRAME + If _UA_FORCE_UNWIND + How did this happen? return _URC_FATAL_PHASE2_ERROR + If foreign + Do _UA_SEARCH_PHASE to recover state + else + Recover state from header + Transfer control to landing pad. return _URC_INSTALL_CONTEXT + + Else + + This branch handles both normal C++ non-catching handlers (cleanups) + and forced unwinding. + Scan for anything that can not stop unwinding: + + 1. A cleanup. + + If a cleanup is found + transfer control to it. return _URC_INSTALL_CONTEXT + Else a cleanup is not found: return _URC_CONTINUE_UNWIND +*/ + +#if !defined(_LIBCXXABI_ARM_EHABI) +#if defined(__SEH__) && !defined(__USING_SJLJ_EXCEPTIONS__) +static _Unwind_Reason_Code __gxx_personality_imp +#else +_LIBCXXABI_FUNC_VIS _Unwind_Reason_Code +#ifdef __USING_SJLJ_EXCEPTIONS__ +__gxx_personality_sj0 +#else +__gxx_personality_v0 +#endif +#endif + (int version, _Unwind_Action actions, uint64_t exceptionClass, + _Unwind_Exception* unwind_exception, _Unwind_Context* context) +{ + if (version != 1 || unwind_exception == 0 || context == 0) + return _URC_FATAL_PHASE1_ERROR; + + bool native_exception = (exceptionClass & get_vendor_and_language) == + (kOurExceptionClass & get_vendor_and_language); + scan_results results; + // Process a catch handler for a native exception first. + if (actions == (_UA_CLEANUP_PHASE | _UA_HANDLER_FRAME) && + native_exception) { + // Reload the results from the phase 1 cache. + __cxa_exception* exception_header = + (__cxa_exception*)(unwind_exception + 1) - 1; + results.ttypeIndex = exception_header->handlerSwitchValue; + results.actionRecord = exception_header->actionRecord; + results.languageSpecificData = exception_header->languageSpecificData; + results.landingPad = + reinterpret_cast<uintptr_t>(exception_header->catchTemp); + results.adjustedPtr = exception_header->adjustedPtr; + + // Jump to the handler. + set_registers(unwind_exception, context, results); // Cache base for calculating the address of ttype in // __cxa_call_unexpected. if (results.ttypeIndex < 0) { @@ -940,35 +940,35 @@ __gxx_personality_v0 exception_header->catchTemp = 0; #endif } - return _URC_INSTALL_CONTEXT; - } - - // In other cases we need to scan LSDA. - scan_eh_tab(results, actions, native_exception, unwind_exception, context); - if (results.reason == _URC_CONTINUE_UNWIND || - results.reason == _URC_FATAL_PHASE1_ERROR) - return results.reason; - - if (actions & _UA_SEARCH_PHASE) - { - // Phase 1 search: All we're looking for in phase 1 is a handler that - // halts unwinding - assert(results.reason == _URC_HANDLER_FOUND); - if (native_exception) { - // For a native exception, cache the LSDA result. - __cxa_exception* exc = (__cxa_exception*)(unwind_exception + 1) - 1; - exc->handlerSwitchValue = static_cast<int>(results.ttypeIndex); - exc->actionRecord = results.actionRecord; - exc->languageSpecificData = results.languageSpecificData; - exc->catchTemp = reinterpret_cast<void*>(results.landingPad); - exc->adjustedPtr = results.adjustedPtr; - } - return _URC_HANDLER_FOUND; - } - - assert(actions & _UA_CLEANUP_PHASE); - assert(results.reason == _URC_HANDLER_FOUND); - set_registers(unwind_exception, context, results); + return _URC_INSTALL_CONTEXT; + } + + // In other cases we need to scan LSDA. + scan_eh_tab(results, actions, native_exception, unwind_exception, context); + if (results.reason == _URC_CONTINUE_UNWIND || + results.reason == _URC_FATAL_PHASE1_ERROR) + return results.reason; + + if (actions & _UA_SEARCH_PHASE) + { + // Phase 1 search: All we're looking for in phase 1 is a handler that + // halts unwinding + assert(results.reason == _URC_HANDLER_FOUND); + if (native_exception) { + // For a native exception, cache the LSDA result. + __cxa_exception* exc = (__cxa_exception*)(unwind_exception + 1) - 1; + exc->handlerSwitchValue = static_cast<int>(results.ttypeIndex); + exc->actionRecord = results.actionRecord; + exc->languageSpecificData = results.languageSpecificData; + exc->catchTemp = reinterpret_cast<void*>(results.landingPad); + exc->adjustedPtr = results.adjustedPtr; + } + return _URC_HANDLER_FOUND; + } + + assert(actions & _UA_CLEANUP_PHASE); + assert(results.reason == _URC_HANDLER_FOUND); + set_registers(unwind_exception, context, results); // Cache base for calculating the address of ttype in __cxa_call_unexpected. if (results.ttypeIndex < 0) { __cxa_exception* exception_header = @@ -979,141 +979,141 @@ __gxx_personality_v0 exception_header->catchTemp = 0; #endif } - return _URC_INSTALL_CONTEXT; -} - -#if defined(__SEH__) && !defined(__USING_SJLJ_EXCEPTIONS__) -extern "C" _LIBCXXABI_FUNC_VIS EXCEPTION_DISPOSITION -__gxx_personality_seh0(PEXCEPTION_RECORD ms_exc, void *this_frame, - PCONTEXT ms_orig_context, PDISPATCHER_CONTEXT ms_disp) -{ - return _GCC_specific_handler(ms_exc, this_frame, ms_orig_context, ms_disp, - __gxx_personality_imp); -} -#endif - -#else - -extern "C" _Unwind_Reason_Code __gnu_unwind_frame(_Unwind_Exception*, - _Unwind_Context*); - -// Helper function to unwind one frame. -// ARM EHABI 7.3 and 7.4: If the personality function returns _URC_CONTINUE_UNWIND, the -// personality routine should update the virtual register set (VRS) according to the -// corresponding frame unwinding instructions (ARM EHABI 9.3.) -static _Unwind_Reason_Code continue_unwind(_Unwind_Exception* unwind_exception, - _Unwind_Context* context) -{ + return _URC_INSTALL_CONTEXT; +} + +#if defined(__SEH__) && !defined(__USING_SJLJ_EXCEPTIONS__) +extern "C" _LIBCXXABI_FUNC_VIS EXCEPTION_DISPOSITION +__gxx_personality_seh0(PEXCEPTION_RECORD ms_exc, void *this_frame, + PCONTEXT ms_orig_context, PDISPATCHER_CONTEXT ms_disp) +{ + return _GCC_specific_handler(ms_exc, this_frame, ms_orig_context, ms_disp, + __gxx_personality_imp); +} +#endif + +#else + +extern "C" _Unwind_Reason_Code __gnu_unwind_frame(_Unwind_Exception*, + _Unwind_Context*); + +// Helper function to unwind one frame. +// ARM EHABI 7.3 and 7.4: If the personality function returns _URC_CONTINUE_UNWIND, the +// personality routine should update the virtual register set (VRS) according to the +// corresponding frame unwinding instructions (ARM EHABI 9.3.) +static _Unwind_Reason_Code continue_unwind(_Unwind_Exception* unwind_exception, + _Unwind_Context* context) +{ switch (__gnu_unwind_frame(unwind_exception, context)) { case _URC_OK: - return _URC_CONTINUE_UNWIND; + return _URC_CONTINUE_UNWIND; case _URC_END_OF_STACK: return _URC_END_OF_STACK; default: return _URC_FAILURE; } -} - -// ARM register names -#if !defined(LIBCXXABI_USE_LLVM_UNWINDER) -static const uint32_t REG_UCB = 12; // Register to save _Unwind_Control_Block -#endif -static const uint32_t REG_SP = 13; - -static void save_results_to_barrier_cache(_Unwind_Exception* unwind_exception, - const scan_results& results) -{ - unwind_exception->barrier_cache.bitpattern[0] = (uint32_t)results.adjustedPtr; - unwind_exception->barrier_cache.bitpattern[1] = (uint32_t)results.actionRecord; - unwind_exception->barrier_cache.bitpattern[2] = (uint32_t)results.languageSpecificData; - unwind_exception->barrier_cache.bitpattern[3] = (uint32_t)results.landingPad; - unwind_exception->barrier_cache.bitpattern[4] = (uint32_t)results.ttypeIndex; -} - -static void load_results_from_barrier_cache(scan_results& results, - const _Unwind_Exception* unwind_exception) -{ - results.adjustedPtr = (void*)unwind_exception->barrier_cache.bitpattern[0]; - results.actionRecord = (const uint8_t*)unwind_exception->barrier_cache.bitpattern[1]; - results.languageSpecificData = (const uint8_t*)unwind_exception->barrier_cache.bitpattern[2]; - results.landingPad = (uintptr_t)unwind_exception->barrier_cache.bitpattern[3]; - results.ttypeIndex = (int64_t)(int32_t)unwind_exception->barrier_cache.bitpattern[4]; -} - -extern "C" _LIBCXXABI_FUNC_VIS _Unwind_Reason_Code -__gxx_personality_v0(_Unwind_State state, - _Unwind_Exception* unwind_exception, - _Unwind_Context* context) -{ - if (unwind_exception == 0 || context == 0) - return _URC_FATAL_PHASE1_ERROR; - - bool native_exception = __isOurExceptionClass(unwind_exception); - -#if !defined(LIBCXXABI_USE_LLVM_UNWINDER) - // Copy the address of _Unwind_Control_Block to r12 so that - // _Unwind_GetLanguageSpecificData() and _Unwind_GetRegionStart() can - // return correct address. - _Unwind_SetGR(context, REG_UCB, reinterpret_cast<uint32_t>(unwind_exception)); -#endif - - // Check the undocumented force unwinding behavior - bool is_force_unwinding = state & _US_FORCE_UNWIND; - state &= ~_US_FORCE_UNWIND; - - scan_results results; - switch (state) { - case _US_VIRTUAL_UNWIND_FRAME: - if (is_force_unwinding) - return continue_unwind(unwind_exception, context); - - // Phase 1 search: All we're looking for in phase 1 is a handler that halts unwinding - scan_eh_tab(results, _UA_SEARCH_PHASE, native_exception, unwind_exception, context); - if (results.reason == _URC_HANDLER_FOUND) - { - unwind_exception->barrier_cache.sp = _Unwind_GetGR(context, REG_SP); - if (native_exception) - save_results_to_barrier_cache(unwind_exception, results); - return _URC_HANDLER_FOUND; - } - // Did not find the catch handler - if (results.reason == _URC_CONTINUE_UNWIND) - return continue_unwind(unwind_exception, context); - return results.reason; - - case _US_UNWIND_FRAME_STARTING: - // TODO: Support force unwinding in the phase 2 search. - // NOTE: In order to call the cleanup functions, _Unwind_ForcedUnwind() - // will call this personality function with (_US_FORCE_UNWIND | - // _US_UNWIND_FRAME_STARTING). - - // Phase 2 search - if (unwind_exception->barrier_cache.sp == _Unwind_GetGR(context, REG_SP)) - { - // Found a catching handler in phase 1 - if (native_exception) - { - // Load the result from the native exception barrier cache. - load_results_from_barrier_cache(results, unwind_exception); - results.reason = _URC_HANDLER_FOUND; - } - else - { - // Search for the catching handler again for the foreign exception. - scan_eh_tab(results, static_cast<_Unwind_Action>(_UA_CLEANUP_PHASE | _UA_HANDLER_FRAME), - native_exception, unwind_exception, context); - if (results.reason != _URC_HANDLER_FOUND) // phase1 search should guarantee to find one - call_terminate(native_exception, unwind_exception); - } - - // Install the context for the catching handler - set_registers(unwind_exception, context, results); - return _URC_INSTALL_CONTEXT; - } - - // Either we didn't do a phase 1 search (due to forced unwinding), or - // phase 1 reported no catching-handlers. - // Search for a (non-catching) cleanup +} + +// ARM register names +#if !defined(LIBCXXABI_USE_LLVM_UNWINDER) +static const uint32_t REG_UCB = 12; // Register to save _Unwind_Control_Block +#endif +static const uint32_t REG_SP = 13; + +static void save_results_to_barrier_cache(_Unwind_Exception* unwind_exception, + const scan_results& results) +{ + unwind_exception->barrier_cache.bitpattern[0] = (uint32_t)results.adjustedPtr; + unwind_exception->barrier_cache.bitpattern[1] = (uint32_t)results.actionRecord; + unwind_exception->barrier_cache.bitpattern[2] = (uint32_t)results.languageSpecificData; + unwind_exception->barrier_cache.bitpattern[3] = (uint32_t)results.landingPad; + unwind_exception->barrier_cache.bitpattern[4] = (uint32_t)results.ttypeIndex; +} + +static void load_results_from_barrier_cache(scan_results& results, + const _Unwind_Exception* unwind_exception) +{ + results.adjustedPtr = (void*)unwind_exception->barrier_cache.bitpattern[0]; + results.actionRecord = (const uint8_t*)unwind_exception->barrier_cache.bitpattern[1]; + results.languageSpecificData = (const uint8_t*)unwind_exception->barrier_cache.bitpattern[2]; + results.landingPad = (uintptr_t)unwind_exception->barrier_cache.bitpattern[3]; + results.ttypeIndex = (int64_t)(int32_t)unwind_exception->barrier_cache.bitpattern[4]; +} + +extern "C" _LIBCXXABI_FUNC_VIS _Unwind_Reason_Code +__gxx_personality_v0(_Unwind_State state, + _Unwind_Exception* unwind_exception, + _Unwind_Context* context) +{ + if (unwind_exception == 0 || context == 0) + return _URC_FATAL_PHASE1_ERROR; + + bool native_exception = __isOurExceptionClass(unwind_exception); + +#if !defined(LIBCXXABI_USE_LLVM_UNWINDER) + // Copy the address of _Unwind_Control_Block to r12 so that + // _Unwind_GetLanguageSpecificData() and _Unwind_GetRegionStart() can + // return correct address. + _Unwind_SetGR(context, REG_UCB, reinterpret_cast<uint32_t>(unwind_exception)); +#endif + + // Check the undocumented force unwinding behavior + bool is_force_unwinding = state & _US_FORCE_UNWIND; + state &= ~_US_FORCE_UNWIND; + + scan_results results; + switch (state) { + case _US_VIRTUAL_UNWIND_FRAME: + if (is_force_unwinding) + return continue_unwind(unwind_exception, context); + + // Phase 1 search: All we're looking for in phase 1 is a handler that halts unwinding + scan_eh_tab(results, _UA_SEARCH_PHASE, native_exception, unwind_exception, context); + if (results.reason == _URC_HANDLER_FOUND) + { + unwind_exception->barrier_cache.sp = _Unwind_GetGR(context, REG_SP); + if (native_exception) + save_results_to_barrier_cache(unwind_exception, results); + return _URC_HANDLER_FOUND; + } + // Did not find the catch handler + if (results.reason == _URC_CONTINUE_UNWIND) + return continue_unwind(unwind_exception, context); + return results.reason; + + case _US_UNWIND_FRAME_STARTING: + // TODO: Support force unwinding in the phase 2 search. + // NOTE: In order to call the cleanup functions, _Unwind_ForcedUnwind() + // will call this personality function with (_US_FORCE_UNWIND | + // _US_UNWIND_FRAME_STARTING). + + // Phase 2 search + if (unwind_exception->barrier_cache.sp == _Unwind_GetGR(context, REG_SP)) + { + // Found a catching handler in phase 1 + if (native_exception) + { + // Load the result from the native exception barrier cache. + load_results_from_barrier_cache(results, unwind_exception); + results.reason = _URC_HANDLER_FOUND; + } + else + { + // Search for the catching handler again for the foreign exception. + scan_eh_tab(results, static_cast<_Unwind_Action>(_UA_CLEANUP_PHASE | _UA_HANDLER_FRAME), + native_exception, unwind_exception, context); + if (results.reason != _URC_HANDLER_FOUND) // phase1 search should guarantee to find one + call_terminate(native_exception, unwind_exception); + } + + // Install the context for the catching handler + set_registers(unwind_exception, context, results); + return _URC_INSTALL_CONTEXT; + } + + // Either we didn't do a phase 1 search (due to forced unwinding), or + // phase 1 reported no catching-handlers. + // Search for a (non-catching) cleanup if (is_force_unwinding) scan_eh_tab( results, @@ -1122,168 +1122,168 @@ __gxx_personality_v0(_Unwind_State state, else scan_eh_tab(results, _UA_CLEANUP_PHASE, native_exception, unwind_exception, context); - if (results.reason == _URC_HANDLER_FOUND) - { - // Found a non-catching handler - - // ARM EHABI 8.4.2: Before we can jump to the cleanup handler, we have to setup some - // internal data structures, so that __cxa_end_cleanup() can get unwind_exception from - // __cxa_get_globals(). - __cxa_begin_cleanup(unwind_exception); - - // Install the context for the cleanup handler - set_registers(unwind_exception, context, results); - return _URC_INSTALL_CONTEXT; - } - - // Did not find any handler - if (results.reason == _URC_CONTINUE_UNWIND) - return continue_unwind(unwind_exception, context); - return results.reason; - - case _US_UNWIND_FRAME_RESUME: - return continue_unwind(unwind_exception, context); - } - - // We were called improperly: neither a phase 1 or phase 2 search - return _URC_FATAL_PHASE1_ERROR; -} -#endif - - -__attribute__((noreturn)) -_LIBCXXABI_FUNC_VIS void -__cxa_call_unexpected(void* arg) -{ - _Unwind_Exception* unwind_exception = static_cast<_Unwind_Exception*>(arg); - if (unwind_exception == 0) - call_terminate(false, unwind_exception); - __cxa_begin_catch(unwind_exception); - bool native_old_exception = __isOurExceptionClass(unwind_exception); - std::unexpected_handler u_handler; - std::terminate_handler t_handler; - __cxa_exception* old_exception_header = 0; - int64_t ttypeIndex; - const uint8_t* lsda; + if (results.reason == _URC_HANDLER_FOUND) + { + // Found a non-catching handler + + // ARM EHABI 8.4.2: Before we can jump to the cleanup handler, we have to setup some + // internal data structures, so that __cxa_end_cleanup() can get unwind_exception from + // __cxa_get_globals(). + __cxa_begin_cleanup(unwind_exception); + + // Install the context for the cleanup handler + set_registers(unwind_exception, context, results); + return _URC_INSTALL_CONTEXT; + } + + // Did not find any handler + if (results.reason == _URC_CONTINUE_UNWIND) + return continue_unwind(unwind_exception, context); + return results.reason; + + case _US_UNWIND_FRAME_RESUME: + return continue_unwind(unwind_exception, context); + } + + // We were called improperly: neither a phase 1 or phase 2 search + return _URC_FATAL_PHASE1_ERROR; +} +#endif + + +__attribute__((noreturn)) +_LIBCXXABI_FUNC_VIS void +__cxa_call_unexpected(void* arg) +{ + _Unwind_Exception* unwind_exception = static_cast<_Unwind_Exception*>(arg); + if (unwind_exception == 0) + call_terminate(false, unwind_exception); + __cxa_begin_catch(unwind_exception); + bool native_old_exception = __isOurExceptionClass(unwind_exception); + std::unexpected_handler u_handler; + std::terminate_handler t_handler; + __cxa_exception* old_exception_header = 0; + int64_t ttypeIndex; + const uint8_t* lsda; uintptr_t base = 0; - if (native_old_exception) - { - old_exception_header = (__cxa_exception*)(unwind_exception+1) - 1; - t_handler = old_exception_header->terminateHandler; - u_handler = old_exception_header->unexpectedHandler; - // If std::__unexpected(u_handler) rethrows the same exception, - // these values get overwritten by the rethrow. So save them now: -#if defined(_LIBCXXABI_ARM_EHABI) - ttypeIndex = (int64_t)(int32_t)unwind_exception->barrier_cache.bitpattern[4]; - lsda = (const uint8_t*)unwind_exception->barrier_cache.bitpattern[2]; -#else - ttypeIndex = old_exception_header->handlerSwitchValue; - lsda = old_exception_header->languageSpecificData; + if (native_old_exception) + { + old_exception_header = (__cxa_exception*)(unwind_exception+1) - 1; + t_handler = old_exception_header->terminateHandler; + u_handler = old_exception_header->unexpectedHandler; + // If std::__unexpected(u_handler) rethrows the same exception, + // these values get overwritten by the rethrow. So save them now: +#if defined(_LIBCXXABI_ARM_EHABI) + ttypeIndex = (int64_t)(int32_t)unwind_exception->barrier_cache.bitpattern[4]; + lsda = (const uint8_t*)unwind_exception->barrier_cache.bitpattern[2]; +#else + ttypeIndex = old_exception_header->handlerSwitchValue; + lsda = old_exception_header->languageSpecificData; base = (uintptr_t)old_exception_header->catchTemp; -#endif - } - else - { - t_handler = std::get_terminate(); - u_handler = std::get_unexpected(); - } - try - { - std::__unexpected(u_handler); - } - catch (...) - { - // If the old exception is foreign, then all we can do is terminate. - // We have no way to recover the needed old exception spec. There's - // no way to pass that information here. And the personality routine - // can't call us directly and do anything but terminate() if we throw - // from here. - if (native_old_exception) - { - // Have: - // old_exception_header->languageSpecificData - // old_exception_header->actionRecord +#endif + } + else + { + t_handler = std::get_terminate(); + u_handler = std::get_unexpected(); + } + try + { + std::__unexpected(u_handler); + } + catch (...) + { + // If the old exception is foreign, then all we can do is terminate. + // We have no way to recover the needed old exception spec. There's + // no way to pass that information here. And the personality routine + // can't call us directly and do anything but terminate() if we throw + // from here. + if (native_old_exception) + { + // Have: + // old_exception_header->languageSpecificData + // old_exception_header->actionRecord // old_exception_header->catchTemp, base for calculating ttype - // Need - // const uint8_t* classInfo - // uint8_t ttypeEncoding - uint8_t lpStartEncoding = *lsda++; + // Need + // const uint8_t* classInfo + // uint8_t ttypeEncoding + uint8_t lpStartEncoding = *lsda++; const uint8_t* lpStart = (const uint8_t*)readEncodedPointer(&lsda, lpStartEncoding, base); - (void)lpStart; // purposefully unused. Just needed to increment lsda. - uint8_t ttypeEncoding = *lsda++; - if (ttypeEncoding == DW_EH_PE_omit) - std::__terminate(t_handler); - uintptr_t classInfoOffset = readULEB128(&lsda); - const uint8_t* classInfo = lsda + classInfoOffset; - // Is this new exception catchable by the exception spec at ttypeIndex? - // The answer is obviously yes if the new and old exceptions are the same exception - // If no - // throw; - __cxa_eh_globals* globals = __cxa_get_globals_fast(); - __cxa_exception* new_exception_header = globals->caughtExceptions; - if (new_exception_header == 0) - // This shouldn't be able to happen! - std::__terminate(t_handler); - bool native_new_exception = __isOurExceptionClass(&new_exception_header->unwindHeader); - void* adjustedPtr; - if (native_new_exception && (new_exception_header != old_exception_header)) - { - const __shim_type_info* excpType = - static_cast<const __shim_type_info*>(new_exception_header->exceptionType); - adjustedPtr = - __getExceptionClass(&new_exception_header->unwindHeader) == kOurDependentExceptionClass ? - ((__cxa_dependent_exception*)new_exception_header)->primaryException : - new_exception_header + 1; - if (!exception_spec_can_catch(ttypeIndex, classInfo, ttypeEncoding, + (void)lpStart; // purposefully unused. Just needed to increment lsda. + uint8_t ttypeEncoding = *lsda++; + if (ttypeEncoding == DW_EH_PE_omit) + std::__terminate(t_handler); + uintptr_t classInfoOffset = readULEB128(&lsda); + const uint8_t* classInfo = lsda + classInfoOffset; + // Is this new exception catchable by the exception spec at ttypeIndex? + // The answer is obviously yes if the new and old exceptions are the same exception + // If no + // throw; + __cxa_eh_globals* globals = __cxa_get_globals_fast(); + __cxa_exception* new_exception_header = globals->caughtExceptions; + if (new_exception_header == 0) + // This shouldn't be able to happen! + std::__terminate(t_handler); + bool native_new_exception = __isOurExceptionClass(&new_exception_header->unwindHeader); + void* adjustedPtr; + if (native_new_exception && (new_exception_header != old_exception_header)) + { + const __shim_type_info* excpType = + static_cast<const __shim_type_info*>(new_exception_header->exceptionType); + adjustedPtr = + __getExceptionClass(&new_exception_header->unwindHeader) == kOurDependentExceptionClass ? + ((__cxa_dependent_exception*)new_exception_header)->primaryException : + new_exception_header + 1; + if (!exception_spec_can_catch(ttypeIndex, classInfo, ttypeEncoding, excpType, adjustedPtr, unwind_exception, base)) - { - // We need to __cxa_end_catch, but for the old exception, - // not the new one. This is a little tricky ... - // Disguise new_exception_header as a rethrown exception, but - // don't actually rethrow it. This means you can temporarily - // end the catch clause enclosing new_exception_header without - // __cxa_end_catch destroying new_exception_header. - new_exception_header->handlerCount = -new_exception_header->handlerCount; - globals->uncaughtExceptions += 1; - // Call __cxa_end_catch for new_exception_header - __cxa_end_catch(); - // Call __cxa_end_catch for old_exception_header - __cxa_end_catch(); - // Renter this catch clause with new_exception_header - __cxa_begin_catch(&new_exception_header->unwindHeader); - // Rethrow new_exception_header - throw; - } - } - // Will a std::bad_exception be catchable by the exception spec at - // ttypeIndex? - // If no - // throw std::bad_exception(); - const __shim_type_info* excpType = - static_cast<const __shim_type_info*>(&typeid(std::bad_exception)); - std::bad_exception be; - adjustedPtr = &be; - if (!exception_spec_can_catch(ttypeIndex, classInfo, ttypeEncoding, + { + // We need to __cxa_end_catch, but for the old exception, + // not the new one. This is a little tricky ... + // Disguise new_exception_header as a rethrown exception, but + // don't actually rethrow it. This means you can temporarily + // end the catch clause enclosing new_exception_header without + // __cxa_end_catch destroying new_exception_header. + new_exception_header->handlerCount = -new_exception_header->handlerCount; + globals->uncaughtExceptions += 1; + // Call __cxa_end_catch for new_exception_header + __cxa_end_catch(); + // Call __cxa_end_catch for old_exception_header + __cxa_end_catch(); + // Renter this catch clause with new_exception_header + __cxa_begin_catch(&new_exception_header->unwindHeader); + // Rethrow new_exception_header + throw; + } + } + // Will a std::bad_exception be catchable by the exception spec at + // ttypeIndex? + // If no + // throw std::bad_exception(); + const __shim_type_info* excpType = + static_cast<const __shim_type_info*>(&typeid(std::bad_exception)); + std::bad_exception be; + adjustedPtr = &be; + if (!exception_spec_can_catch(ttypeIndex, classInfo, ttypeEncoding, excpType, adjustedPtr, unwind_exception, base)) - { - // We need to __cxa_end_catch for both the old exception and the - // new exception. Technically we should do it in that order. - // But it is expedient to do it in the opposite order: - // Call __cxa_end_catch for new_exception_header - __cxa_end_catch(); - // Throw std::bad_exception will __cxa_end_catch for - // old_exception_header - throw be; - } - } - } - std::__terminate(t_handler); -} - + { + // We need to __cxa_end_catch for both the old exception and the + // new exception. Technically we should do it in that order. + // But it is expedient to do it in the opposite order: + // Call __cxa_end_catch for new_exception_header + __cxa_end_catch(); + // Throw std::bad_exception will __cxa_end_catch for + // old_exception_header + throw be; + } + } + } + std::__terminate(t_handler); +} + #if defined(_AIX) // Personality routine for EH using the range table. Make it an alias of // __gxx_personality_v0(). @@ -1293,6 +1293,6 @@ _LIBCXXABI_FUNC_VIS _Unwind_Reason_Code __xlcxx_personality_v1( __attribute__((__alias__("__gxx_personality_v0"))); #endif -} // extern "C" - -} // __cxxabiv1 +} // extern "C" + +} // __cxxabiv1 diff --git a/contrib/libs/cxxsupp/libcxxabi/src/cxa_thread_atexit.cpp b/contrib/libs/cxxsupp/libcxxabi/src/cxa_thread_atexit.cpp index 665f9e5569..5bf5bb61dc 100644 --- a/contrib/libs/cxxsupp/libcxxabi/src/cxa_thread_atexit.cpp +++ b/contrib/libs/cxxsupp/libcxxabi/src/cxa_thread_atexit.cpp @@ -1,145 +1,145 @@ //===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#include "abort_message.h" -#include "cxxabi.h" -#include <__threading_support> -#ifndef _LIBCXXABI_HAS_NO_THREADS -#if defined(__ELF__) && defined(_LIBCXXABI_LINK_PTHREAD_LIB) -#pragma comment(lib, "pthread") -#endif -#endif - -#include <stdlib.h> - -namespace __cxxabiv1 { - - using Dtor = void(*)(void*); - - extern "C" -#ifndef HAVE___CXA_THREAD_ATEXIT_IMPL - // A weak symbol is used to detect this function's presence in the C library - // at runtime, even if libc++ is built against an older libc - _LIBCXXABI_WEAK -#endif - int __cxa_thread_atexit_impl(Dtor, void*, void*); - -#ifndef HAVE___CXA_THREAD_ATEXIT_IMPL - -namespace { - // This implementation is used if the C library does not provide - // __cxa_thread_atexit_impl() for us. It has a number of limitations that are - // difficult to impossible to address without ..._impl(): - // - // - dso_symbol is ignored. This means that a shared library may be unloaded - // (via dlclose()) before its thread_local destructors have run. - // - // - thread_local destructors for the main thread are run by the destructor of - // a static object. This is later than expected; they should run before the - // destructors of any objects with static storage duration. - // - // - thread_local destructors on non-main threads run on the first iteration - // through the __libccpp_tls_key destructors. - // std::notify_all_at_thread_exit() and similar functions must be careful to - // wait until the second iteration to provide their intended ordering - // guarantees. - // - // Another limitation, though one shared with ..._impl(), is that any - // thread_locals that are first initialized after non-thread_local global - // destructors begin to run will not be destroyed. [basic.start.term] states - // that all thread_local destructors are sequenced before the destruction of - // objects with static storage duration, resulting in a contradiction if a - // thread_local is constructed after that point. Thus we consider such - // programs ill-formed, and don't bother to run those destructors. (If the - // program terminates abnormally after such a thread_local is constructed, - // the destructor is not expected to run and thus there is no contradiction. - // So construction still has to work.) - - struct DtorList { - Dtor dtor; - void* obj; - DtorList* next; - }; - - // The linked list of thread-local destructors to run - __thread DtorList* dtors = nullptr; - // True if the destructors are currently scheduled to run on this thread - __thread bool dtors_alive = false; - // Used to trigger destructors on thread exit; value is ignored - std::__libcpp_tls_key dtors_key; - - void run_dtors(void*) { - while (auto head = dtors) { - dtors = head->next; - head->dtor(head->obj); - ::free(head); - } - - dtors_alive = false; - } - - struct DtorsManager { - DtorsManager() { - // There is intentionally no matching std::__libcpp_tls_delete call, as - // __cxa_thread_atexit() may be called arbitrarily late (for example, from - // global destructors or atexit() handlers). - if (std::__libcpp_tls_create(&dtors_key, run_dtors) != 0) { - abort_message("std::__libcpp_tls_create() failed in __cxa_thread_atexit()"); - } - } - - ~DtorsManager() { - // std::__libcpp_tls_key destructors do not run on threads that call exit() - // (including when the main thread returns from main()), so we explicitly - // call the destructor here. This runs at exit time (potentially earlier - // if libc++abi is dlclose()'d). Any thread_locals initialized after this - // point will not be destroyed. - run_dtors(nullptr); - } - }; -} // namespace - -#endif // HAVE___CXA_THREAD_ATEXIT_IMPL - -extern "C" { - - _LIBCXXABI_FUNC_VIS int __cxa_thread_atexit(Dtor dtor, void* obj, void* dso_symbol) throw() { -#ifdef HAVE___CXA_THREAD_ATEXIT_IMPL - return __cxa_thread_atexit_impl(dtor, obj, dso_symbol); -#else - if (__cxa_thread_atexit_impl) { - return __cxa_thread_atexit_impl(dtor, obj, dso_symbol); - } else { - // Initialize the dtors std::__libcpp_tls_key (uses __cxa_guard_*() for - // one-time initialization and __cxa_atexit() for destruction) - static DtorsManager manager; - - if (!dtors_alive) { - if (std::__libcpp_tls_set(dtors_key, &dtors_key) != 0) { - return -1; - } - dtors_alive = true; - } - - auto head = static_cast<DtorList*>(::malloc(sizeof(DtorList))); - if (!head) { - return -1; - } - - head->dtor = dtor; - head->obj = obj; - head->next = dtors; - dtors = head; - - return 0; - } -#endif // HAVE___CXA_THREAD_ATEXIT_IMPL - } - -} // extern "C" -} // namespace __cxxabiv1 +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "abort_message.h" +#include "cxxabi.h" +#include <__threading_support> +#ifndef _LIBCXXABI_HAS_NO_THREADS +#if defined(__ELF__) && defined(_LIBCXXABI_LINK_PTHREAD_LIB) +#pragma comment(lib, "pthread") +#endif +#endif + +#include <stdlib.h> + +namespace __cxxabiv1 { + + using Dtor = void(*)(void*); + + extern "C" +#ifndef HAVE___CXA_THREAD_ATEXIT_IMPL + // A weak symbol is used to detect this function's presence in the C library + // at runtime, even if libc++ is built against an older libc + _LIBCXXABI_WEAK +#endif + int __cxa_thread_atexit_impl(Dtor, void*, void*); + +#ifndef HAVE___CXA_THREAD_ATEXIT_IMPL + +namespace { + // This implementation is used if the C library does not provide + // __cxa_thread_atexit_impl() for us. It has a number of limitations that are + // difficult to impossible to address without ..._impl(): + // + // - dso_symbol is ignored. This means that a shared library may be unloaded + // (via dlclose()) before its thread_local destructors have run. + // + // - thread_local destructors for the main thread are run by the destructor of + // a static object. This is later than expected; they should run before the + // destructors of any objects with static storage duration. + // + // - thread_local destructors on non-main threads run on the first iteration + // through the __libccpp_tls_key destructors. + // std::notify_all_at_thread_exit() and similar functions must be careful to + // wait until the second iteration to provide their intended ordering + // guarantees. + // + // Another limitation, though one shared with ..._impl(), is that any + // thread_locals that are first initialized after non-thread_local global + // destructors begin to run will not be destroyed. [basic.start.term] states + // that all thread_local destructors are sequenced before the destruction of + // objects with static storage duration, resulting in a contradiction if a + // thread_local is constructed after that point. Thus we consider such + // programs ill-formed, and don't bother to run those destructors. (If the + // program terminates abnormally after such a thread_local is constructed, + // the destructor is not expected to run and thus there is no contradiction. + // So construction still has to work.) + + struct DtorList { + Dtor dtor; + void* obj; + DtorList* next; + }; + + // The linked list of thread-local destructors to run + __thread DtorList* dtors = nullptr; + // True if the destructors are currently scheduled to run on this thread + __thread bool dtors_alive = false; + // Used to trigger destructors on thread exit; value is ignored + std::__libcpp_tls_key dtors_key; + + void run_dtors(void*) { + while (auto head = dtors) { + dtors = head->next; + head->dtor(head->obj); + ::free(head); + } + + dtors_alive = false; + } + + struct DtorsManager { + DtorsManager() { + // There is intentionally no matching std::__libcpp_tls_delete call, as + // __cxa_thread_atexit() may be called arbitrarily late (for example, from + // global destructors or atexit() handlers). + if (std::__libcpp_tls_create(&dtors_key, run_dtors) != 0) { + abort_message("std::__libcpp_tls_create() failed in __cxa_thread_atexit()"); + } + } + + ~DtorsManager() { + // std::__libcpp_tls_key destructors do not run on threads that call exit() + // (including when the main thread returns from main()), so we explicitly + // call the destructor here. This runs at exit time (potentially earlier + // if libc++abi is dlclose()'d). Any thread_locals initialized after this + // point will not be destroyed. + run_dtors(nullptr); + } + }; +} // namespace + +#endif // HAVE___CXA_THREAD_ATEXIT_IMPL + +extern "C" { + + _LIBCXXABI_FUNC_VIS int __cxa_thread_atexit(Dtor dtor, void* obj, void* dso_symbol) throw() { +#ifdef HAVE___CXA_THREAD_ATEXIT_IMPL + return __cxa_thread_atexit_impl(dtor, obj, dso_symbol); +#else + if (__cxa_thread_atexit_impl) { + return __cxa_thread_atexit_impl(dtor, obj, dso_symbol); + } else { + // Initialize the dtors std::__libcpp_tls_key (uses __cxa_guard_*() for + // one-time initialization and __cxa_atexit() for destruction) + static DtorsManager manager; + + if (!dtors_alive) { + if (std::__libcpp_tls_set(dtors_key, &dtors_key) != 0) { + return -1; + } + dtors_alive = true; + } + + auto head = static_cast<DtorList*>(::malloc(sizeof(DtorList))); + if (!head) { + return -1; + } + + head->dtor = dtor; + head->obj = obj; + head->next = dtors; + dtors = head; + + return 0; + } +#endif // HAVE___CXA_THREAD_ATEXIT_IMPL + } + +} // extern "C" +} // namespace __cxxabiv1 diff --git a/contrib/libs/cxxsupp/libcxxabi/src/cxa_vector.cpp b/contrib/libs/cxxsupp/libcxxabi/src/cxa_vector.cpp index 099f9f0c1e..4011d26c37 100644 --- a/contrib/libs/cxxsupp/libcxxabi/src/cxa_vector.cpp +++ b/contrib/libs/cxxsupp/libcxxabi/src/cxa_vector.cpp @@ -1,421 +1,421 @@ //===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// -// This file implements the "Array Construction and Destruction APIs" -// https://itanium-cxx-abi.github.io/cxx-abi/abi.html#array-ctor -// -//===----------------------------------------------------------------------===// - -#include "cxxabi.h" -#include "__cxxabi_config.h" - -#include <exception> // for std::terminate -#include <new> // for std::bad_array_new_length - -#include "abort_message.h" - -#ifndef __has_builtin -#define __has_builtin(x) 0 -#endif - -namespace __cxxabiv1 { - -// -// Helper routines and classes -// - -namespace { - inline static size_t __get_element_count ( void *p ) { - return static_cast <size_t *> (p)[-1]; - } - - inline static void __set_element_count ( void *p, size_t element_count ) { - static_cast <size_t *> (p)[-1] = element_count; - } - - -// A pair of classes to simplify exception handling and control flow. -// They get passed a block of memory in the constructor, and unless the -// 'release' method is called, they deallocate the memory in the destructor. -// Preferred usage is to allocate some memory, attach it to one of these objects, -// and then, when all the operations to set up the memory block have succeeded, -// call 'release'. If any of the setup operations fail, or an exception is -// thrown, then the block is automatically deallocated. -// -// The only difference between these two classes is the signature for the -// deallocation function (to match new2/new3 and delete2/delete3. - class st_heap_block2 { - public: - typedef void (*dealloc_f)(void *); - - st_heap_block2 ( dealloc_f dealloc, void *ptr ) - : dealloc_ ( dealloc ), ptr_ ( ptr ), enabled_ ( true ) {} - ~st_heap_block2 () { if ( enabled_ ) dealloc_ ( ptr_ ) ; } - void release () { enabled_ = false; } - - private: - dealloc_f dealloc_; - void *ptr_; - bool enabled_; - }; - - class st_heap_block3 { - public: - typedef void (*dealloc_f)(void *, size_t); - - st_heap_block3 ( dealloc_f dealloc, void *ptr, size_t size ) - : dealloc_ ( dealloc ), ptr_ ( ptr ), size_ ( size ), enabled_ ( true ) {} - ~st_heap_block3 () { if ( enabled_ ) dealloc_ ( ptr_, size_ ) ; } - void release () { enabled_ = false; } - - private: - dealloc_f dealloc_; - void *ptr_; - size_t size_; - bool enabled_; - }; - - class st_cxa_cleanup { - public: - typedef void (*destruct_f)(void *); - - st_cxa_cleanup ( void *ptr, size_t &idx, size_t element_size, destruct_f destructor ) - : ptr_ ( ptr ), idx_ ( idx ), element_size_ ( element_size ), - destructor_ ( destructor ), enabled_ ( true ) {} - ~st_cxa_cleanup () { - if ( enabled_ ) - __cxa_vec_cleanup ( ptr_, idx_, element_size_, destructor_ ); - } - - void release () { enabled_ = false; } - - private: - void *ptr_; - size_t &idx_; - size_t element_size_; - destruct_f destructor_; - bool enabled_; - }; - - class st_terminate { - public: - st_terminate ( bool enabled = true ) : enabled_ ( enabled ) {} - ~st_terminate () { if ( enabled_ ) std::terminate (); } - void release () { enabled_ = false; } - private: - bool enabled_ ; - }; -} - -// -// Externally visible routines -// - -namespace { -_LIBCXXABI_NORETURN -void throw_bad_array_new_length() { -#ifndef _LIBCXXABI_NO_EXCEPTIONS - throw std::bad_array_new_length(); -#else - abort_message("__cxa_vec_new failed to allocate memory"); -#endif -} - -bool mul_overflow(size_t x, size_t y, size_t *res) { -#if (defined(_LIBCXXABI_COMPILER_CLANG) && __has_builtin(__builtin_mul_overflow)) \ - || defined(_LIBCXXABI_COMPILER_GCC) - return __builtin_mul_overflow(x, y, res); -#else - *res = x * y; - return x && ((*res / x) != y); -#endif -} - -bool add_overflow(size_t x, size_t y, size_t *res) { -#if (defined(_LIBCXXABI_COMPILER_CLANG) && __has_builtin(__builtin_add_overflow)) \ - || defined(_LIBCXXABI_COMPILER_GCC) - return __builtin_add_overflow(x, y, res); -#else - *res = x + y; - return *res < y; -#endif -} - -size_t calculate_allocation_size_or_throw(size_t element_count, - size_t element_size, - size_t padding_size) { - size_t element_heap_size; - if (mul_overflow(element_count, element_size, &element_heap_size)) - throw_bad_array_new_length(); - - size_t allocation_size; - if (add_overflow(element_heap_size, padding_size, &allocation_size)) - throw_bad_array_new_length(); - - return allocation_size; -} - -} // namespace - -extern "C" { - -// Equivalent to -// -// __cxa_vec_new2(element_count, element_size, padding_size, constructor, -// destructor, &::operator new[], &::operator delete[]) -_LIBCXXABI_FUNC_VIS void * -__cxa_vec_new(size_t element_count, size_t element_size, size_t padding_size, - void (*constructor)(void *), void (*destructor)(void *)) { - return __cxa_vec_new2 ( element_count, element_size, padding_size, - constructor, destructor, &::operator new [], &::operator delete [] ); -} - - -// Given the number and size of elements for an array and the non-negative -// size of prefix padding for a cookie, allocate space (using alloc) for -// the array preceded by the specified padding, initialize the cookie if -// the padding is non-zero, and call the given constructor on each element. -// Return the address of the array proper, after the padding. -// -// If alloc throws an exception, rethrow the exception. If alloc returns -// NULL, return NULL. If the constructor throws an exception, call -// destructor for any already constructed elements, and rethrow the -// exception. If the destructor throws an exception, call std::terminate. -// -// The constructor may be NULL, in which case it must not be called. If the -// padding_size is zero, the destructor may be NULL; in that case it must -// not be called. -// -// Neither alloc nor dealloc may be NULL. -_LIBCXXABI_FUNC_VIS void * -__cxa_vec_new2(size_t element_count, size_t element_size, size_t padding_size, - void (*constructor)(void *), void (*destructor)(void *), - void *(*alloc)(size_t), void (*dealloc)(void *)) { - const size_t heap_size = calculate_allocation_size_or_throw( - element_count, element_size, padding_size); - char* const heap_block = static_cast<char*>(alloc(heap_size)); - char* vec_base = heap_block; - - if (NULL != vec_base) { - st_heap_block2 heap(dealloc, heap_block); - - // put the padding before the array elements - if ( 0 != padding_size ) { - vec_base += padding_size; - __set_element_count ( vec_base, element_count ); - } - - // Construct the elements - __cxa_vec_ctor ( vec_base, element_count, element_size, constructor, destructor ); - heap.release (); // We're good! - } - - return vec_base; -} - - -// Same as __cxa_vec_new2 except that the deallocation function takes both -// the object address and its size. -_LIBCXXABI_FUNC_VIS void * -__cxa_vec_new3(size_t element_count, size_t element_size, size_t padding_size, - void (*constructor)(void *), void (*destructor)(void *), - void *(*alloc)(size_t), void (*dealloc)(void *, size_t)) { - const size_t heap_size = calculate_allocation_size_or_throw( - element_count, element_size, padding_size); - char* const heap_block = static_cast<char*>(alloc(heap_size)); - char* vec_base = heap_block; - - if (NULL != vec_base) { - st_heap_block3 heap(dealloc, heap_block, heap_size); - - // put the padding before the array elements - if ( 0 != padding_size ) { - vec_base += padding_size; - __set_element_count ( vec_base, element_count ); - } - - // Construct the elements - __cxa_vec_ctor ( vec_base, element_count, element_size, constructor, destructor ); - heap.release (); // We're good! - } - - return vec_base; -} - - -// Given the (data) addresses of a destination and a source array, an -// element count and an element size, call the given copy constructor to -// copy each element from the source array to the destination array. The -// copy constructor's arguments are the destination address and source -// address, respectively. If an exception occurs, call the given destructor -// (if non-NULL) on each copied element and rethrow. If the destructor -// throws an exception, call terminate(). The constructor and or destructor -// pointers may be NULL. If either is NULL, no action is taken when it -// would have been called. - -_LIBCXXABI_FUNC_VIS void __cxa_vec_cctor(void *dest_array, void *src_array, - size_t element_count, - size_t element_size, - void (*constructor)(void *, void *), - void (*destructor)(void *)) { - if ( NULL != constructor ) { - size_t idx = 0; - char *src_ptr = static_cast<char *>(src_array); - char *dest_ptr = static_cast<char *>(dest_array); - st_cxa_cleanup cleanup ( dest_array, idx, element_size, destructor ); - - for ( idx = 0; idx < element_count; - ++idx, src_ptr += element_size, dest_ptr += element_size ) - constructor ( dest_ptr, src_ptr ); - cleanup.release (); // We're good! - } -} - - -// Given the (data) address of an array, not including any cookie padding, -// and the number and size of its elements, call the given constructor on -// each element. If the constructor throws an exception, call the given -// destructor for any already-constructed elements, and rethrow the -// exception. If the destructor throws an exception, call terminate(). The -// constructor and/or destructor pointers may be NULL. If either is NULL, -// no action is taken when it would have been called. -_LIBCXXABI_FUNC_VIS void -__cxa_vec_ctor(void *array_address, size_t element_count, size_t element_size, - void (*constructor)(void *), void (*destructor)(void *)) { - if ( NULL != constructor ) { - size_t idx; - char *ptr = static_cast <char *> ( array_address ); - st_cxa_cleanup cleanup ( array_address, idx, element_size, destructor ); - - // Construct the elements - for ( idx = 0; idx < element_count; ++idx, ptr += element_size ) - constructor ( ptr ); - cleanup.release (); // We're good! - } -} - -// Given the (data) address of an array, the number of elements, and the -// size of its elements, call the given destructor on each element. If the -// destructor throws an exception, rethrow after destroying the remaining -// elements if possible. If the destructor throws a second exception, call -// terminate(). The destructor pointer may be NULL, in which case this -// routine does nothing. -_LIBCXXABI_FUNC_VIS void __cxa_vec_dtor(void *array_address, - size_t element_count, - size_t element_size, - void (*destructor)(void *)) { - if ( NULL != destructor ) { - char *ptr = static_cast <char *> (array_address); - size_t idx = element_count; - st_cxa_cleanup cleanup ( array_address, idx, element_size, destructor ); - { - st_terminate exception_guard (__cxa_uncaught_exception ()); - ptr += element_count * element_size; // one past the last element - - while ( idx-- > 0 ) { - ptr -= element_size; - destructor ( ptr ); - } - exception_guard.release (); // We're good ! - } - cleanup.release (); // We're still good! - } -} - -// Given the (data) address of an array, the number of elements, and the -// size of its elements, call the given destructor on each element. If the -// destructor throws an exception, call terminate(). The destructor pointer -// may be NULL, in which case this routine does nothing. -_LIBCXXABI_FUNC_VIS void __cxa_vec_cleanup(void *array_address, - size_t element_count, - size_t element_size, - void (*destructor)(void *)) { - if ( NULL != destructor ) { - char *ptr = static_cast <char *> (array_address); - size_t idx = element_count; - st_terminate exception_guard; - - ptr += element_count * element_size; // one past the last element - while ( idx-- > 0 ) { - ptr -= element_size; - destructor ( ptr ); - } - exception_guard.release (); // We're done! - } -} - - -// If the array_address is NULL, return immediately. Otherwise, given the -// (data) address of an array, the non-negative size of prefix padding for -// the cookie, and the size of its elements, call the given destructor on -// each element, using the cookie to determine the number of elements, and -// then delete the space by calling ::operator delete[](void *). If the -// destructor throws an exception, rethrow after (a) destroying the -// remaining elements, and (b) deallocating the storage. If the destructor -// throws a second exception, call terminate(). If padding_size is 0, the -// destructor pointer must be NULL. If the destructor pointer is NULL, no -// destructor call is to be made. -// -// The intent of this function is to permit an implementation to call this -// function when confronted with an expression of the form delete[] p in -// the source code, provided that the default deallocation function can be -// used. Therefore, the semantics of this function are consistent with -// those required by the standard. The requirement that the deallocation -// function be called even if the destructor throws an exception derives -// from the resolution to DR 353 to the C++ standard, which was adopted in -// April, 2003. -_LIBCXXABI_FUNC_VIS void __cxa_vec_delete(void *array_address, - size_t element_size, - size_t padding_size, - void (*destructor)(void *)) { - __cxa_vec_delete2 ( array_address, element_size, padding_size, - destructor, &::operator delete [] ); -} - -// Same as __cxa_vec_delete, except that the given function is used for -// deallocation instead of the default delete function. If dealloc throws -// an exception, the result is undefined. The dealloc pointer may not be -// NULL. -_LIBCXXABI_FUNC_VIS void -__cxa_vec_delete2(void *array_address, size_t element_size, size_t padding_size, - void (*destructor)(void *), void (*dealloc)(void *)) { - if ( NULL != array_address ) { - char *vec_base = static_cast <char *> (array_address); - char *heap_block = vec_base - padding_size; - st_heap_block2 heap ( dealloc, heap_block ); - - if ( 0 != padding_size && NULL != destructor ) // call the destructors - __cxa_vec_dtor ( array_address, __get_element_count ( vec_base ), - element_size, destructor ); - } -} - - -// Same as __cxa_vec_delete, except that the given function is used for -// deallocation instead of the default delete function. The deallocation -// function takes both the object address and its size. If dealloc throws -// an exception, the result is undefined. The dealloc pointer may not be -// NULL. -_LIBCXXABI_FUNC_VIS void -__cxa_vec_delete3(void *array_address, size_t element_size, size_t padding_size, - void (*destructor)(void *), void (*dealloc)(void *, size_t)) { - if ( NULL != array_address ) { - char *vec_base = static_cast <char *> (array_address); - char *heap_block = vec_base - padding_size; - const size_t element_count = padding_size ? __get_element_count ( vec_base ) : 0; - const size_t heap_block_size = element_size * element_count + padding_size; - st_heap_block3 heap ( dealloc, heap_block, heap_block_size ); - - if ( 0 != padding_size && NULL != destructor ) // call the destructors - __cxa_vec_dtor ( array_address, element_count, element_size, destructor ); - } -} - - -} // extern "C" - -} // abi +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// +// This file implements the "Array Construction and Destruction APIs" +// https://itanium-cxx-abi.github.io/cxx-abi/abi.html#array-ctor +// +//===----------------------------------------------------------------------===// + +#include "cxxabi.h" +#include "__cxxabi_config.h" + +#include <exception> // for std::terminate +#include <new> // for std::bad_array_new_length + +#include "abort_message.h" + +#ifndef __has_builtin +#define __has_builtin(x) 0 +#endif + +namespace __cxxabiv1 { + +// +// Helper routines and classes +// + +namespace { + inline static size_t __get_element_count ( void *p ) { + return static_cast <size_t *> (p)[-1]; + } + + inline static void __set_element_count ( void *p, size_t element_count ) { + static_cast <size_t *> (p)[-1] = element_count; + } + + +// A pair of classes to simplify exception handling and control flow. +// They get passed a block of memory in the constructor, and unless the +// 'release' method is called, they deallocate the memory in the destructor. +// Preferred usage is to allocate some memory, attach it to one of these objects, +// and then, when all the operations to set up the memory block have succeeded, +// call 'release'. If any of the setup operations fail, or an exception is +// thrown, then the block is automatically deallocated. +// +// The only difference between these two classes is the signature for the +// deallocation function (to match new2/new3 and delete2/delete3. + class st_heap_block2 { + public: + typedef void (*dealloc_f)(void *); + + st_heap_block2 ( dealloc_f dealloc, void *ptr ) + : dealloc_ ( dealloc ), ptr_ ( ptr ), enabled_ ( true ) {} + ~st_heap_block2 () { if ( enabled_ ) dealloc_ ( ptr_ ) ; } + void release () { enabled_ = false; } + + private: + dealloc_f dealloc_; + void *ptr_; + bool enabled_; + }; + + class st_heap_block3 { + public: + typedef void (*dealloc_f)(void *, size_t); + + st_heap_block3 ( dealloc_f dealloc, void *ptr, size_t size ) + : dealloc_ ( dealloc ), ptr_ ( ptr ), size_ ( size ), enabled_ ( true ) {} + ~st_heap_block3 () { if ( enabled_ ) dealloc_ ( ptr_, size_ ) ; } + void release () { enabled_ = false; } + + private: + dealloc_f dealloc_; + void *ptr_; + size_t size_; + bool enabled_; + }; + + class st_cxa_cleanup { + public: + typedef void (*destruct_f)(void *); + + st_cxa_cleanup ( void *ptr, size_t &idx, size_t element_size, destruct_f destructor ) + : ptr_ ( ptr ), idx_ ( idx ), element_size_ ( element_size ), + destructor_ ( destructor ), enabled_ ( true ) {} + ~st_cxa_cleanup () { + if ( enabled_ ) + __cxa_vec_cleanup ( ptr_, idx_, element_size_, destructor_ ); + } + + void release () { enabled_ = false; } + + private: + void *ptr_; + size_t &idx_; + size_t element_size_; + destruct_f destructor_; + bool enabled_; + }; + + class st_terminate { + public: + st_terminate ( bool enabled = true ) : enabled_ ( enabled ) {} + ~st_terminate () { if ( enabled_ ) std::terminate (); } + void release () { enabled_ = false; } + private: + bool enabled_ ; + }; +} + +// +// Externally visible routines +// + +namespace { +_LIBCXXABI_NORETURN +void throw_bad_array_new_length() { +#ifndef _LIBCXXABI_NO_EXCEPTIONS + throw std::bad_array_new_length(); +#else + abort_message("__cxa_vec_new failed to allocate memory"); +#endif +} + +bool mul_overflow(size_t x, size_t y, size_t *res) { +#if (defined(_LIBCXXABI_COMPILER_CLANG) && __has_builtin(__builtin_mul_overflow)) \ + || defined(_LIBCXXABI_COMPILER_GCC) + return __builtin_mul_overflow(x, y, res); +#else + *res = x * y; + return x && ((*res / x) != y); +#endif +} + +bool add_overflow(size_t x, size_t y, size_t *res) { +#if (defined(_LIBCXXABI_COMPILER_CLANG) && __has_builtin(__builtin_add_overflow)) \ + || defined(_LIBCXXABI_COMPILER_GCC) + return __builtin_add_overflow(x, y, res); +#else + *res = x + y; + return *res < y; +#endif +} + +size_t calculate_allocation_size_or_throw(size_t element_count, + size_t element_size, + size_t padding_size) { + size_t element_heap_size; + if (mul_overflow(element_count, element_size, &element_heap_size)) + throw_bad_array_new_length(); + + size_t allocation_size; + if (add_overflow(element_heap_size, padding_size, &allocation_size)) + throw_bad_array_new_length(); + + return allocation_size; +} + +} // namespace + +extern "C" { + +// Equivalent to +// +// __cxa_vec_new2(element_count, element_size, padding_size, constructor, +// destructor, &::operator new[], &::operator delete[]) +_LIBCXXABI_FUNC_VIS void * +__cxa_vec_new(size_t element_count, size_t element_size, size_t padding_size, + void (*constructor)(void *), void (*destructor)(void *)) { + return __cxa_vec_new2 ( element_count, element_size, padding_size, + constructor, destructor, &::operator new [], &::operator delete [] ); +} + + +// Given the number and size of elements for an array and the non-negative +// size of prefix padding for a cookie, allocate space (using alloc) for +// the array preceded by the specified padding, initialize the cookie if +// the padding is non-zero, and call the given constructor on each element. +// Return the address of the array proper, after the padding. +// +// If alloc throws an exception, rethrow the exception. If alloc returns +// NULL, return NULL. If the constructor throws an exception, call +// destructor for any already constructed elements, and rethrow the +// exception. If the destructor throws an exception, call std::terminate. +// +// The constructor may be NULL, in which case it must not be called. If the +// padding_size is zero, the destructor may be NULL; in that case it must +// not be called. +// +// Neither alloc nor dealloc may be NULL. +_LIBCXXABI_FUNC_VIS void * +__cxa_vec_new2(size_t element_count, size_t element_size, size_t padding_size, + void (*constructor)(void *), void (*destructor)(void *), + void *(*alloc)(size_t), void (*dealloc)(void *)) { + const size_t heap_size = calculate_allocation_size_or_throw( + element_count, element_size, padding_size); + char* const heap_block = static_cast<char*>(alloc(heap_size)); + char* vec_base = heap_block; + + if (NULL != vec_base) { + st_heap_block2 heap(dealloc, heap_block); + + // put the padding before the array elements + if ( 0 != padding_size ) { + vec_base += padding_size; + __set_element_count ( vec_base, element_count ); + } + + // Construct the elements + __cxa_vec_ctor ( vec_base, element_count, element_size, constructor, destructor ); + heap.release (); // We're good! + } + + return vec_base; +} + + +// Same as __cxa_vec_new2 except that the deallocation function takes both +// the object address and its size. +_LIBCXXABI_FUNC_VIS void * +__cxa_vec_new3(size_t element_count, size_t element_size, size_t padding_size, + void (*constructor)(void *), void (*destructor)(void *), + void *(*alloc)(size_t), void (*dealloc)(void *, size_t)) { + const size_t heap_size = calculate_allocation_size_or_throw( + element_count, element_size, padding_size); + char* const heap_block = static_cast<char*>(alloc(heap_size)); + char* vec_base = heap_block; + + if (NULL != vec_base) { + st_heap_block3 heap(dealloc, heap_block, heap_size); + + // put the padding before the array elements + if ( 0 != padding_size ) { + vec_base += padding_size; + __set_element_count ( vec_base, element_count ); + } + + // Construct the elements + __cxa_vec_ctor ( vec_base, element_count, element_size, constructor, destructor ); + heap.release (); // We're good! + } + + return vec_base; +} + + +// Given the (data) addresses of a destination and a source array, an +// element count and an element size, call the given copy constructor to +// copy each element from the source array to the destination array. The +// copy constructor's arguments are the destination address and source +// address, respectively. If an exception occurs, call the given destructor +// (if non-NULL) on each copied element and rethrow. If the destructor +// throws an exception, call terminate(). The constructor and or destructor +// pointers may be NULL. If either is NULL, no action is taken when it +// would have been called. + +_LIBCXXABI_FUNC_VIS void __cxa_vec_cctor(void *dest_array, void *src_array, + size_t element_count, + size_t element_size, + void (*constructor)(void *, void *), + void (*destructor)(void *)) { + if ( NULL != constructor ) { + size_t idx = 0; + char *src_ptr = static_cast<char *>(src_array); + char *dest_ptr = static_cast<char *>(dest_array); + st_cxa_cleanup cleanup ( dest_array, idx, element_size, destructor ); + + for ( idx = 0; idx < element_count; + ++idx, src_ptr += element_size, dest_ptr += element_size ) + constructor ( dest_ptr, src_ptr ); + cleanup.release (); // We're good! + } +} + + +// Given the (data) address of an array, not including any cookie padding, +// and the number and size of its elements, call the given constructor on +// each element. If the constructor throws an exception, call the given +// destructor for any already-constructed elements, and rethrow the +// exception. If the destructor throws an exception, call terminate(). The +// constructor and/or destructor pointers may be NULL. If either is NULL, +// no action is taken when it would have been called. +_LIBCXXABI_FUNC_VIS void +__cxa_vec_ctor(void *array_address, size_t element_count, size_t element_size, + void (*constructor)(void *), void (*destructor)(void *)) { + if ( NULL != constructor ) { + size_t idx; + char *ptr = static_cast <char *> ( array_address ); + st_cxa_cleanup cleanup ( array_address, idx, element_size, destructor ); + + // Construct the elements + for ( idx = 0; idx < element_count; ++idx, ptr += element_size ) + constructor ( ptr ); + cleanup.release (); // We're good! + } +} + +// Given the (data) address of an array, the number of elements, and the +// size of its elements, call the given destructor on each element. If the +// destructor throws an exception, rethrow after destroying the remaining +// elements if possible. If the destructor throws a second exception, call +// terminate(). The destructor pointer may be NULL, in which case this +// routine does nothing. +_LIBCXXABI_FUNC_VIS void __cxa_vec_dtor(void *array_address, + size_t element_count, + size_t element_size, + void (*destructor)(void *)) { + if ( NULL != destructor ) { + char *ptr = static_cast <char *> (array_address); + size_t idx = element_count; + st_cxa_cleanup cleanup ( array_address, idx, element_size, destructor ); + { + st_terminate exception_guard (__cxa_uncaught_exception ()); + ptr += element_count * element_size; // one past the last element + + while ( idx-- > 0 ) { + ptr -= element_size; + destructor ( ptr ); + } + exception_guard.release (); // We're good ! + } + cleanup.release (); // We're still good! + } +} + +// Given the (data) address of an array, the number of elements, and the +// size of its elements, call the given destructor on each element. If the +// destructor throws an exception, call terminate(). The destructor pointer +// may be NULL, in which case this routine does nothing. +_LIBCXXABI_FUNC_VIS void __cxa_vec_cleanup(void *array_address, + size_t element_count, + size_t element_size, + void (*destructor)(void *)) { + if ( NULL != destructor ) { + char *ptr = static_cast <char *> (array_address); + size_t idx = element_count; + st_terminate exception_guard; + + ptr += element_count * element_size; // one past the last element + while ( idx-- > 0 ) { + ptr -= element_size; + destructor ( ptr ); + } + exception_guard.release (); // We're done! + } +} + + +// If the array_address is NULL, return immediately. Otherwise, given the +// (data) address of an array, the non-negative size of prefix padding for +// the cookie, and the size of its elements, call the given destructor on +// each element, using the cookie to determine the number of elements, and +// then delete the space by calling ::operator delete[](void *). If the +// destructor throws an exception, rethrow after (a) destroying the +// remaining elements, and (b) deallocating the storage. If the destructor +// throws a second exception, call terminate(). If padding_size is 0, the +// destructor pointer must be NULL. If the destructor pointer is NULL, no +// destructor call is to be made. +// +// The intent of this function is to permit an implementation to call this +// function when confronted with an expression of the form delete[] p in +// the source code, provided that the default deallocation function can be +// used. Therefore, the semantics of this function are consistent with +// those required by the standard. The requirement that the deallocation +// function be called even if the destructor throws an exception derives +// from the resolution to DR 353 to the C++ standard, which was adopted in +// April, 2003. +_LIBCXXABI_FUNC_VIS void __cxa_vec_delete(void *array_address, + size_t element_size, + size_t padding_size, + void (*destructor)(void *)) { + __cxa_vec_delete2 ( array_address, element_size, padding_size, + destructor, &::operator delete [] ); +} + +// Same as __cxa_vec_delete, except that the given function is used for +// deallocation instead of the default delete function. If dealloc throws +// an exception, the result is undefined. The dealloc pointer may not be +// NULL. +_LIBCXXABI_FUNC_VIS void +__cxa_vec_delete2(void *array_address, size_t element_size, size_t padding_size, + void (*destructor)(void *), void (*dealloc)(void *)) { + if ( NULL != array_address ) { + char *vec_base = static_cast <char *> (array_address); + char *heap_block = vec_base - padding_size; + st_heap_block2 heap ( dealloc, heap_block ); + + if ( 0 != padding_size && NULL != destructor ) // call the destructors + __cxa_vec_dtor ( array_address, __get_element_count ( vec_base ), + element_size, destructor ); + } +} + + +// Same as __cxa_vec_delete, except that the given function is used for +// deallocation instead of the default delete function. The deallocation +// function takes both the object address and its size. If dealloc throws +// an exception, the result is undefined. The dealloc pointer may not be +// NULL. +_LIBCXXABI_FUNC_VIS void +__cxa_vec_delete3(void *array_address, size_t element_size, size_t padding_size, + void (*destructor)(void *), void (*dealloc)(void *, size_t)) { + if ( NULL != array_address ) { + char *vec_base = static_cast <char *> (array_address); + char *heap_block = vec_base - padding_size; + const size_t element_count = padding_size ? __get_element_count ( vec_base ) : 0; + const size_t heap_block_size = element_size * element_count + padding_size; + st_heap_block3 heap ( dealloc, heap_block, heap_block_size ); + + if ( 0 != padding_size && NULL != destructor ) // call the destructors + __cxa_vec_dtor ( array_address, element_count, element_size, destructor ); + } +} + + +} // extern "C" + +} // abi diff --git a/contrib/libs/cxxsupp/libcxxabi/src/cxa_virtual.cpp b/contrib/libs/cxxsupp/libcxxabi/src/cxa_virtual.cpp index c868672e00..ecd2645bfd 100644 --- a/contrib/libs/cxxsupp/libcxxabi/src/cxa_virtual.cpp +++ b/contrib/libs/cxxsupp/libcxxabi/src/cxa_virtual.cpp @@ -1,24 +1,24 @@ //===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#include "cxxabi.h" -#include "abort_message.h" - -namespace __cxxabiv1 { -extern "C" { -_LIBCXXABI_FUNC_VIS _LIBCXXABI_NORETURN -void __cxa_pure_virtual(void) { - abort_message("Pure virtual function called!"); -} - -_LIBCXXABI_FUNC_VIS _LIBCXXABI_NORETURN -void __cxa_deleted_virtual(void) { - abort_message("Deleted virtual function called!"); -} -} // extern "C" -} // abi +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "cxxabi.h" +#include "abort_message.h" + +namespace __cxxabiv1 { +extern "C" { +_LIBCXXABI_FUNC_VIS _LIBCXXABI_NORETURN +void __cxa_pure_virtual(void) { + abort_message("Pure virtual function called!"); +} + +_LIBCXXABI_FUNC_VIS _LIBCXXABI_NORETURN +void __cxa_deleted_virtual(void) { + abort_message("Deleted virtual function called!"); +} +} // extern "C" +} // abi diff --git a/contrib/libs/cxxsupp/libcxxabi/src/demangle/DemangleConfig.h b/contrib/libs/cxxsupp/libcxxabi/src/demangle/DemangleConfig.h index 9d818535b0..5897cbf2ff 100644 --- a/contrib/libs/cxxsupp/libcxxabi/src/demangle/DemangleConfig.h +++ b/contrib/libs/cxxsupp/libcxxabi/src/demangle/DemangleConfig.h @@ -1,97 +1,97 @@ -//===--- DemangleConfig.h --------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// This file is contains a subset of macros copied from -// llvm/include/llvm/Demangle/DemangleConfig.h -//===----------------------------------------------------------------------===// - -#ifndef LIBCXXABI_DEMANGLE_DEMANGLE_CONFIG_H -#define LIBCXXABI_DEMANGLE_DEMANGLE_CONFIG_H - -#include <ciso646> - -#ifdef _MSC_VER -// snprintf is implemented in VS 2015 -#if _MSC_VER < 1900 -#define snprintf _snprintf_s -#endif -#endif - -#ifndef __has_feature -#define __has_feature(x) 0 -#endif - -#ifndef __has_cpp_attribute -#define __has_cpp_attribute(x) 0 -#endif - -#ifndef __has_attribute -#define __has_attribute(x) 0 -#endif - -#ifndef __has_builtin -#define __has_builtin(x) 0 -#endif - -#ifndef DEMANGLE_GNUC_PREREQ -#if defined(__GNUC__) && defined(__GNUC_MINOR__) && defined(__GNUC_PATCHLEVEL__) -#define DEMANGLE_GNUC_PREREQ(maj, min, patch) \ - ((__GNUC__ << 20) + (__GNUC_MINOR__ << 10) + __GNUC_PATCHLEVEL__ >= \ - ((maj) << 20) + ((min) << 10) + (patch)) -#elif defined(__GNUC__) && defined(__GNUC_MINOR__) -#define DEMANGLE_GNUC_PREREQ(maj, min, patch) \ - ((__GNUC__ << 20) + (__GNUC_MINOR__ << 10) >= ((maj) << 20) + ((min) << 10)) -#else -#define DEMANGLE_GNUC_PREREQ(maj, min, patch) 0 -#endif -#endif - -#if __has_attribute(used) || DEMANGLE_GNUC_PREREQ(3, 1, 0) -#define DEMANGLE_ATTRIBUTE_USED __attribute__((__used__)) -#else -#define DEMANGLE_ATTRIBUTE_USED -#endif - -#if __has_builtin(__builtin_unreachable) || DEMANGLE_GNUC_PREREQ(4, 5, 0) -#define DEMANGLE_UNREACHABLE __builtin_unreachable() -#elif defined(_MSC_VER) -#define DEMANGLE_UNREACHABLE __assume(false) -#else -#define DEMANGLE_UNREACHABLE -#endif - -#if __has_attribute(noinline) || DEMANGLE_GNUC_PREREQ(3, 4, 0) -#define DEMANGLE_ATTRIBUTE_NOINLINE __attribute__((noinline)) -#elif defined(_MSC_VER) -#define DEMANGLE_ATTRIBUTE_NOINLINE __declspec(noinline) -#else -#define DEMANGLE_ATTRIBUTE_NOINLINE -#endif - -#if !defined(NDEBUG) -#define DEMANGLE_DUMP_METHOD DEMANGLE_ATTRIBUTE_NOINLINE DEMANGLE_ATTRIBUTE_USED -#else -#define DEMANGLE_DUMP_METHOD DEMANGLE_ATTRIBUTE_NOINLINE -#endif - -#if __cplusplus > 201402L && __has_cpp_attribute(fallthrough) -#define DEMANGLE_FALLTHROUGH [[fallthrough]] -#elif __has_cpp_attribute(gnu::fallthrough) -#define DEMANGLE_FALLTHROUGH [[gnu::fallthrough]] -#elif !__cplusplus -// Workaround for llvm.org/PR23435, since clang 3.6 and below emit a spurious -// error when __has_cpp_attribute is given a scoped attribute in C mode. -#define DEMANGLE_FALLTHROUGH -#elif __has_cpp_attribute(clang::fallthrough) -#define DEMANGLE_FALLTHROUGH [[clang::fallthrough]] -#else -#define DEMANGLE_FALLTHROUGH -#endif - -#define DEMANGLE_NAMESPACE_BEGIN namespace { namespace itanium_demangle { -#define DEMANGLE_NAMESPACE_END } } - -#endif // LIBCXXABI_DEMANGLE_DEMANGLE_CONFIG_H +//===--- DemangleConfig.h --------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// This file is contains a subset of macros copied from +// llvm/include/llvm/Demangle/DemangleConfig.h +//===----------------------------------------------------------------------===// + +#ifndef LIBCXXABI_DEMANGLE_DEMANGLE_CONFIG_H +#define LIBCXXABI_DEMANGLE_DEMANGLE_CONFIG_H + +#include <ciso646> + +#ifdef _MSC_VER +// snprintf is implemented in VS 2015 +#if _MSC_VER < 1900 +#define snprintf _snprintf_s +#endif +#endif + +#ifndef __has_feature +#define __has_feature(x) 0 +#endif + +#ifndef __has_cpp_attribute +#define __has_cpp_attribute(x) 0 +#endif + +#ifndef __has_attribute +#define __has_attribute(x) 0 +#endif + +#ifndef __has_builtin +#define __has_builtin(x) 0 +#endif + +#ifndef DEMANGLE_GNUC_PREREQ +#if defined(__GNUC__) && defined(__GNUC_MINOR__) && defined(__GNUC_PATCHLEVEL__) +#define DEMANGLE_GNUC_PREREQ(maj, min, patch) \ + ((__GNUC__ << 20) + (__GNUC_MINOR__ << 10) + __GNUC_PATCHLEVEL__ >= \ + ((maj) << 20) + ((min) << 10) + (patch)) +#elif defined(__GNUC__) && defined(__GNUC_MINOR__) +#define DEMANGLE_GNUC_PREREQ(maj, min, patch) \ + ((__GNUC__ << 20) + (__GNUC_MINOR__ << 10) >= ((maj) << 20) + ((min) << 10)) +#else +#define DEMANGLE_GNUC_PREREQ(maj, min, patch) 0 +#endif +#endif + +#if __has_attribute(used) || DEMANGLE_GNUC_PREREQ(3, 1, 0) +#define DEMANGLE_ATTRIBUTE_USED __attribute__((__used__)) +#else +#define DEMANGLE_ATTRIBUTE_USED +#endif + +#if __has_builtin(__builtin_unreachable) || DEMANGLE_GNUC_PREREQ(4, 5, 0) +#define DEMANGLE_UNREACHABLE __builtin_unreachable() +#elif defined(_MSC_VER) +#define DEMANGLE_UNREACHABLE __assume(false) +#else +#define DEMANGLE_UNREACHABLE +#endif + +#if __has_attribute(noinline) || DEMANGLE_GNUC_PREREQ(3, 4, 0) +#define DEMANGLE_ATTRIBUTE_NOINLINE __attribute__((noinline)) +#elif defined(_MSC_VER) +#define DEMANGLE_ATTRIBUTE_NOINLINE __declspec(noinline) +#else +#define DEMANGLE_ATTRIBUTE_NOINLINE +#endif + +#if !defined(NDEBUG) +#define DEMANGLE_DUMP_METHOD DEMANGLE_ATTRIBUTE_NOINLINE DEMANGLE_ATTRIBUTE_USED +#else +#define DEMANGLE_DUMP_METHOD DEMANGLE_ATTRIBUTE_NOINLINE +#endif + +#if __cplusplus > 201402L && __has_cpp_attribute(fallthrough) +#define DEMANGLE_FALLTHROUGH [[fallthrough]] +#elif __has_cpp_attribute(gnu::fallthrough) +#define DEMANGLE_FALLTHROUGH [[gnu::fallthrough]] +#elif !__cplusplus +// Workaround for llvm.org/PR23435, since clang 3.6 and below emit a spurious +// error when __has_cpp_attribute is given a scoped attribute in C mode. +#define DEMANGLE_FALLTHROUGH +#elif __has_cpp_attribute(clang::fallthrough) +#define DEMANGLE_FALLTHROUGH [[clang::fallthrough]] +#else +#define DEMANGLE_FALLTHROUGH +#endif + +#define DEMANGLE_NAMESPACE_BEGIN namespace { namespace itanium_demangle { +#define DEMANGLE_NAMESPACE_END } } + +#endif // LIBCXXABI_DEMANGLE_DEMANGLE_CONFIG_H diff --git a/contrib/libs/cxxsupp/libcxxabi/src/demangle/ItaniumDemangle.h b/contrib/libs/cxxsupp/libcxxabi/src/demangle/ItaniumDemangle.h index 85e1511346..65e838619c 100644 --- a/contrib/libs/cxxsupp/libcxxabi/src/demangle/ItaniumDemangle.h +++ b/contrib/libs/cxxsupp/libcxxabi/src/demangle/ItaniumDemangle.h @@ -1,115 +1,115 @@ -//===------------------------- ItaniumDemangle.h ----------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// -// -// Generic itanium demangler library. This file has two byte-per-byte identical -// copies in the source tree, one in libcxxabi, and the other in llvm. -// -//===----------------------------------------------------------------------===// - -#ifndef DEMANGLE_ITANIUMDEMANGLE_H -#define DEMANGLE_ITANIUMDEMANGLE_H - -// FIXME: (possibly) incomplete list of features that clang mangles that this -// file does not yet support: -// - C++ modules TS - -#include "DemangleConfig.h" -#include "StringView.h" -#include "Utility.h" -#include <cassert> -#include <cctype> -#include <cstdio> -#include <cstdlib> -#include <cstring> -#include <numeric> -#include <utility> - -#define FOR_EACH_NODE_KIND(X) \ - X(NodeArrayNode) \ - X(DotSuffix) \ - X(VendorExtQualType) \ - X(QualType) \ - X(ConversionOperatorType) \ - X(PostfixQualifiedType) \ - X(ElaboratedTypeSpefType) \ - X(NameType) \ - X(AbiTagAttr) \ - X(EnableIfAttr) \ - X(ObjCProtoName) \ - X(PointerType) \ - X(ReferenceType) \ - X(PointerToMemberType) \ - X(ArrayType) \ - X(FunctionType) \ - X(NoexceptSpec) \ - X(DynamicExceptionSpec) \ - X(FunctionEncoding) \ - X(LiteralOperator) \ - X(SpecialName) \ - X(CtorVtableSpecialName) \ - X(QualifiedName) \ - X(NestedName) \ - X(LocalName) \ - X(VectorType) \ - X(PixelVectorType) \ +//===------------------------- ItaniumDemangle.h ----------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// Generic itanium demangler library. This file has two byte-per-byte identical +// copies in the source tree, one in libcxxabi, and the other in llvm. +// +//===----------------------------------------------------------------------===// + +#ifndef DEMANGLE_ITANIUMDEMANGLE_H +#define DEMANGLE_ITANIUMDEMANGLE_H + +// FIXME: (possibly) incomplete list of features that clang mangles that this +// file does not yet support: +// - C++ modules TS + +#include "DemangleConfig.h" +#include "StringView.h" +#include "Utility.h" +#include <cassert> +#include <cctype> +#include <cstdio> +#include <cstdlib> +#include <cstring> +#include <numeric> +#include <utility> + +#define FOR_EACH_NODE_KIND(X) \ + X(NodeArrayNode) \ + X(DotSuffix) \ + X(VendorExtQualType) \ + X(QualType) \ + X(ConversionOperatorType) \ + X(PostfixQualifiedType) \ + X(ElaboratedTypeSpefType) \ + X(NameType) \ + X(AbiTagAttr) \ + X(EnableIfAttr) \ + X(ObjCProtoName) \ + X(PointerType) \ + X(ReferenceType) \ + X(PointerToMemberType) \ + X(ArrayType) \ + X(FunctionType) \ + X(NoexceptSpec) \ + X(DynamicExceptionSpec) \ + X(FunctionEncoding) \ + X(LiteralOperator) \ + X(SpecialName) \ + X(CtorVtableSpecialName) \ + X(QualifiedName) \ + X(NestedName) \ + X(LocalName) \ + X(VectorType) \ + X(PixelVectorType) \ X(BinaryFPType) \ - X(SyntheticTemplateParamName) \ - X(TypeTemplateParamDecl) \ - X(NonTypeTemplateParamDecl) \ - X(TemplateTemplateParamDecl) \ - X(TemplateParamPackDecl) \ - X(ParameterPack) \ - X(TemplateArgumentPack) \ - X(ParameterPackExpansion) \ - X(TemplateArgs) \ - X(ForwardTemplateReference) \ - X(NameWithTemplateArgs) \ - X(GlobalQualifiedName) \ - X(StdQualifiedName) \ - X(ExpandedSpecialSubstitution) \ - X(SpecialSubstitution) \ - X(CtorDtorName) \ - X(DtorName) \ - X(UnnamedTypeName) \ - X(ClosureTypeName) \ - X(StructuredBindingName) \ - X(BinaryExpr) \ - X(ArraySubscriptExpr) \ - X(PostfixExpr) \ - X(ConditionalExpr) \ - X(MemberExpr) \ - X(SubobjectExpr) \ - X(EnclosingExpr) \ - X(CastExpr) \ - X(SizeofParamPackExpr) \ - X(CallExpr) \ - X(NewExpr) \ - X(DeleteExpr) \ - X(PrefixExpr) \ - X(FunctionParam) \ - X(ConversionExpr) \ - X(PointerToMemberConversionExpr) \ - X(InitListExpr) \ - X(FoldExpr) \ - X(ThrowExpr) \ - X(BoolExpr) \ - X(StringLiteral) \ - X(LambdaExpr) \ - X(EnumLiteral) \ - X(IntegerLiteral) \ - X(FloatLiteral) \ - X(DoubleLiteral) \ - X(LongDoubleLiteral) \ - X(BracedExpr) \ - X(BracedRangeExpr) - -DEMANGLE_NAMESPACE_BEGIN - + X(SyntheticTemplateParamName) \ + X(TypeTemplateParamDecl) \ + X(NonTypeTemplateParamDecl) \ + X(TemplateTemplateParamDecl) \ + X(TemplateParamPackDecl) \ + X(ParameterPack) \ + X(TemplateArgumentPack) \ + X(ParameterPackExpansion) \ + X(TemplateArgs) \ + X(ForwardTemplateReference) \ + X(NameWithTemplateArgs) \ + X(GlobalQualifiedName) \ + X(StdQualifiedName) \ + X(ExpandedSpecialSubstitution) \ + X(SpecialSubstitution) \ + X(CtorDtorName) \ + X(DtorName) \ + X(UnnamedTypeName) \ + X(ClosureTypeName) \ + X(StructuredBindingName) \ + X(BinaryExpr) \ + X(ArraySubscriptExpr) \ + X(PostfixExpr) \ + X(ConditionalExpr) \ + X(MemberExpr) \ + X(SubobjectExpr) \ + X(EnclosingExpr) \ + X(CastExpr) \ + X(SizeofParamPackExpr) \ + X(CallExpr) \ + X(NewExpr) \ + X(DeleteExpr) \ + X(PrefixExpr) \ + X(FunctionParam) \ + X(ConversionExpr) \ + X(PointerToMemberConversionExpr) \ + X(InitListExpr) \ + X(FoldExpr) \ + X(ThrowExpr) \ + X(BoolExpr) \ + X(StringLiteral) \ + X(LambdaExpr) \ + X(EnumLiteral) \ + X(IntegerLiteral) \ + X(FloatLiteral) \ + X(DoubleLiteral) \ + X(LongDoubleLiteral) \ + X(BracedExpr) \ + X(BracedRangeExpr) + +DEMANGLE_NAMESPACE_BEGIN + template <class T, size_t N> class PODSmallVector { static_assert(std::is_pod<T>::value, "T is required to be a plain old data type"); @@ -230,440 +230,440 @@ public: } }; -// Base class of all AST nodes. The AST is built by the parser, then is -// traversed by the printLeft/Right functions to produce a demangled string. -class Node { -public: - enum Kind : unsigned char { -#define ENUMERATOR(NodeKind) K ## NodeKind, - FOR_EACH_NODE_KIND(ENUMERATOR) -#undef ENUMERATOR - }; - - /// Three-way bool to track a cached value. Unknown is possible if this node - /// has an unexpanded parameter pack below it that may affect this cache. - enum class Cache : unsigned char { Yes, No, Unknown, }; - -private: - Kind K; - - // FIXME: Make these protected. -public: - /// Tracks if this node has a component on its right side, in which case we - /// need to call printRight. - Cache RHSComponentCache; - - /// Track if this node is a (possibly qualified) array type. This can affect - /// how we format the output string. - Cache ArrayCache; - - /// Track if this node is a (possibly qualified) function type. This can - /// affect how we format the output string. - Cache FunctionCache; - -public: - Node(Kind K_, Cache RHSComponentCache_ = Cache::No, - Cache ArrayCache_ = Cache::No, Cache FunctionCache_ = Cache::No) - : K(K_), RHSComponentCache(RHSComponentCache_), ArrayCache(ArrayCache_), - FunctionCache(FunctionCache_) {} - - /// Visit the most-derived object corresponding to this object. - template<typename Fn> void visit(Fn F) const; - - // The following function is provided by all derived classes: - // - // Call F with arguments that, when passed to the constructor of this node, - // would construct an equivalent node. - //template<typename Fn> void match(Fn F) const; - +// Base class of all AST nodes. The AST is built by the parser, then is +// traversed by the printLeft/Right functions to produce a demangled string. +class Node { +public: + enum Kind : unsigned char { +#define ENUMERATOR(NodeKind) K ## NodeKind, + FOR_EACH_NODE_KIND(ENUMERATOR) +#undef ENUMERATOR + }; + + /// Three-way bool to track a cached value. Unknown is possible if this node + /// has an unexpanded parameter pack below it that may affect this cache. + enum class Cache : unsigned char { Yes, No, Unknown, }; + +private: + Kind K; + + // FIXME: Make these protected. +public: + /// Tracks if this node has a component on its right side, in which case we + /// need to call printRight. + Cache RHSComponentCache; + + /// Track if this node is a (possibly qualified) array type. This can affect + /// how we format the output string. + Cache ArrayCache; + + /// Track if this node is a (possibly qualified) function type. This can + /// affect how we format the output string. + Cache FunctionCache; + +public: + Node(Kind K_, Cache RHSComponentCache_ = Cache::No, + Cache ArrayCache_ = Cache::No, Cache FunctionCache_ = Cache::No) + : K(K_), RHSComponentCache(RHSComponentCache_), ArrayCache(ArrayCache_), + FunctionCache(FunctionCache_) {} + + /// Visit the most-derived object corresponding to this object. + template<typename Fn> void visit(Fn F) const; + + // The following function is provided by all derived classes: + // + // Call F with arguments that, when passed to the constructor of this node, + // would construct an equivalent node. + //template<typename Fn> void match(Fn F) const; + bool hasRHSComponent(OutputBuffer &OB) const { - if (RHSComponentCache != Cache::Unknown) - return RHSComponentCache == Cache::Yes; + if (RHSComponentCache != Cache::Unknown) + return RHSComponentCache == Cache::Yes; return hasRHSComponentSlow(OB); - } - + } + bool hasArray(OutputBuffer &OB) const { - if (ArrayCache != Cache::Unknown) - return ArrayCache == Cache::Yes; + if (ArrayCache != Cache::Unknown) + return ArrayCache == Cache::Yes; return hasArraySlow(OB); - } - + } + bool hasFunction(OutputBuffer &OB) const { - if (FunctionCache != Cache::Unknown) - return FunctionCache == Cache::Yes; + if (FunctionCache != Cache::Unknown) + return FunctionCache == Cache::Yes; return hasFunctionSlow(OB); - } - - Kind getKind() const { return K; } - + } + + Kind getKind() const { return K; } + virtual bool hasRHSComponentSlow(OutputBuffer &) const { return false; } virtual bool hasArraySlow(OutputBuffer &) const { return false; } virtual bool hasFunctionSlow(OutputBuffer &) const { return false; } - - // Dig through "glue" nodes like ParameterPack and ForwardTemplateReference to - // get at a node that actually represents some concrete syntax. + + // Dig through "glue" nodes like ParameterPack and ForwardTemplateReference to + // get at a node that actually represents some concrete syntax. virtual const Node *getSyntaxNode(OutputBuffer &) const { return this; } - + void print(OutputBuffer &OB) const { printLeft(OB); - if (RHSComponentCache != Cache::No) + if (RHSComponentCache != Cache::No) printRight(OB); - } - + } + // Print the "left" side of this Node into OutputString. virtual void printLeft(OutputBuffer &) const = 0; - - // Print the "right". This distinction is necessary to represent C++ types - // that appear on the RHS of their subtype, such as arrays or functions. - // Since most types don't have such a component, provide a default - // implementation. + + // Print the "right". This distinction is necessary to represent C++ types + // that appear on the RHS of their subtype, such as arrays or functions. + // Since most types don't have such a component, provide a default + // implementation. virtual void printRight(OutputBuffer &) const {} - - virtual StringView getBaseName() const { return StringView(); } - - // Silence compiler warnings, this dtor will never be called. - virtual ~Node() = default; - -#ifndef NDEBUG - DEMANGLE_DUMP_METHOD void dump() const; -#endif -}; - -class NodeArray { - Node **Elements; - size_t NumElements; - -public: - NodeArray() : Elements(nullptr), NumElements(0) {} - NodeArray(Node **Elements_, size_t NumElements_) - : Elements(Elements_), NumElements(NumElements_) {} - - bool empty() const { return NumElements == 0; } - size_t size() const { return NumElements; } - - Node **begin() const { return Elements; } - Node **end() const { return Elements + NumElements; } - - Node *operator[](size_t Idx) const { return Elements[Idx]; } - + + virtual StringView getBaseName() const { return StringView(); } + + // Silence compiler warnings, this dtor will never be called. + virtual ~Node() = default; + +#ifndef NDEBUG + DEMANGLE_DUMP_METHOD void dump() const; +#endif +}; + +class NodeArray { + Node **Elements; + size_t NumElements; + +public: + NodeArray() : Elements(nullptr), NumElements(0) {} + NodeArray(Node **Elements_, size_t NumElements_) + : Elements(Elements_), NumElements(NumElements_) {} + + bool empty() const { return NumElements == 0; } + size_t size() const { return NumElements; } + + Node **begin() const { return Elements; } + Node **end() const { return Elements + NumElements; } + + Node *operator[](size_t Idx) const { return Elements[Idx]; } + void printWithComma(OutputBuffer &OB) const { - bool FirstElement = true; - for (size_t Idx = 0; Idx != NumElements; ++Idx) { + bool FirstElement = true; + for (size_t Idx = 0; Idx != NumElements; ++Idx) { size_t BeforeComma = OB.getCurrentPosition(); - if (!FirstElement) + if (!FirstElement) OB += ", "; size_t AfterComma = OB.getCurrentPosition(); Elements[Idx]->print(OB); - - // Elements[Idx] is an empty parameter pack expansion, we should erase the - // comma we just printed. + + // Elements[Idx] is an empty parameter pack expansion, we should erase the + // comma we just printed. if (AfterComma == OB.getCurrentPosition()) { OB.setCurrentPosition(BeforeComma); - continue; - } - - FirstElement = false; - } - } -}; - -struct NodeArrayNode : Node { - NodeArray Array; - NodeArrayNode(NodeArray Array_) : Node(KNodeArrayNode), Array(Array_) {} - - template<typename Fn> void match(Fn F) const { F(Array); } - + continue; + } + + FirstElement = false; + } + } +}; + +struct NodeArrayNode : Node { + NodeArray Array; + NodeArrayNode(NodeArray Array_) : Node(KNodeArrayNode), Array(Array_) {} + + template<typename Fn> void match(Fn F) const { F(Array); } + void printLeft(OutputBuffer &OB) const override { Array.printWithComma(OB); } -}; - -class DotSuffix final : public Node { - const Node *Prefix; - const StringView Suffix; - -public: - DotSuffix(const Node *Prefix_, StringView Suffix_) - : Node(KDotSuffix), Prefix(Prefix_), Suffix(Suffix_) {} - - template<typename Fn> void match(Fn F) const { F(Prefix, Suffix); } - +}; + +class DotSuffix final : public Node { + const Node *Prefix; + const StringView Suffix; + +public: + DotSuffix(const Node *Prefix_, StringView Suffix_) + : Node(KDotSuffix), Prefix(Prefix_), Suffix(Suffix_) {} + + template<typename Fn> void match(Fn F) const { F(Prefix, Suffix); } + void printLeft(OutputBuffer &OB) const override { Prefix->print(OB); OB += " ("; OB += Suffix; OB += ")"; - } -}; - -class VendorExtQualType final : public Node { - const Node *Ty; - StringView Ext; + } +}; + +class VendorExtQualType final : public Node { + const Node *Ty; + StringView Ext; const Node *TA; - -public: + +public: VendorExtQualType(const Node *Ty_, StringView Ext_, const Node *TA_) : Node(KVendorExtQualType), Ty(Ty_), Ext(Ext_), TA(TA_) {} - + template <typename Fn> void match(Fn F) const { F(Ty, Ext, TA); } - + void printLeft(OutputBuffer &OB) const override { Ty->print(OB); OB += " "; OB += Ext; if (TA != nullptr) TA->print(OB); - } -}; - -enum FunctionRefQual : unsigned char { - FrefQualNone, - FrefQualLValue, - FrefQualRValue, -}; - -enum Qualifiers { - QualNone = 0, - QualConst = 0x1, - QualVolatile = 0x2, - QualRestrict = 0x4, -}; - -inline Qualifiers operator|=(Qualifiers &Q1, Qualifiers Q2) { - return Q1 = static_cast<Qualifiers>(Q1 | Q2); -} - -class QualType final : public Node { -protected: - const Qualifiers Quals; - const Node *Child; - + } +}; + +enum FunctionRefQual : unsigned char { + FrefQualNone, + FrefQualLValue, + FrefQualRValue, +}; + +enum Qualifiers { + QualNone = 0, + QualConst = 0x1, + QualVolatile = 0x2, + QualRestrict = 0x4, +}; + +inline Qualifiers operator|=(Qualifiers &Q1, Qualifiers Q2) { + return Q1 = static_cast<Qualifiers>(Q1 | Q2); +} + +class QualType final : public Node { +protected: + const Qualifiers Quals; + const Node *Child; + void printQuals(OutputBuffer &OB) const { - if (Quals & QualConst) + if (Quals & QualConst) OB += " const"; - if (Quals & QualVolatile) + if (Quals & QualVolatile) OB += " volatile"; - if (Quals & QualRestrict) + if (Quals & QualRestrict) OB += " restrict"; - } - -public: - QualType(const Node *Child_, Qualifiers Quals_) - : Node(KQualType, Child_->RHSComponentCache, - Child_->ArrayCache, Child_->FunctionCache), - Quals(Quals_), Child(Child_) {} - - template<typename Fn> void match(Fn F) const { F(Child, Quals); } - + } + +public: + QualType(const Node *Child_, Qualifiers Quals_) + : Node(KQualType, Child_->RHSComponentCache, + Child_->ArrayCache, Child_->FunctionCache), + Quals(Quals_), Child(Child_) {} + + template<typename Fn> void match(Fn F) const { F(Child, Quals); } + bool hasRHSComponentSlow(OutputBuffer &OB) const override { return Child->hasRHSComponent(OB); - } + } bool hasArraySlow(OutputBuffer &OB) const override { return Child->hasArray(OB); - } + } bool hasFunctionSlow(OutputBuffer &OB) const override { return Child->hasFunction(OB); - } - + } + void printLeft(OutputBuffer &OB) const override { Child->printLeft(OB); printQuals(OB); - } - + } + void printRight(OutputBuffer &OB) const override { Child->printRight(OB); } -}; - -class ConversionOperatorType final : public Node { - const Node *Ty; - -public: - ConversionOperatorType(const Node *Ty_) - : Node(KConversionOperatorType), Ty(Ty_) {} - - template<typename Fn> void match(Fn F) const { F(Ty); } - +}; + +class ConversionOperatorType final : public Node { + const Node *Ty; + +public: + ConversionOperatorType(const Node *Ty_) + : Node(KConversionOperatorType), Ty(Ty_) {} + + template<typename Fn> void match(Fn F) const { F(Ty); } + void printLeft(OutputBuffer &OB) const override { OB += "operator "; Ty->print(OB); - } -}; - -class PostfixQualifiedType final : public Node { - const Node *Ty; - const StringView Postfix; - -public: - PostfixQualifiedType(Node *Ty_, StringView Postfix_) - : Node(KPostfixQualifiedType), Ty(Ty_), Postfix(Postfix_) {} - - template<typename Fn> void match(Fn F) const { F(Ty, Postfix); } - + } +}; + +class PostfixQualifiedType final : public Node { + const Node *Ty; + const StringView Postfix; + +public: + PostfixQualifiedType(Node *Ty_, StringView Postfix_) + : Node(KPostfixQualifiedType), Ty(Ty_), Postfix(Postfix_) {} + + template<typename Fn> void match(Fn F) const { F(Ty, Postfix); } + void printLeft(OutputBuffer &OB) const override { Ty->printLeft(OB); OB += Postfix; - } -}; - -class NameType final : public Node { - const StringView Name; - -public: - NameType(StringView Name_) : Node(KNameType), Name(Name_) {} - - template<typename Fn> void match(Fn F) const { F(Name); } - - StringView getName() const { return Name; } - StringView getBaseName() const override { return Name; } - + } +}; + +class NameType final : public Node { + const StringView Name; + +public: + NameType(StringView Name_) : Node(KNameType), Name(Name_) {} + + template<typename Fn> void match(Fn F) const { F(Name); } + + StringView getName() const { return Name; } + StringView getBaseName() const override { return Name; } + void printLeft(OutputBuffer &OB) const override { OB += Name; } -}; - -class ElaboratedTypeSpefType : public Node { - StringView Kind; - Node *Child; -public: - ElaboratedTypeSpefType(StringView Kind_, Node *Child_) - : Node(KElaboratedTypeSpefType), Kind(Kind_), Child(Child_) {} - - template<typename Fn> void match(Fn F) const { F(Kind, Child); } - +}; + +class ElaboratedTypeSpefType : public Node { + StringView Kind; + Node *Child; +public: + ElaboratedTypeSpefType(StringView Kind_, Node *Child_) + : Node(KElaboratedTypeSpefType), Kind(Kind_), Child(Child_) {} + + template<typename Fn> void match(Fn F) const { F(Kind, Child); } + void printLeft(OutputBuffer &OB) const override { OB += Kind; OB += ' '; Child->print(OB); - } -}; - -struct AbiTagAttr : Node { - Node *Base; - StringView Tag; - - AbiTagAttr(Node* Base_, StringView Tag_) - : Node(KAbiTagAttr, Base_->RHSComponentCache, - Base_->ArrayCache, Base_->FunctionCache), - Base(Base_), Tag(Tag_) {} - - template<typename Fn> void match(Fn F) const { F(Base, Tag); } - + } +}; + +struct AbiTagAttr : Node { + Node *Base; + StringView Tag; + + AbiTagAttr(Node* Base_, StringView Tag_) + : Node(KAbiTagAttr, Base_->RHSComponentCache, + Base_->ArrayCache, Base_->FunctionCache), + Base(Base_), Tag(Tag_) {} + + template<typename Fn> void match(Fn F) const { F(Base, Tag); } + void printLeft(OutputBuffer &OB) const override { Base->printLeft(OB); OB += "[abi:"; OB += Tag; OB += "]"; - } -}; - -class EnableIfAttr : public Node { - NodeArray Conditions; -public: - EnableIfAttr(NodeArray Conditions_) - : Node(KEnableIfAttr), Conditions(Conditions_) {} - - template<typename Fn> void match(Fn F) const { F(Conditions); } - + } +}; + +class EnableIfAttr : public Node { + NodeArray Conditions; +public: + EnableIfAttr(NodeArray Conditions_) + : Node(KEnableIfAttr), Conditions(Conditions_) {} + + template<typename Fn> void match(Fn F) const { F(Conditions); } + void printLeft(OutputBuffer &OB) const override { OB += " [enable_if:"; Conditions.printWithComma(OB); OB += ']'; - } -}; - -class ObjCProtoName : public Node { - const Node *Ty; - StringView Protocol; - - friend class PointerType; - -public: - ObjCProtoName(const Node *Ty_, StringView Protocol_) - : Node(KObjCProtoName), Ty(Ty_), Protocol(Protocol_) {} - - template<typename Fn> void match(Fn F) const { F(Ty, Protocol); } - - bool isObjCObject() const { - return Ty->getKind() == KNameType && - static_cast<const NameType *>(Ty)->getName() == "objc_object"; - } - + } +}; + +class ObjCProtoName : public Node { + const Node *Ty; + StringView Protocol; + + friend class PointerType; + +public: + ObjCProtoName(const Node *Ty_, StringView Protocol_) + : Node(KObjCProtoName), Ty(Ty_), Protocol(Protocol_) {} + + template<typename Fn> void match(Fn F) const { F(Ty, Protocol); } + + bool isObjCObject() const { + return Ty->getKind() == KNameType && + static_cast<const NameType *>(Ty)->getName() == "objc_object"; + } + void printLeft(OutputBuffer &OB) const override { Ty->print(OB); OB += "<"; OB += Protocol; OB += ">"; - } -}; - -class PointerType final : public Node { - const Node *Pointee; - -public: - PointerType(const Node *Pointee_) - : Node(KPointerType, Pointee_->RHSComponentCache), - Pointee(Pointee_) {} - - template<typename Fn> void match(Fn F) const { F(Pointee); } - + } +}; + +class PointerType final : public Node { + const Node *Pointee; + +public: + PointerType(const Node *Pointee_) + : Node(KPointerType, Pointee_->RHSComponentCache), + Pointee(Pointee_) {} + + template<typename Fn> void match(Fn F) const { F(Pointee); } + bool hasRHSComponentSlow(OutputBuffer &OB) const override { return Pointee->hasRHSComponent(OB); - } - + } + void printLeft(OutputBuffer &OB) const override { - // We rewrite objc_object<SomeProtocol>* into id<SomeProtocol>. - if (Pointee->getKind() != KObjCProtoName || - !static_cast<const ObjCProtoName *>(Pointee)->isObjCObject()) { + // We rewrite objc_object<SomeProtocol>* into id<SomeProtocol>. + if (Pointee->getKind() != KObjCProtoName || + !static_cast<const ObjCProtoName *>(Pointee)->isObjCObject()) { Pointee->printLeft(OB); if (Pointee->hasArray(OB)) OB += " "; if (Pointee->hasArray(OB) || Pointee->hasFunction(OB)) OB += "("; OB += "*"; - } else { - const auto *objcProto = static_cast<const ObjCProtoName *>(Pointee); + } else { + const auto *objcProto = static_cast<const ObjCProtoName *>(Pointee); OB += "id<"; OB += objcProto->Protocol; OB += ">"; - } - } - + } + } + void printRight(OutputBuffer &OB) const override { - if (Pointee->getKind() != KObjCProtoName || - !static_cast<const ObjCProtoName *>(Pointee)->isObjCObject()) { + if (Pointee->getKind() != KObjCProtoName || + !static_cast<const ObjCProtoName *>(Pointee)->isObjCObject()) { if (Pointee->hasArray(OB) || Pointee->hasFunction(OB)) OB += ")"; Pointee->printRight(OB); - } - } -}; - -enum class ReferenceKind { - LValue, - RValue, -}; - -// Represents either a LValue or an RValue reference type. -class ReferenceType : public Node { - const Node *Pointee; - ReferenceKind RK; - - mutable bool Printing = false; - - // Dig through any refs to refs, collapsing the ReferenceTypes as we go. The - // rule here is rvalue ref to rvalue ref collapses to a rvalue ref, and any - // other combination collapses to a lvalue ref. + } + } +}; + +enum class ReferenceKind { + LValue, + RValue, +}; + +// Represents either a LValue or an RValue reference type. +class ReferenceType : public Node { + const Node *Pointee; + ReferenceKind RK; + + mutable bool Printing = false; + + // Dig through any refs to refs, collapsing the ReferenceTypes as we go. The + // rule here is rvalue ref to rvalue ref collapses to a rvalue ref, and any + // other combination collapses to a lvalue ref. // // A combination of a TemplateForwardReference and a back-ref Substitution // from an ill-formed string may have created a cycle; use cycle detection to // avoid looping forever. std::pair<ReferenceKind, const Node *> collapse(OutputBuffer &OB) const { - auto SoFar = std::make_pair(RK, Pointee); + auto SoFar = std::make_pair(RK, Pointee); // Track the chain of nodes for the Floyd's 'tortoise and hare' // cycle-detection algorithm, since getSyntaxNode(S) is impure PODSmallVector<const Node *, 8> Prev; - for (;;) { + for (;;) { const Node *SN = SoFar.second->getSyntaxNode(OB); - if (SN->getKind() != KReferenceType) - break; - auto *RT = static_cast<const ReferenceType *>(SN); - SoFar.second = RT->Pointee; - SoFar.first = std::min(SoFar.first, RT->RK); + if (SN->getKind() != KReferenceType) + break; + auto *RT = static_cast<const ReferenceType *>(SN); + SoFar.second = RT->Pointee; + SoFar.first = std::min(SoFar.first, RT->RK); // The middle of Prev is the 'slow' pointer moving at half speed Prev.push_back(SoFar.second); @@ -672,25 +672,25 @@ class ReferenceType : public Node { SoFar.second = nullptr; break; } - } - return SoFar; - } - -public: - ReferenceType(const Node *Pointee_, ReferenceKind RK_) - : Node(KReferenceType, Pointee_->RHSComponentCache), - Pointee(Pointee_), RK(RK_) {} - - template<typename Fn> void match(Fn F) const { F(Pointee, RK); } - + } + return SoFar; + } + +public: + ReferenceType(const Node *Pointee_, ReferenceKind RK_) + : Node(KReferenceType, Pointee_->RHSComponentCache), + Pointee(Pointee_), RK(RK_) {} + + template<typename Fn> void match(Fn F) const { F(Pointee, RK); } + bool hasRHSComponentSlow(OutputBuffer &OB) const override { return Pointee->hasRHSComponent(OB); - } - + } + void printLeft(OutputBuffer &OB) const override { - if (Printing) - return; - SwapAndRestore<bool> SavePrinting(Printing, true); + if (Printing) + return; + SwapAndRestore<bool> SavePrinting(Printing, true); std::pair<ReferenceKind, const Node *> Collapsed = collapse(OB); if (!Collapsed.second) return; @@ -699,378 +699,378 @@ public: OB += " "; if (Collapsed.second->hasArray(OB) || Collapsed.second->hasFunction(OB)) OB += "("; - + OB += (Collapsed.first == ReferenceKind::LValue ? "&" : "&&"); - } + } void printRight(OutputBuffer &OB) const override { - if (Printing) - return; - SwapAndRestore<bool> SavePrinting(Printing, true); + if (Printing) + return; + SwapAndRestore<bool> SavePrinting(Printing, true); std::pair<ReferenceKind, const Node *> Collapsed = collapse(OB); if (!Collapsed.second) return; if (Collapsed.second->hasArray(OB) || Collapsed.second->hasFunction(OB)) OB += ")"; Collapsed.second->printRight(OB); - } -}; - -class PointerToMemberType final : public Node { - const Node *ClassType; - const Node *MemberType; - -public: - PointerToMemberType(const Node *ClassType_, const Node *MemberType_) - : Node(KPointerToMemberType, MemberType_->RHSComponentCache), - ClassType(ClassType_), MemberType(MemberType_) {} - - template<typename Fn> void match(Fn F) const { F(ClassType, MemberType); } - + } +}; + +class PointerToMemberType final : public Node { + const Node *ClassType; + const Node *MemberType; + +public: + PointerToMemberType(const Node *ClassType_, const Node *MemberType_) + : Node(KPointerToMemberType, MemberType_->RHSComponentCache), + ClassType(ClassType_), MemberType(MemberType_) {} + + template<typename Fn> void match(Fn F) const { F(ClassType, MemberType); } + bool hasRHSComponentSlow(OutputBuffer &OB) const override { return MemberType->hasRHSComponent(OB); - } - + } + void printLeft(OutputBuffer &OB) const override { MemberType->printLeft(OB); if (MemberType->hasArray(OB) || MemberType->hasFunction(OB)) OB += "("; - else + else OB += " "; ClassType->print(OB); OB += "::*"; - } - + } + void printRight(OutputBuffer &OB) const override { if (MemberType->hasArray(OB) || MemberType->hasFunction(OB)) OB += ")"; MemberType->printRight(OB); - } -}; - -class ArrayType final : public Node { - const Node *Base; - Node *Dimension; - -public: - ArrayType(const Node *Base_, Node *Dimension_) - : Node(KArrayType, - /*RHSComponentCache=*/Cache::Yes, - /*ArrayCache=*/Cache::Yes), - Base(Base_), Dimension(Dimension_) {} - - template<typename Fn> void match(Fn F) const { F(Base, Dimension); } - + } +}; + +class ArrayType final : public Node { + const Node *Base; + Node *Dimension; + +public: + ArrayType(const Node *Base_, Node *Dimension_) + : Node(KArrayType, + /*RHSComponentCache=*/Cache::Yes, + /*ArrayCache=*/Cache::Yes), + Base(Base_), Dimension(Dimension_) {} + + template<typename Fn> void match(Fn F) const { F(Base, Dimension); } + bool hasRHSComponentSlow(OutputBuffer &) const override { return true; } bool hasArraySlow(OutputBuffer &) const override { return true; } - + void printLeft(OutputBuffer &OB) const override { Base->printLeft(OB); } - + void printRight(OutputBuffer &OB) const override { if (OB.back() != ']') OB += " "; OB += "["; - if (Dimension) + if (Dimension) Dimension->print(OB); OB += "]"; Base->printRight(OB); - } -}; - -class FunctionType final : public Node { - const Node *Ret; - NodeArray Params; - Qualifiers CVQuals; - FunctionRefQual RefQual; - const Node *ExceptionSpec; - -public: - FunctionType(const Node *Ret_, NodeArray Params_, Qualifiers CVQuals_, - FunctionRefQual RefQual_, const Node *ExceptionSpec_) - : Node(KFunctionType, - /*RHSComponentCache=*/Cache::Yes, /*ArrayCache=*/Cache::No, - /*FunctionCache=*/Cache::Yes), - Ret(Ret_), Params(Params_), CVQuals(CVQuals_), RefQual(RefQual_), - ExceptionSpec(ExceptionSpec_) {} - - template<typename Fn> void match(Fn F) const { - F(Ret, Params, CVQuals, RefQual, ExceptionSpec); - } - + } +}; + +class FunctionType final : public Node { + const Node *Ret; + NodeArray Params; + Qualifiers CVQuals; + FunctionRefQual RefQual; + const Node *ExceptionSpec; + +public: + FunctionType(const Node *Ret_, NodeArray Params_, Qualifiers CVQuals_, + FunctionRefQual RefQual_, const Node *ExceptionSpec_) + : Node(KFunctionType, + /*RHSComponentCache=*/Cache::Yes, /*ArrayCache=*/Cache::No, + /*FunctionCache=*/Cache::Yes), + Ret(Ret_), Params(Params_), CVQuals(CVQuals_), RefQual(RefQual_), + ExceptionSpec(ExceptionSpec_) {} + + template<typename Fn> void match(Fn F) const { + F(Ret, Params, CVQuals, RefQual, ExceptionSpec); + } + bool hasRHSComponentSlow(OutputBuffer &) const override { return true; } bool hasFunctionSlow(OutputBuffer &) const override { return true; } - - // Handle C++'s ... quirky decl grammar by using the left & right - // distinction. Consider: - // int (*f(float))(char) {} - // f is a function that takes a float and returns a pointer to a function - // that takes a char and returns an int. If we're trying to print f, start - // by printing out the return types's left, then print our parameters, then - // finally print right of the return type. + + // Handle C++'s ... quirky decl grammar by using the left & right + // distinction. Consider: + // int (*f(float))(char) {} + // f is a function that takes a float and returns a pointer to a function + // that takes a char and returns an int. If we're trying to print f, start + // by printing out the return types's left, then print our parameters, then + // finally print right of the return type. void printLeft(OutputBuffer &OB) const override { Ret->printLeft(OB); OB += " "; - } - + } + void printRight(OutputBuffer &OB) const override { OB += "("; Params.printWithComma(OB); OB += ")"; Ret->printRight(OB); - - if (CVQuals & QualConst) + + if (CVQuals & QualConst) OB += " const"; - if (CVQuals & QualVolatile) + if (CVQuals & QualVolatile) OB += " volatile"; - if (CVQuals & QualRestrict) + if (CVQuals & QualRestrict) OB += " restrict"; - - if (RefQual == FrefQualLValue) + + if (RefQual == FrefQualLValue) OB += " &"; - else if (RefQual == FrefQualRValue) + else if (RefQual == FrefQualRValue) OB += " &&"; - - if (ExceptionSpec != nullptr) { + + if (ExceptionSpec != nullptr) { OB += ' '; ExceptionSpec->print(OB); - } - } -}; - -class NoexceptSpec : public Node { - const Node *E; -public: - NoexceptSpec(const Node *E_) : Node(KNoexceptSpec), E(E_) {} - - template<typename Fn> void match(Fn F) const { F(E); } - + } + } +}; + +class NoexceptSpec : public Node { + const Node *E; +public: + NoexceptSpec(const Node *E_) : Node(KNoexceptSpec), E(E_) {} + + template<typename Fn> void match(Fn F) const { F(E); } + void printLeft(OutputBuffer &OB) const override { OB += "noexcept("; E->print(OB); OB += ")"; - } -}; - -class DynamicExceptionSpec : public Node { - NodeArray Types; -public: - DynamicExceptionSpec(NodeArray Types_) - : Node(KDynamicExceptionSpec), Types(Types_) {} - - template<typename Fn> void match(Fn F) const { F(Types); } - + } +}; + +class DynamicExceptionSpec : public Node { + NodeArray Types; +public: + DynamicExceptionSpec(NodeArray Types_) + : Node(KDynamicExceptionSpec), Types(Types_) {} + + template<typename Fn> void match(Fn F) const { F(Types); } + void printLeft(OutputBuffer &OB) const override { OB += "throw("; Types.printWithComma(OB); OB += ')'; - } -}; - -class FunctionEncoding final : public Node { - const Node *Ret; - const Node *Name; - NodeArray Params; - const Node *Attrs; - Qualifiers CVQuals; - FunctionRefQual RefQual; - -public: - FunctionEncoding(const Node *Ret_, const Node *Name_, NodeArray Params_, - const Node *Attrs_, Qualifiers CVQuals_, - FunctionRefQual RefQual_) - : Node(KFunctionEncoding, - /*RHSComponentCache=*/Cache::Yes, /*ArrayCache=*/Cache::No, - /*FunctionCache=*/Cache::Yes), - Ret(Ret_), Name(Name_), Params(Params_), Attrs(Attrs_), - CVQuals(CVQuals_), RefQual(RefQual_) {} - - template<typename Fn> void match(Fn F) const { - F(Ret, Name, Params, Attrs, CVQuals, RefQual); - } - - Qualifiers getCVQuals() const { return CVQuals; } - FunctionRefQual getRefQual() const { return RefQual; } - NodeArray getParams() const { return Params; } - const Node *getReturnType() const { return Ret; } - + } +}; + +class FunctionEncoding final : public Node { + const Node *Ret; + const Node *Name; + NodeArray Params; + const Node *Attrs; + Qualifiers CVQuals; + FunctionRefQual RefQual; + +public: + FunctionEncoding(const Node *Ret_, const Node *Name_, NodeArray Params_, + const Node *Attrs_, Qualifiers CVQuals_, + FunctionRefQual RefQual_) + : Node(KFunctionEncoding, + /*RHSComponentCache=*/Cache::Yes, /*ArrayCache=*/Cache::No, + /*FunctionCache=*/Cache::Yes), + Ret(Ret_), Name(Name_), Params(Params_), Attrs(Attrs_), + CVQuals(CVQuals_), RefQual(RefQual_) {} + + template<typename Fn> void match(Fn F) const { + F(Ret, Name, Params, Attrs, CVQuals, RefQual); + } + + Qualifiers getCVQuals() const { return CVQuals; } + FunctionRefQual getRefQual() const { return RefQual; } + NodeArray getParams() const { return Params; } + const Node *getReturnType() const { return Ret; } + bool hasRHSComponentSlow(OutputBuffer &) const override { return true; } bool hasFunctionSlow(OutputBuffer &) const override { return true; } - - const Node *getName() const { return Name; } - + + const Node *getName() const { return Name; } + void printLeft(OutputBuffer &OB) const override { - if (Ret) { + if (Ret) { Ret->printLeft(OB); if (!Ret->hasRHSComponent(OB)) OB += " "; - } + } Name->print(OB); - } - + } + void printRight(OutputBuffer &OB) const override { OB += "("; Params.printWithComma(OB); OB += ")"; - if (Ret) + if (Ret) Ret->printRight(OB); - - if (CVQuals & QualConst) + + if (CVQuals & QualConst) OB += " const"; - if (CVQuals & QualVolatile) + if (CVQuals & QualVolatile) OB += " volatile"; - if (CVQuals & QualRestrict) + if (CVQuals & QualRestrict) OB += " restrict"; - - if (RefQual == FrefQualLValue) + + if (RefQual == FrefQualLValue) OB += " &"; - else if (RefQual == FrefQualRValue) + else if (RefQual == FrefQualRValue) OB += " &&"; - - if (Attrs != nullptr) + + if (Attrs != nullptr) Attrs->print(OB); - } -}; - -class LiteralOperator : public Node { - const Node *OpName; - -public: - LiteralOperator(const Node *OpName_) - : Node(KLiteralOperator), OpName(OpName_) {} - - template<typename Fn> void match(Fn F) const { F(OpName); } - + } +}; + +class LiteralOperator : public Node { + const Node *OpName; + +public: + LiteralOperator(const Node *OpName_) + : Node(KLiteralOperator), OpName(OpName_) {} + + template<typename Fn> void match(Fn F) const { F(OpName); } + void printLeft(OutputBuffer &OB) const override { OB += "operator\"\" "; OpName->print(OB); - } -}; - -class SpecialName final : public Node { - const StringView Special; - const Node *Child; - -public: - SpecialName(StringView Special_, const Node *Child_) - : Node(KSpecialName), Special(Special_), Child(Child_) {} - - template<typename Fn> void match(Fn F) const { F(Special, Child); } - + } +}; + +class SpecialName final : public Node { + const StringView Special; + const Node *Child; + +public: + SpecialName(StringView Special_, const Node *Child_) + : Node(KSpecialName), Special(Special_), Child(Child_) {} + + template<typename Fn> void match(Fn F) const { F(Special, Child); } + void printLeft(OutputBuffer &OB) const override { OB += Special; Child->print(OB); - } -}; - -class CtorVtableSpecialName final : public Node { - const Node *FirstType; - const Node *SecondType; - -public: - CtorVtableSpecialName(const Node *FirstType_, const Node *SecondType_) - : Node(KCtorVtableSpecialName), - FirstType(FirstType_), SecondType(SecondType_) {} - - template<typename Fn> void match(Fn F) const { F(FirstType, SecondType); } - + } +}; + +class CtorVtableSpecialName final : public Node { + const Node *FirstType; + const Node *SecondType; + +public: + CtorVtableSpecialName(const Node *FirstType_, const Node *SecondType_) + : Node(KCtorVtableSpecialName), + FirstType(FirstType_), SecondType(SecondType_) {} + + template<typename Fn> void match(Fn F) const { F(FirstType, SecondType); } + void printLeft(OutputBuffer &OB) const override { OB += "construction vtable for "; FirstType->print(OB); OB += "-in-"; SecondType->print(OB); - } -}; - -struct NestedName : Node { - Node *Qual; - Node *Name; - - NestedName(Node *Qual_, Node *Name_) - : Node(KNestedName), Qual(Qual_), Name(Name_) {} - - template<typename Fn> void match(Fn F) const { F(Qual, Name); } - - StringView getBaseName() const override { return Name->getBaseName(); } - + } +}; + +struct NestedName : Node { + Node *Qual; + Node *Name; + + NestedName(Node *Qual_, Node *Name_) + : Node(KNestedName), Qual(Qual_), Name(Name_) {} + + template<typename Fn> void match(Fn F) const { F(Qual, Name); } + + StringView getBaseName() const override { return Name->getBaseName(); } + void printLeft(OutputBuffer &OB) const override { Qual->print(OB); OB += "::"; Name->print(OB); - } -}; - -struct LocalName : Node { - Node *Encoding; - Node *Entity; - - LocalName(Node *Encoding_, Node *Entity_) - : Node(KLocalName), Encoding(Encoding_), Entity(Entity_) {} - - template<typename Fn> void match(Fn F) const { F(Encoding, Entity); } - + } +}; + +struct LocalName : Node { + Node *Encoding; + Node *Entity; + + LocalName(Node *Encoding_, Node *Entity_) + : Node(KLocalName), Encoding(Encoding_), Entity(Entity_) {} + + template<typename Fn> void match(Fn F) const { F(Encoding, Entity); } + void printLeft(OutputBuffer &OB) const override { Encoding->print(OB); OB += "::"; Entity->print(OB); - } -}; - -class QualifiedName final : public Node { - // qualifier::name - const Node *Qualifier; - const Node *Name; - -public: - QualifiedName(const Node *Qualifier_, const Node *Name_) - : Node(KQualifiedName), Qualifier(Qualifier_), Name(Name_) {} - - template<typename Fn> void match(Fn F) const { F(Qualifier, Name); } - - StringView getBaseName() const override { return Name->getBaseName(); } - + } +}; + +class QualifiedName final : public Node { + // qualifier::name + const Node *Qualifier; + const Node *Name; + +public: + QualifiedName(const Node *Qualifier_, const Node *Name_) + : Node(KQualifiedName), Qualifier(Qualifier_), Name(Name_) {} + + template<typename Fn> void match(Fn F) const { F(Qualifier, Name); } + + StringView getBaseName() const override { return Name->getBaseName(); } + void printLeft(OutputBuffer &OB) const override { Qualifier->print(OB); OB += "::"; Name->print(OB); - } -}; - -class VectorType final : public Node { - const Node *BaseType; - const Node *Dimension; - -public: - VectorType(const Node *BaseType_, Node *Dimension_) - : Node(KVectorType), BaseType(BaseType_), - Dimension(Dimension_) {} - - template<typename Fn> void match(Fn F) const { F(BaseType, Dimension); } - + } +}; + +class VectorType final : public Node { + const Node *BaseType; + const Node *Dimension; + +public: + VectorType(const Node *BaseType_, Node *Dimension_) + : Node(KVectorType), BaseType(BaseType_), + Dimension(Dimension_) {} + + template<typename Fn> void match(Fn F) const { F(BaseType, Dimension); } + void printLeft(OutputBuffer &OB) const override { BaseType->print(OB); OB += " vector["; - if (Dimension) + if (Dimension) Dimension->print(OB); OB += "]"; - } -}; - -class PixelVectorType final : public Node { - const Node *Dimension; - -public: - PixelVectorType(const Node *Dimension_) - : Node(KPixelVectorType), Dimension(Dimension_) {} - - template<typename Fn> void match(Fn F) const { F(Dimension); } - + } +}; + +class PixelVectorType final : public Node { + const Node *Dimension; + +public: + PixelVectorType(const Node *Dimension_) + : Node(KPixelVectorType), Dimension(Dimension_) {} + + template<typename Fn> void match(Fn F) const { F(Dimension); } + void printLeft(OutputBuffer &OB) const override { - // FIXME: This should demangle as "vector pixel". + // FIXME: This should demangle as "vector pixel". OB += "pixel vector["; Dimension->print(OB); OB += "]"; - } -}; - + } +}; + class BinaryFPType final : public Node { const Node *Dimension; @@ -1086,633 +1086,633 @@ public: } }; -enum class TemplateParamKind { Type, NonType, Template }; - -/// An invented name for a template parameter for which we don't have a -/// corresponding template argument. -/// -/// This node is created when parsing the <lambda-sig> for a lambda with -/// explicit template arguments, which might be referenced in the parameter -/// types appearing later in the <lambda-sig>. -class SyntheticTemplateParamName final : public Node { - TemplateParamKind Kind; - unsigned Index; - -public: - SyntheticTemplateParamName(TemplateParamKind Kind_, unsigned Index_) - : Node(KSyntheticTemplateParamName), Kind(Kind_), Index(Index_) {} - - template<typename Fn> void match(Fn F) const { F(Kind, Index); } - +enum class TemplateParamKind { Type, NonType, Template }; + +/// An invented name for a template parameter for which we don't have a +/// corresponding template argument. +/// +/// This node is created when parsing the <lambda-sig> for a lambda with +/// explicit template arguments, which might be referenced in the parameter +/// types appearing later in the <lambda-sig>. +class SyntheticTemplateParamName final : public Node { + TemplateParamKind Kind; + unsigned Index; + +public: + SyntheticTemplateParamName(TemplateParamKind Kind_, unsigned Index_) + : Node(KSyntheticTemplateParamName), Kind(Kind_), Index(Index_) {} + + template<typename Fn> void match(Fn F) const { F(Kind, Index); } + void printLeft(OutputBuffer &OB) const override { - switch (Kind) { - case TemplateParamKind::Type: + switch (Kind) { + case TemplateParamKind::Type: OB += "$T"; - break; - case TemplateParamKind::NonType: + break; + case TemplateParamKind::NonType: OB += "$N"; - break; - case TemplateParamKind::Template: + break; + case TemplateParamKind::Template: OB += "$TT"; - break; - } - if (Index > 0) + break; + } + if (Index > 0) OB << Index - 1; - } -}; - -/// A template type parameter declaration, 'typename T'. -class TypeTemplateParamDecl final : public Node { - Node *Name; - -public: - TypeTemplateParamDecl(Node *Name_) - : Node(KTypeTemplateParamDecl, Cache::Yes), Name(Name_) {} - - template<typename Fn> void match(Fn F) const { F(Name); } - + } +}; + +/// A template type parameter declaration, 'typename T'. +class TypeTemplateParamDecl final : public Node { + Node *Name; + +public: + TypeTemplateParamDecl(Node *Name_) + : Node(KTypeTemplateParamDecl, Cache::Yes), Name(Name_) {} + + template<typename Fn> void match(Fn F) const { F(Name); } + void printLeft(OutputBuffer &OB) const override { OB += "typename "; } - + void printRight(OutputBuffer &OB) const override { Name->print(OB); } -}; - -/// A non-type template parameter declaration, 'int N'. -class NonTypeTemplateParamDecl final : public Node { - Node *Name; - Node *Type; - -public: - NonTypeTemplateParamDecl(Node *Name_, Node *Type_) - : Node(KNonTypeTemplateParamDecl, Cache::Yes), Name(Name_), Type(Type_) {} - - template<typename Fn> void match(Fn F) const { F(Name, Type); } - +}; + +/// A non-type template parameter declaration, 'int N'. +class NonTypeTemplateParamDecl final : public Node { + Node *Name; + Node *Type; + +public: + NonTypeTemplateParamDecl(Node *Name_, Node *Type_) + : Node(KNonTypeTemplateParamDecl, Cache::Yes), Name(Name_), Type(Type_) {} + + template<typename Fn> void match(Fn F) const { F(Name, Type); } + void printLeft(OutputBuffer &OB) const override { Type->printLeft(OB); if (!Type->hasRHSComponent(OB)) OB += " "; - } - + } + void printRight(OutputBuffer &OB) const override { Name->print(OB); Type->printRight(OB); - } -}; - -/// A template template parameter declaration, -/// 'template<typename T> typename N'. -class TemplateTemplateParamDecl final : public Node { - Node *Name; - NodeArray Params; - -public: - TemplateTemplateParamDecl(Node *Name_, NodeArray Params_) - : Node(KTemplateTemplateParamDecl, Cache::Yes), Name(Name_), - Params(Params_) {} - - template<typename Fn> void match(Fn F) const { F(Name, Params); } - + } +}; + +/// A template template parameter declaration, +/// 'template<typename T> typename N'. +class TemplateTemplateParamDecl final : public Node { + Node *Name; + NodeArray Params; + +public: + TemplateTemplateParamDecl(Node *Name_, NodeArray Params_) + : Node(KTemplateTemplateParamDecl, Cache::Yes), Name(Name_), + Params(Params_) {} + + template<typename Fn> void match(Fn F) const { F(Name, Params); } + void printLeft(OutputBuffer &OB) const override { OB += "template<"; Params.printWithComma(OB); OB += "> typename "; - } - + } + void printRight(OutputBuffer &OB) const override { Name->print(OB); } -}; - -/// A template parameter pack declaration, 'typename ...T'. -class TemplateParamPackDecl final : public Node { - Node *Param; - -public: - TemplateParamPackDecl(Node *Param_) - : Node(KTemplateParamPackDecl, Cache::Yes), Param(Param_) {} - - template<typename Fn> void match(Fn F) const { F(Param); } - +}; + +/// A template parameter pack declaration, 'typename ...T'. +class TemplateParamPackDecl final : public Node { + Node *Param; + +public: + TemplateParamPackDecl(Node *Param_) + : Node(KTemplateParamPackDecl, Cache::Yes), Param(Param_) {} + + template<typename Fn> void match(Fn F) const { F(Param); } + void printLeft(OutputBuffer &OB) const override { Param->printLeft(OB); OB += "..."; - } - + } + void printRight(OutputBuffer &OB) const override { Param->printRight(OB); } -}; - -/// An unexpanded parameter pack (either in the expression or type context). If -/// this AST is correct, this node will have a ParameterPackExpansion node above -/// it. -/// -/// This node is created when some <template-args> are found that apply to an -/// <encoding>, and is stored in the TemplateParams table. In order for this to -/// appear in the final AST, it has to referenced via a <template-param> (ie, -/// T_). -class ParameterPack final : public Node { - NodeArray Data; - +}; + +/// An unexpanded parameter pack (either in the expression or type context). If +/// this AST is correct, this node will have a ParameterPackExpansion node above +/// it. +/// +/// This node is created when some <template-args> are found that apply to an +/// <encoding>, and is stored in the TemplateParams table. In order for this to +/// appear in the final AST, it has to referenced via a <template-param> (ie, +/// T_). +class ParameterPack final : public Node { + NodeArray Data; + // Setup OutputString for a pack expansion unless we're already expanding one. void initializePackExpansion(OutputBuffer &OB) const { if (OB.CurrentPackMax == std::numeric_limits<unsigned>::max()) { OB.CurrentPackMax = static_cast<unsigned>(Data.size()); OB.CurrentPackIndex = 0; - } - } - -public: - ParameterPack(NodeArray Data_) : Node(KParameterPack), Data(Data_) { - ArrayCache = FunctionCache = RHSComponentCache = Cache::Unknown; - if (std::all_of(Data.begin(), Data.end(), [](Node* P) { - return P->ArrayCache == Cache::No; - })) - ArrayCache = Cache::No; - if (std::all_of(Data.begin(), Data.end(), [](Node* P) { - return P->FunctionCache == Cache::No; - })) - FunctionCache = Cache::No; - if (std::all_of(Data.begin(), Data.end(), [](Node* P) { - return P->RHSComponentCache == Cache::No; - })) - RHSComponentCache = Cache::No; - } - - template<typename Fn> void match(Fn F) const { F(Data); } - + } + } + +public: + ParameterPack(NodeArray Data_) : Node(KParameterPack), Data(Data_) { + ArrayCache = FunctionCache = RHSComponentCache = Cache::Unknown; + if (std::all_of(Data.begin(), Data.end(), [](Node* P) { + return P->ArrayCache == Cache::No; + })) + ArrayCache = Cache::No; + if (std::all_of(Data.begin(), Data.end(), [](Node* P) { + return P->FunctionCache == Cache::No; + })) + FunctionCache = Cache::No; + if (std::all_of(Data.begin(), Data.end(), [](Node* P) { + return P->RHSComponentCache == Cache::No; + })) + RHSComponentCache = Cache::No; + } + + template<typename Fn> void match(Fn F) const { F(Data); } + bool hasRHSComponentSlow(OutputBuffer &OB) const override { initializePackExpansion(OB); size_t Idx = OB.CurrentPackIndex; return Idx < Data.size() && Data[Idx]->hasRHSComponent(OB); - } + } bool hasArraySlow(OutputBuffer &OB) const override { initializePackExpansion(OB); size_t Idx = OB.CurrentPackIndex; return Idx < Data.size() && Data[Idx]->hasArray(OB); - } + } bool hasFunctionSlow(OutputBuffer &OB) const override { initializePackExpansion(OB); size_t Idx = OB.CurrentPackIndex; return Idx < Data.size() && Data[Idx]->hasFunction(OB); - } + } const Node *getSyntaxNode(OutputBuffer &OB) const override { initializePackExpansion(OB); size_t Idx = OB.CurrentPackIndex; return Idx < Data.size() ? Data[Idx]->getSyntaxNode(OB) : this; - } - + } + void printLeft(OutputBuffer &OB) const override { initializePackExpansion(OB); size_t Idx = OB.CurrentPackIndex; - if (Idx < Data.size()) + if (Idx < Data.size()) Data[Idx]->printLeft(OB); - } + } void printRight(OutputBuffer &OB) const override { initializePackExpansion(OB); size_t Idx = OB.CurrentPackIndex; - if (Idx < Data.size()) + if (Idx < Data.size()) Data[Idx]->printRight(OB); - } -}; - -/// A variadic template argument. This node represents an occurrence of -/// J<something>E in some <template-args>. It isn't itself unexpanded, unless -/// one of it's Elements is. The parser inserts a ParameterPack into the -/// TemplateParams table if the <template-args> this pack belongs to apply to an -/// <encoding>. -class TemplateArgumentPack final : public Node { - NodeArray Elements; -public: - TemplateArgumentPack(NodeArray Elements_) - : Node(KTemplateArgumentPack), Elements(Elements_) {} - - template<typename Fn> void match(Fn F) const { F(Elements); } - - NodeArray getElements() const { return Elements; } - + } +}; + +/// A variadic template argument. This node represents an occurrence of +/// J<something>E in some <template-args>. It isn't itself unexpanded, unless +/// one of it's Elements is. The parser inserts a ParameterPack into the +/// TemplateParams table if the <template-args> this pack belongs to apply to an +/// <encoding>. +class TemplateArgumentPack final : public Node { + NodeArray Elements; +public: + TemplateArgumentPack(NodeArray Elements_) + : Node(KTemplateArgumentPack), Elements(Elements_) {} + + template<typename Fn> void match(Fn F) const { F(Elements); } + + NodeArray getElements() const { return Elements; } + void printLeft(OutputBuffer &OB) const override { Elements.printWithComma(OB); - } -}; - -/// A pack expansion. Below this node, there are some unexpanded ParameterPacks -/// which each have Child->ParameterPackSize elements. -class ParameterPackExpansion final : public Node { - const Node *Child; - -public: - ParameterPackExpansion(const Node *Child_) - : Node(KParameterPackExpansion), Child(Child_) {} - - template<typename Fn> void match(Fn F) const { F(Child); } - - const Node *getChild() const { return Child; } - + } +}; + +/// A pack expansion. Below this node, there are some unexpanded ParameterPacks +/// which each have Child->ParameterPackSize elements. +class ParameterPackExpansion final : public Node { + const Node *Child; + +public: + ParameterPackExpansion(const Node *Child_) + : Node(KParameterPackExpansion), Child(Child_) {} + + template<typename Fn> void match(Fn F) const { F(Child); } + + const Node *getChild() const { return Child; } + void printLeft(OutputBuffer &OB) const override { - constexpr unsigned Max = std::numeric_limits<unsigned>::max(); + constexpr unsigned Max = std::numeric_limits<unsigned>::max(); SwapAndRestore<unsigned> SavePackIdx(OB.CurrentPackIndex, Max); SwapAndRestore<unsigned> SavePackMax(OB.CurrentPackMax, Max); size_t StreamPos = OB.getCurrentPosition(); - - // Print the first element in the pack. If Child contains a ParameterPack, - // it will set up S.CurrentPackMax and print the first element. + + // Print the first element in the pack. If Child contains a ParameterPack, + // it will set up S.CurrentPackMax and print the first element. Child->print(OB); - - // No ParameterPack was found in Child. This can occur if we've found a pack - // expansion on a <function-param>. + + // No ParameterPack was found in Child. This can occur if we've found a pack + // expansion on a <function-param>. if (OB.CurrentPackMax == Max) { OB += "..."; - return; - } - - // We found a ParameterPack, but it has no elements. Erase whatever we may - // of printed. + return; + } + + // We found a ParameterPack, but it has no elements. Erase whatever we may + // of printed. if (OB.CurrentPackMax == 0) { OB.setCurrentPosition(StreamPos); - return; - } - - // Else, iterate through the rest of the elements in the pack. + return; + } + + // Else, iterate through the rest of the elements in the pack. for (unsigned I = 1, E = OB.CurrentPackMax; I < E; ++I) { OB += ", "; OB.CurrentPackIndex = I; Child->print(OB); - } - } -}; - -class TemplateArgs final : public Node { - NodeArray Params; - -public: - TemplateArgs(NodeArray Params_) : Node(KTemplateArgs), Params(Params_) {} - - template<typename Fn> void match(Fn F) const { F(Params); } - - NodeArray getParams() { return Params; } - + } + } +}; + +class TemplateArgs final : public Node { + NodeArray Params; + +public: + TemplateArgs(NodeArray Params_) : Node(KTemplateArgs), Params(Params_) {} + + template<typename Fn> void match(Fn F) const { F(Params); } + + NodeArray getParams() { return Params; } + void printLeft(OutputBuffer &OB) const override { OB += "<"; Params.printWithComma(OB); if (OB.back() == '>') OB += " "; OB += ">"; - } -}; - -/// A forward-reference to a template argument that was not known at the point -/// where the template parameter name was parsed in a mangling. -/// -/// This is created when demangling the name of a specialization of a -/// conversion function template: -/// -/// \code -/// struct A { -/// template<typename T> operator T*(); -/// }; -/// \endcode -/// -/// When demangling a specialization of the conversion function template, we -/// encounter the name of the template (including the \c T) before we reach -/// the template argument list, so we cannot substitute the parameter name -/// for the corresponding argument while parsing. Instead, we create a -/// \c ForwardTemplateReference node that is resolved after we parse the -/// template arguments. -struct ForwardTemplateReference : Node { - size_t Index; - Node *Ref = nullptr; - - // If we're currently printing this node. It is possible (though invalid) for - // a forward template reference to refer to itself via a substitution. This - // creates a cyclic AST, which will stack overflow printing. To fix this, bail - // out if more than one print* function is active. - mutable bool Printing = false; - - ForwardTemplateReference(size_t Index_) - : Node(KForwardTemplateReference, Cache::Unknown, Cache::Unknown, - Cache::Unknown), - Index(Index_) {} - - // We don't provide a matcher for these, because the value of the node is - // not determined by its construction parameters, and it generally needs - // special handling. - template<typename Fn> void match(Fn F) const = delete; - + } +}; + +/// A forward-reference to a template argument that was not known at the point +/// where the template parameter name was parsed in a mangling. +/// +/// This is created when demangling the name of a specialization of a +/// conversion function template: +/// +/// \code +/// struct A { +/// template<typename T> operator T*(); +/// }; +/// \endcode +/// +/// When demangling a specialization of the conversion function template, we +/// encounter the name of the template (including the \c T) before we reach +/// the template argument list, so we cannot substitute the parameter name +/// for the corresponding argument while parsing. Instead, we create a +/// \c ForwardTemplateReference node that is resolved after we parse the +/// template arguments. +struct ForwardTemplateReference : Node { + size_t Index; + Node *Ref = nullptr; + + // If we're currently printing this node. It is possible (though invalid) for + // a forward template reference to refer to itself via a substitution. This + // creates a cyclic AST, which will stack overflow printing. To fix this, bail + // out if more than one print* function is active. + mutable bool Printing = false; + + ForwardTemplateReference(size_t Index_) + : Node(KForwardTemplateReference, Cache::Unknown, Cache::Unknown, + Cache::Unknown), + Index(Index_) {} + + // We don't provide a matcher for these, because the value of the node is + // not determined by its construction parameters, and it generally needs + // special handling. + template<typename Fn> void match(Fn F) const = delete; + bool hasRHSComponentSlow(OutputBuffer &OB) const override { - if (Printing) - return false; - SwapAndRestore<bool> SavePrinting(Printing, true); + if (Printing) + return false; + SwapAndRestore<bool> SavePrinting(Printing, true); return Ref->hasRHSComponent(OB); - } + } bool hasArraySlow(OutputBuffer &OB) const override { - if (Printing) - return false; - SwapAndRestore<bool> SavePrinting(Printing, true); + if (Printing) + return false; + SwapAndRestore<bool> SavePrinting(Printing, true); return Ref->hasArray(OB); - } + } bool hasFunctionSlow(OutputBuffer &OB) const override { - if (Printing) - return false; - SwapAndRestore<bool> SavePrinting(Printing, true); + if (Printing) + return false; + SwapAndRestore<bool> SavePrinting(Printing, true); return Ref->hasFunction(OB); - } + } const Node *getSyntaxNode(OutputBuffer &OB) const override { - if (Printing) - return this; - SwapAndRestore<bool> SavePrinting(Printing, true); + if (Printing) + return this; + SwapAndRestore<bool> SavePrinting(Printing, true); return Ref->getSyntaxNode(OB); - } - + } + void printLeft(OutputBuffer &OB) const override { - if (Printing) - return; - SwapAndRestore<bool> SavePrinting(Printing, true); + if (Printing) + return; + SwapAndRestore<bool> SavePrinting(Printing, true); Ref->printLeft(OB); - } + } void printRight(OutputBuffer &OB) const override { - if (Printing) - return; - SwapAndRestore<bool> SavePrinting(Printing, true); + if (Printing) + return; + SwapAndRestore<bool> SavePrinting(Printing, true); Ref->printRight(OB); - } -}; - -struct NameWithTemplateArgs : Node { - // name<template_args> - Node *Name; - Node *TemplateArgs; - - NameWithTemplateArgs(Node *Name_, Node *TemplateArgs_) - : Node(KNameWithTemplateArgs), Name(Name_), TemplateArgs(TemplateArgs_) {} - - template<typename Fn> void match(Fn F) const { F(Name, TemplateArgs); } - - StringView getBaseName() const override { return Name->getBaseName(); } - + } +}; + +struct NameWithTemplateArgs : Node { + // name<template_args> + Node *Name; + Node *TemplateArgs; + + NameWithTemplateArgs(Node *Name_, Node *TemplateArgs_) + : Node(KNameWithTemplateArgs), Name(Name_), TemplateArgs(TemplateArgs_) {} + + template<typename Fn> void match(Fn F) const { F(Name, TemplateArgs); } + + StringView getBaseName() const override { return Name->getBaseName(); } + void printLeft(OutputBuffer &OB) const override { Name->print(OB); TemplateArgs->print(OB); - } -}; - -class GlobalQualifiedName final : public Node { - Node *Child; - -public: - GlobalQualifiedName(Node* Child_) - : Node(KGlobalQualifiedName), Child(Child_) {} - - template<typename Fn> void match(Fn F) const { F(Child); } - - StringView getBaseName() const override { return Child->getBaseName(); } - + } +}; + +class GlobalQualifiedName final : public Node { + Node *Child; + +public: + GlobalQualifiedName(Node* Child_) + : Node(KGlobalQualifiedName), Child(Child_) {} + + template<typename Fn> void match(Fn F) const { F(Child); } + + StringView getBaseName() const override { return Child->getBaseName(); } + void printLeft(OutputBuffer &OB) const override { OB += "::"; Child->print(OB); - } -}; - -struct StdQualifiedName : Node { - Node *Child; - - StdQualifiedName(Node *Child_) : Node(KStdQualifiedName), Child(Child_) {} - - template<typename Fn> void match(Fn F) const { F(Child); } - - StringView getBaseName() const override { return Child->getBaseName(); } - + } +}; + +struct StdQualifiedName : Node { + Node *Child; + + StdQualifiedName(Node *Child_) : Node(KStdQualifiedName), Child(Child_) {} + + template<typename Fn> void match(Fn F) const { F(Child); } + + StringView getBaseName() const override { return Child->getBaseName(); } + void printLeft(OutputBuffer &OB) const override { OB += "std::"; Child->print(OB); - } -}; - -enum class SpecialSubKind { - allocator, - basic_string, - string, - istream, - ostream, - iostream, -}; - -class ExpandedSpecialSubstitution final : public Node { - SpecialSubKind SSK; - -public: - ExpandedSpecialSubstitution(SpecialSubKind SSK_) - : Node(KExpandedSpecialSubstitution), SSK(SSK_) {} - - template<typename Fn> void match(Fn F) const { F(SSK); } - - StringView getBaseName() const override { - switch (SSK) { - case SpecialSubKind::allocator: - return StringView("allocator"); - case SpecialSubKind::basic_string: - return StringView("basic_string"); - case SpecialSubKind::string: - return StringView("basic_string"); - case SpecialSubKind::istream: - return StringView("basic_istream"); - case SpecialSubKind::ostream: - return StringView("basic_ostream"); - case SpecialSubKind::iostream: - return StringView("basic_iostream"); - } - DEMANGLE_UNREACHABLE; - } - + } +}; + +enum class SpecialSubKind { + allocator, + basic_string, + string, + istream, + ostream, + iostream, +}; + +class ExpandedSpecialSubstitution final : public Node { + SpecialSubKind SSK; + +public: + ExpandedSpecialSubstitution(SpecialSubKind SSK_) + : Node(KExpandedSpecialSubstitution), SSK(SSK_) {} + + template<typename Fn> void match(Fn F) const { F(SSK); } + + StringView getBaseName() const override { + switch (SSK) { + case SpecialSubKind::allocator: + return StringView("allocator"); + case SpecialSubKind::basic_string: + return StringView("basic_string"); + case SpecialSubKind::string: + return StringView("basic_string"); + case SpecialSubKind::istream: + return StringView("basic_istream"); + case SpecialSubKind::ostream: + return StringView("basic_ostream"); + case SpecialSubKind::iostream: + return StringView("basic_iostream"); + } + DEMANGLE_UNREACHABLE; + } + void printLeft(OutputBuffer &OB) const override { - switch (SSK) { - case SpecialSubKind::allocator: + switch (SSK) { + case SpecialSubKind::allocator: OB += "std::allocator"; - break; - case SpecialSubKind::basic_string: + break; + case SpecialSubKind::basic_string: OB += "std::basic_string"; - break; - case SpecialSubKind::string: + break; + case SpecialSubKind::string: OB += "std::basic_string<char, std::char_traits<char>, " "std::allocator<char> >"; - break; - case SpecialSubKind::istream: + break; + case SpecialSubKind::istream: OB += "std::basic_istream<char, std::char_traits<char> >"; - break; - case SpecialSubKind::ostream: + break; + case SpecialSubKind::ostream: OB += "std::basic_ostream<char, std::char_traits<char> >"; - break; - case SpecialSubKind::iostream: + break; + case SpecialSubKind::iostream: OB += "std::basic_iostream<char, std::char_traits<char> >"; - break; - } - } -}; - -class SpecialSubstitution final : public Node { -public: - SpecialSubKind SSK; - - SpecialSubstitution(SpecialSubKind SSK_) - : Node(KSpecialSubstitution), SSK(SSK_) {} - - template<typename Fn> void match(Fn F) const { F(SSK); } - - StringView getBaseName() const override { - switch (SSK) { - case SpecialSubKind::allocator: - return StringView("allocator"); - case SpecialSubKind::basic_string: - return StringView("basic_string"); - case SpecialSubKind::string: - return StringView("string"); - case SpecialSubKind::istream: - return StringView("istream"); - case SpecialSubKind::ostream: - return StringView("ostream"); - case SpecialSubKind::iostream: - return StringView("iostream"); - } - DEMANGLE_UNREACHABLE; - } - + break; + } + } +}; + +class SpecialSubstitution final : public Node { +public: + SpecialSubKind SSK; + + SpecialSubstitution(SpecialSubKind SSK_) + : Node(KSpecialSubstitution), SSK(SSK_) {} + + template<typename Fn> void match(Fn F) const { F(SSK); } + + StringView getBaseName() const override { + switch (SSK) { + case SpecialSubKind::allocator: + return StringView("allocator"); + case SpecialSubKind::basic_string: + return StringView("basic_string"); + case SpecialSubKind::string: + return StringView("string"); + case SpecialSubKind::istream: + return StringView("istream"); + case SpecialSubKind::ostream: + return StringView("ostream"); + case SpecialSubKind::iostream: + return StringView("iostream"); + } + DEMANGLE_UNREACHABLE; + } + void printLeft(OutputBuffer &OB) const override { - switch (SSK) { - case SpecialSubKind::allocator: + switch (SSK) { + case SpecialSubKind::allocator: OB += "std::allocator"; - break; - case SpecialSubKind::basic_string: + break; + case SpecialSubKind::basic_string: OB += "std::basic_string"; - break; - case SpecialSubKind::string: + break; + case SpecialSubKind::string: OB += "std::string"; - break; - case SpecialSubKind::istream: + break; + case SpecialSubKind::istream: OB += "std::istream"; - break; - case SpecialSubKind::ostream: + break; + case SpecialSubKind::ostream: OB += "std::ostream"; - break; - case SpecialSubKind::iostream: + break; + case SpecialSubKind::iostream: OB += "std::iostream"; - break; - } - } -}; - -class CtorDtorName final : public Node { - const Node *Basename; - const bool IsDtor; - const int Variant; - -public: - CtorDtorName(const Node *Basename_, bool IsDtor_, int Variant_) - : Node(KCtorDtorName), Basename(Basename_), IsDtor(IsDtor_), - Variant(Variant_) {} - - template<typename Fn> void match(Fn F) const { F(Basename, IsDtor, Variant); } - + break; + } + } +}; + +class CtorDtorName final : public Node { + const Node *Basename; + const bool IsDtor; + const int Variant; + +public: + CtorDtorName(const Node *Basename_, bool IsDtor_, int Variant_) + : Node(KCtorDtorName), Basename(Basename_), IsDtor(IsDtor_), + Variant(Variant_) {} + + template<typename Fn> void match(Fn F) const { F(Basename, IsDtor, Variant); } + void printLeft(OutputBuffer &OB) const override { - if (IsDtor) + if (IsDtor) OB += "~"; OB += Basename->getBaseName(); - } -}; - -class DtorName : public Node { - const Node *Base; - -public: - DtorName(const Node *Base_) : Node(KDtorName), Base(Base_) {} - - template<typename Fn> void match(Fn F) const { F(Base); } - + } +}; + +class DtorName : public Node { + const Node *Base; + +public: + DtorName(const Node *Base_) : Node(KDtorName), Base(Base_) {} + + template<typename Fn> void match(Fn F) const { F(Base); } + void printLeft(OutputBuffer &OB) const override { OB += "~"; Base->printLeft(OB); - } -}; - -class UnnamedTypeName : public Node { - const StringView Count; - -public: - UnnamedTypeName(StringView Count_) : Node(KUnnamedTypeName), Count(Count_) {} - - template<typename Fn> void match(Fn F) const { F(Count); } - + } +}; + +class UnnamedTypeName : public Node { + const StringView Count; + +public: + UnnamedTypeName(StringView Count_) : Node(KUnnamedTypeName), Count(Count_) {} + + template<typename Fn> void match(Fn F) const { F(Count); } + void printLeft(OutputBuffer &OB) const override { OB += "'unnamed"; OB += Count; OB += "\'"; - } -}; - -class ClosureTypeName : public Node { - NodeArray TemplateParams; - NodeArray Params; - StringView Count; - -public: - ClosureTypeName(NodeArray TemplateParams_, NodeArray Params_, - StringView Count_) - : Node(KClosureTypeName), TemplateParams(TemplateParams_), - Params(Params_), Count(Count_) {} - - template<typename Fn> void match(Fn F) const { - F(TemplateParams, Params, Count); - } - + } +}; + +class ClosureTypeName : public Node { + NodeArray TemplateParams; + NodeArray Params; + StringView Count; + +public: + ClosureTypeName(NodeArray TemplateParams_, NodeArray Params_, + StringView Count_) + : Node(KClosureTypeName), TemplateParams(TemplateParams_), + Params(Params_), Count(Count_) {} + + template<typename Fn> void match(Fn F) const { + F(TemplateParams, Params, Count); + } + void printDeclarator(OutputBuffer &OB) const { - if (!TemplateParams.empty()) { + if (!TemplateParams.empty()) { OB += "<"; TemplateParams.printWithComma(OB); OB += ">"; - } + } OB += "("; Params.printWithComma(OB); OB += ")"; - } - + } + void printLeft(OutputBuffer &OB) const override { OB += "\'lambda"; OB += Count; OB += "\'"; printDeclarator(OB); - } -}; - -class StructuredBindingName : public Node { - NodeArray Bindings; -public: - StructuredBindingName(NodeArray Bindings_) - : Node(KStructuredBindingName), Bindings(Bindings_) {} - - template<typename Fn> void match(Fn F) const { F(Bindings); } - + } +}; + +class StructuredBindingName : public Node { + NodeArray Bindings; +public: + StructuredBindingName(NodeArray Bindings_) + : Node(KStructuredBindingName), Bindings(Bindings_) {} + + template<typename Fn> void match(Fn F) const { F(Bindings); } + void printLeft(OutputBuffer &OB) const override { OB += '['; Bindings.printWithComma(OB); OB += ']'; - } -}; - -// -- Expression Nodes -- - -class BinaryExpr : public Node { - const Node *LHS; - const StringView InfixOperator; - const Node *RHS; - -public: - BinaryExpr(const Node *LHS_, StringView InfixOperator_, const Node *RHS_) - : Node(KBinaryExpr), LHS(LHS_), InfixOperator(InfixOperator_), RHS(RHS_) { - } - - template<typename Fn> void match(Fn F) const { F(LHS, InfixOperator, RHS); } - + } +}; + +// -- Expression Nodes -- + +class BinaryExpr : public Node { + const Node *LHS; + const StringView InfixOperator; + const Node *RHS; + +public: + BinaryExpr(const Node *LHS_, StringView InfixOperator_, const Node *RHS_) + : Node(KBinaryExpr), LHS(LHS_), InfixOperator(InfixOperator_), RHS(RHS_) { + } + + template<typename Fn> void match(Fn F) const { F(LHS, InfixOperator, RHS); } + void printLeft(OutputBuffer &OB) const override { - // might be a template argument expression, then we need to disambiguate - // with parens. - if (InfixOperator == ">") + // might be a template argument expression, then we need to disambiguate + // with parens. + if (InfixOperator == ">") OB += "("; - + OB += "("; LHS->print(OB); OB += ") "; @@ -1720,60 +1720,60 @@ public: OB += " ("; RHS->print(OB); OB += ")"; - - if (InfixOperator == ">") + + if (InfixOperator == ">") OB += ")"; - } -}; - -class ArraySubscriptExpr : public Node { - const Node *Op1; - const Node *Op2; - -public: - ArraySubscriptExpr(const Node *Op1_, const Node *Op2_) - : Node(KArraySubscriptExpr), Op1(Op1_), Op2(Op2_) {} - - template<typename Fn> void match(Fn F) const { F(Op1, Op2); } - + } +}; + +class ArraySubscriptExpr : public Node { + const Node *Op1; + const Node *Op2; + +public: + ArraySubscriptExpr(const Node *Op1_, const Node *Op2_) + : Node(KArraySubscriptExpr), Op1(Op1_), Op2(Op2_) {} + + template<typename Fn> void match(Fn F) const { F(Op1, Op2); } + void printLeft(OutputBuffer &OB) const override { OB += "("; Op1->print(OB); OB += ")["; Op2->print(OB); OB += "]"; - } -}; - -class PostfixExpr : public Node { - const Node *Child; - const StringView Operator; - -public: - PostfixExpr(const Node *Child_, StringView Operator_) - : Node(KPostfixExpr), Child(Child_), Operator(Operator_) {} - - template<typename Fn> void match(Fn F) const { F(Child, Operator); } - + } +}; + +class PostfixExpr : public Node { + const Node *Child; + const StringView Operator; + +public: + PostfixExpr(const Node *Child_, StringView Operator_) + : Node(KPostfixExpr), Child(Child_), Operator(Operator_) {} + + template<typename Fn> void match(Fn F) const { F(Child, Operator); } + void printLeft(OutputBuffer &OB) const override { OB += "("; Child->print(OB); OB += ")"; OB += Operator; - } -}; - -class ConditionalExpr : public Node { - const Node *Cond; - const Node *Then; - const Node *Else; - -public: - ConditionalExpr(const Node *Cond_, const Node *Then_, const Node *Else_) - : Node(KConditionalExpr), Cond(Cond_), Then(Then_), Else(Else_) {} - - template<typename Fn> void match(Fn F) const { F(Cond, Then, Else); } - + } +}; + +class ConditionalExpr : public Node { + const Node *Cond; + const Node *Then; + const Node *Else; + +public: + ConditionalExpr(const Node *Cond_, const Node *Then_, const Node *Else_) + : Node(KConditionalExpr), Cond(Cond_), Then(Then_), Else(Else_) {} + + template<typename Fn> void match(Fn F) const { F(Cond, Then, Else); } + void printLeft(OutputBuffer &OB) const override { OB += "("; Cond->print(OB); @@ -1782,92 +1782,92 @@ public: OB += ") : ("; Else->print(OB); OB += ")"; - } -}; - -class MemberExpr : public Node { - const Node *LHS; - const StringView Kind; - const Node *RHS; - -public: - MemberExpr(const Node *LHS_, StringView Kind_, const Node *RHS_) - : Node(KMemberExpr), LHS(LHS_), Kind(Kind_), RHS(RHS_) {} - - template<typename Fn> void match(Fn F) const { F(LHS, Kind, RHS); } - + } +}; + +class MemberExpr : public Node { + const Node *LHS; + const StringView Kind; + const Node *RHS; + +public: + MemberExpr(const Node *LHS_, StringView Kind_, const Node *RHS_) + : Node(KMemberExpr), LHS(LHS_), Kind(Kind_), RHS(RHS_) {} + + template<typename Fn> void match(Fn F) const { F(LHS, Kind, RHS); } + void printLeft(OutputBuffer &OB) const override { LHS->print(OB); OB += Kind; RHS->print(OB); - } -}; - -class SubobjectExpr : public Node { - const Node *Type; - const Node *SubExpr; - StringView Offset; - NodeArray UnionSelectors; - bool OnePastTheEnd; - -public: - SubobjectExpr(const Node *Type_, const Node *SubExpr_, StringView Offset_, - NodeArray UnionSelectors_, bool OnePastTheEnd_) - : Node(KSubobjectExpr), Type(Type_), SubExpr(SubExpr_), Offset(Offset_), - UnionSelectors(UnionSelectors_), OnePastTheEnd(OnePastTheEnd_) {} - - template<typename Fn> void match(Fn F) const { - F(Type, SubExpr, Offset, UnionSelectors, OnePastTheEnd); - } - + } +}; + +class SubobjectExpr : public Node { + const Node *Type; + const Node *SubExpr; + StringView Offset; + NodeArray UnionSelectors; + bool OnePastTheEnd; + +public: + SubobjectExpr(const Node *Type_, const Node *SubExpr_, StringView Offset_, + NodeArray UnionSelectors_, bool OnePastTheEnd_) + : Node(KSubobjectExpr), Type(Type_), SubExpr(SubExpr_), Offset(Offset_), + UnionSelectors(UnionSelectors_), OnePastTheEnd(OnePastTheEnd_) {} + + template<typename Fn> void match(Fn F) const { + F(Type, SubExpr, Offset, UnionSelectors, OnePastTheEnd); + } + void printLeft(OutputBuffer &OB) const override { SubExpr->print(OB); OB += ".<"; Type->print(OB); OB += " at offset "; - if (Offset.empty()) { + if (Offset.empty()) { OB += "0"; - } else if (Offset[0] == 'n') { + } else if (Offset[0] == 'n') { OB += "-"; OB += Offset.dropFront(); - } else { + } else { OB += Offset; - } + } OB += ">"; - } -}; - -class EnclosingExpr : public Node { - const StringView Prefix; - const Node *Infix; - const StringView Postfix; - -public: - EnclosingExpr(StringView Prefix_, Node *Infix_, StringView Postfix_) - : Node(KEnclosingExpr), Prefix(Prefix_), Infix(Infix_), - Postfix(Postfix_) {} - - template<typename Fn> void match(Fn F) const { F(Prefix, Infix, Postfix); } - + } +}; + +class EnclosingExpr : public Node { + const StringView Prefix; + const Node *Infix; + const StringView Postfix; + +public: + EnclosingExpr(StringView Prefix_, Node *Infix_, StringView Postfix_) + : Node(KEnclosingExpr), Prefix(Prefix_), Infix(Infix_), + Postfix(Postfix_) {} + + template<typename Fn> void match(Fn F) const { F(Prefix, Infix, Postfix); } + void printLeft(OutputBuffer &OB) const override { OB += Prefix; Infix->print(OB); OB += Postfix; - } -}; - -class CastExpr : public Node { - // cast_kind<to>(from) - const StringView CastKind; - const Node *To; - const Node *From; - -public: - CastExpr(StringView CastKind_, const Node *To_, const Node *From_) - : Node(KCastExpr), CastKind(CastKind_), To(To_), From(From_) {} - - template<typename Fn> void match(Fn F) const { F(CastKind, To, From); } - + } +}; + +class CastExpr : public Node { + // cast_kind<to>(from) + const StringView CastKind; + const Node *To; + const Node *From; + +public: + CastExpr(StringView CastKind_, const Node *To_, const Node *From_) + : Node(KCastExpr), CastKind(CastKind_), To(To_), From(From_) {} + + template<typename Fn> void match(Fn F) const { F(CastKind, To, From); } + void printLeft(OutputBuffer &OB) const override { OB += CastKind; OB += "<"; @@ -1875,1854 +1875,1854 @@ public: OB += ">("; From->printLeft(OB); OB += ")"; - } -}; - -class SizeofParamPackExpr : public Node { - const Node *Pack; - -public: - SizeofParamPackExpr(const Node *Pack_) - : Node(KSizeofParamPackExpr), Pack(Pack_) {} - - template<typename Fn> void match(Fn F) const { F(Pack); } - + } +}; + +class SizeofParamPackExpr : public Node { + const Node *Pack; + +public: + SizeofParamPackExpr(const Node *Pack_) + : Node(KSizeofParamPackExpr), Pack(Pack_) {} + + template<typename Fn> void match(Fn F) const { F(Pack); } + void printLeft(OutputBuffer &OB) const override { OB += "sizeof...("; - ParameterPackExpansion PPE(Pack); + ParameterPackExpansion PPE(Pack); PPE.printLeft(OB); OB += ")"; - } -}; - -class CallExpr : public Node { - const Node *Callee; - NodeArray Args; - -public: - CallExpr(const Node *Callee_, NodeArray Args_) - : Node(KCallExpr), Callee(Callee_), Args(Args_) {} - - template<typename Fn> void match(Fn F) const { F(Callee, Args); } - + } +}; + +class CallExpr : public Node { + const Node *Callee; + NodeArray Args; + +public: + CallExpr(const Node *Callee_, NodeArray Args_) + : Node(KCallExpr), Callee(Callee_), Args(Args_) {} + + template<typename Fn> void match(Fn F) const { F(Callee, Args); } + void printLeft(OutputBuffer &OB) const override { Callee->print(OB); OB += "("; Args.printWithComma(OB); OB += ")"; - } -}; - -class NewExpr : public Node { - // new (expr_list) type(init_list) - NodeArray ExprList; - Node *Type; - NodeArray InitList; - bool IsGlobal; // ::operator new ? - bool IsArray; // new[] ? -public: - NewExpr(NodeArray ExprList_, Node *Type_, NodeArray InitList_, bool IsGlobal_, - bool IsArray_) - : Node(KNewExpr), ExprList(ExprList_), Type(Type_), InitList(InitList_), - IsGlobal(IsGlobal_), IsArray(IsArray_) {} - - template<typename Fn> void match(Fn F) const { - F(ExprList, Type, InitList, IsGlobal, IsArray); - } - + } +}; + +class NewExpr : public Node { + // new (expr_list) type(init_list) + NodeArray ExprList; + Node *Type; + NodeArray InitList; + bool IsGlobal; // ::operator new ? + bool IsArray; // new[] ? +public: + NewExpr(NodeArray ExprList_, Node *Type_, NodeArray InitList_, bool IsGlobal_, + bool IsArray_) + : Node(KNewExpr), ExprList(ExprList_), Type(Type_), InitList(InitList_), + IsGlobal(IsGlobal_), IsArray(IsArray_) {} + + template<typename Fn> void match(Fn F) const { + F(ExprList, Type, InitList, IsGlobal, IsArray); + } + void printLeft(OutputBuffer &OB) const override { - if (IsGlobal) + if (IsGlobal) OB += "::operator "; OB += "new"; - if (IsArray) + if (IsArray) OB += "[]"; OB += ' '; - if (!ExprList.empty()) { + if (!ExprList.empty()) { OB += "("; ExprList.printWithComma(OB); OB += ")"; - } + } Type->print(OB); - if (!InitList.empty()) { + if (!InitList.empty()) { OB += "("; InitList.printWithComma(OB); OB += ")"; - } - } -}; - -class DeleteExpr : public Node { - Node *Op; - bool IsGlobal; - bool IsArray; - -public: - DeleteExpr(Node *Op_, bool IsGlobal_, bool IsArray_) - : Node(KDeleteExpr), Op(Op_), IsGlobal(IsGlobal_), IsArray(IsArray_) {} - - template<typename Fn> void match(Fn F) const { F(Op, IsGlobal, IsArray); } - + } + } +}; + +class DeleteExpr : public Node { + Node *Op; + bool IsGlobal; + bool IsArray; + +public: + DeleteExpr(Node *Op_, bool IsGlobal_, bool IsArray_) + : Node(KDeleteExpr), Op(Op_), IsGlobal(IsGlobal_), IsArray(IsArray_) {} + + template<typename Fn> void match(Fn F) const { F(Op, IsGlobal, IsArray); } + void printLeft(OutputBuffer &OB) const override { - if (IsGlobal) + if (IsGlobal) OB += "::"; OB += "delete"; - if (IsArray) + if (IsArray) OB += "[] "; Op->print(OB); - } -}; - -class PrefixExpr : public Node { - StringView Prefix; - Node *Child; - -public: - PrefixExpr(StringView Prefix_, Node *Child_) - : Node(KPrefixExpr), Prefix(Prefix_), Child(Child_) {} - - template<typename Fn> void match(Fn F) const { F(Prefix, Child); } - + } +}; + +class PrefixExpr : public Node { + StringView Prefix; + Node *Child; + +public: + PrefixExpr(StringView Prefix_, Node *Child_) + : Node(KPrefixExpr), Prefix(Prefix_), Child(Child_) {} + + template<typename Fn> void match(Fn F) const { F(Prefix, Child); } + void printLeft(OutputBuffer &OB) const override { OB += Prefix; OB += "("; Child->print(OB); OB += ")"; - } -}; - -class FunctionParam : public Node { - StringView Number; - -public: - FunctionParam(StringView Number_) : Node(KFunctionParam), Number(Number_) {} - - template<typename Fn> void match(Fn F) const { F(Number); } - + } +}; + +class FunctionParam : public Node { + StringView Number; + +public: + FunctionParam(StringView Number_) : Node(KFunctionParam), Number(Number_) {} + + template<typename Fn> void match(Fn F) const { F(Number); } + void printLeft(OutputBuffer &OB) const override { OB += "fp"; OB += Number; - } -}; - -class ConversionExpr : public Node { - const Node *Type; - NodeArray Expressions; - -public: - ConversionExpr(const Node *Type_, NodeArray Expressions_) - : Node(KConversionExpr), Type(Type_), Expressions(Expressions_) {} - - template<typename Fn> void match(Fn F) const { F(Type, Expressions); } - + } +}; + +class ConversionExpr : public Node { + const Node *Type; + NodeArray Expressions; + +public: + ConversionExpr(const Node *Type_, NodeArray Expressions_) + : Node(KConversionExpr), Type(Type_), Expressions(Expressions_) {} + + template<typename Fn> void match(Fn F) const { F(Type, Expressions); } + void printLeft(OutputBuffer &OB) const override { OB += "("; Type->print(OB); OB += ")("; Expressions.printWithComma(OB); OB += ")"; - } -}; - -class PointerToMemberConversionExpr : public Node { - const Node *Type; - const Node *SubExpr; - StringView Offset; - -public: - PointerToMemberConversionExpr(const Node *Type_, const Node *SubExpr_, - StringView Offset_) - : Node(KPointerToMemberConversionExpr), Type(Type_), SubExpr(SubExpr_), - Offset(Offset_) {} - - template<typename Fn> void match(Fn F) const { F(Type, SubExpr, Offset); } - + } +}; + +class PointerToMemberConversionExpr : public Node { + const Node *Type; + const Node *SubExpr; + StringView Offset; + +public: + PointerToMemberConversionExpr(const Node *Type_, const Node *SubExpr_, + StringView Offset_) + : Node(KPointerToMemberConversionExpr), Type(Type_), SubExpr(SubExpr_), + Offset(Offset_) {} + + template<typename Fn> void match(Fn F) const { F(Type, SubExpr, Offset); } + void printLeft(OutputBuffer &OB) const override { OB += "("; Type->print(OB); OB += ")("; SubExpr->print(OB); OB += ")"; - } -}; - -class InitListExpr : public Node { - const Node *Ty; - NodeArray Inits; -public: - InitListExpr(const Node *Ty_, NodeArray Inits_) - : Node(KInitListExpr), Ty(Ty_), Inits(Inits_) {} - - template<typename Fn> void match(Fn F) const { F(Ty, Inits); } - + } +}; + +class InitListExpr : public Node { + const Node *Ty; + NodeArray Inits; +public: + InitListExpr(const Node *Ty_, NodeArray Inits_) + : Node(KInitListExpr), Ty(Ty_), Inits(Inits_) {} + + template<typename Fn> void match(Fn F) const { F(Ty, Inits); } + void printLeft(OutputBuffer &OB) const override { - if (Ty) + if (Ty) Ty->print(OB); OB += '{'; Inits.printWithComma(OB); OB += '}'; - } -}; - -class BracedExpr : public Node { - const Node *Elem; - const Node *Init; - bool IsArray; -public: - BracedExpr(const Node *Elem_, const Node *Init_, bool IsArray_) - : Node(KBracedExpr), Elem(Elem_), Init(Init_), IsArray(IsArray_) {} - - template<typename Fn> void match(Fn F) const { F(Elem, Init, IsArray); } - + } +}; + +class BracedExpr : public Node { + const Node *Elem; + const Node *Init; + bool IsArray; +public: + BracedExpr(const Node *Elem_, const Node *Init_, bool IsArray_) + : Node(KBracedExpr), Elem(Elem_), Init(Init_), IsArray(IsArray_) {} + + template<typename Fn> void match(Fn F) const { F(Elem, Init, IsArray); } + void printLeft(OutputBuffer &OB) const override { - if (IsArray) { + if (IsArray) { OB += '['; Elem->print(OB); OB += ']'; - } else { + } else { OB += '.'; Elem->print(OB); - } - if (Init->getKind() != KBracedExpr && Init->getKind() != KBracedRangeExpr) + } + if (Init->getKind() != KBracedExpr && Init->getKind() != KBracedRangeExpr) OB += " = "; Init->print(OB); - } -}; - -class BracedRangeExpr : public Node { - const Node *First; - const Node *Last; - const Node *Init; -public: - BracedRangeExpr(const Node *First_, const Node *Last_, const Node *Init_) - : Node(KBracedRangeExpr), First(First_), Last(Last_), Init(Init_) {} - - template<typename Fn> void match(Fn F) const { F(First, Last, Init); } - + } +}; + +class BracedRangeExpr : public Node { + const Node *First; + const Node *Last; + const Node *Init; +public: + BracedRangeExpr(const Node *First_, const Node *Last_, const Node *Init_) + : Node(KBracedRangeExpr), First(First_), Last(Last_), Init(Init_) {} + + template<typename Fn> void match(Fn F) const { F(First, Last, Init); } + void printLeft(OutputBuffer &OB) const override { OB += '['; First->print(OB); OB += " ... "; Last->print(OB); OB += ']'; - if (Init->getKind() != KBracedExpr && Init->getKind() != KBracedRangeExpr) + if (Init->getKind() != KBracedExpr && Init->getKind() != KBracedRangeExpr) OB += " = "; Init->print(OB); - } -}; - -class FoldExpr : public Node { - const Node *Pack, *Init; - StringView OperatorName; - bool IsLeftFold; - -public: - FoldExpr(bool IsLeftFold_, StringView OperatorName_, const Node *Pack_, - const Node *Init_) - : Node(KFoldExpr), Pack(Pack_), Init(Init_), OperatorName(OperatorName_), - IsLeftFold(IsLeftFold_) {} - - template<typename Fn> void match(Fn F) const { - F(IsLeftFold, OperatorName, Pack, Init); - } - + } +}; + +class FoldExpr : public Node { + const Node *Pack, *Init; + StringView OperatorName; + bool IsLeftFold; + +public: + FoldExpr(bool IsLeftFold_, StringView OperatorName_, const Node *Pack_, + const Node *Init_) + : Node(KFoldExpr), Pack(Pack_), Init(Init_), OperatorName(OperatorName_), + IsLeftFold(IsLeftFold_) {} + + template<typename Fn> void match(Fn F) const { + F(IsLeftFold, OperatorName, Pack, Init); + } + void printLeft(OutputBuffer &OB) const override { - auto PrintPack = [&] { + auto PrintPack = [&] { OB += '('; ParameterPackExpansion(Pack).print(OB); OB += ')'; - }; - + }; + OB += '('; - - if (IsLeftFold) { - // init op ... op pack - if (Init != nullptr) { + + if (IsLeftFold) { + // init op ... op pack + if (Init != nullptr) { Init->print(OB); OB += ' '; OB += OperatorName; OB += ' '; - } - // ... op pack + } + // ... op pack OB += "... "; OB += OperatorName; OB += ' '; - PrintPack(); - } else { // !IsLeftFold - // pack op ... - PrintPack(); + PrintPack(); + } else { // !IsLeftFold + // pack op ... + PrintPack(); OB += ' '; OB += OperatorName; OB += " ..."; - // pack op ... op init - if (Init != nullptr) { + // pack op ... op init + if (Init != nullptr) { OB += ' '; OB += OperatorName; OB += ' '; Init->print(OB); - } - } + } + } OB += ')'; - } -}; - -class ThrowExpr : public Node { - const Node *Op; - -public: - ThrowExpr(const Node *Op_) : Node(KThrowExpr), Op(Op_) {} - - template<typename Fn> void match(Fn F) const { F(Op); } - + } +}; + +class ThrowExpr : public Node { + const Node *Op; + +public: + ThrowExpr(const Node *Op_) : Node(KThrowExpr), Op(Op_) {} + + template<typename Fn> void match(Fn F) const { F(Op); } + void printLeft(OutputBuffer &OB) const override { OB += "throw "; Op->print(OB); - } -}; - -class BoolExpr : public Node { - bool Value; - -public: - BoolExpr(bool Value_) : Node(KBoolExpr), Value(Value_) {} - - template<typename Fn> void match(Fn F) const { F(Value); } - + } +}; + +class BoolExpr : public Node { + bool Value; + +public: + BoolExpr(bool Value_) : Node(KBoolExpr), Value(Value_) {} + + template<typename Fn> void match(Fn F) const { F(Value); } + void printLeft(OutputBuffer &OB) const override { OB += Value ? StringView("true") : StringView("false"); - } -}; - -class StringLiteral : public Node { - const Node *Type; - -public: - StringLiteral(const Node *Type_) : Node(KStringLiteral), Type(Type_) {} - - template<typename Fn> void match(Fn F) const { F(Type); } - + } +}; + +class StringLiteral : public Node { + const Node *Type; + +public: + StringLiteral(const Node *Type_) : Node(KStringLiteral), Type(Type_) {} + + template<typename Fn> void match(Fn F) const { F(Type); } + void printLeft(OutputBuffer &OB) const override { OB += "\"<"; Type->print(OB); OB += ">\""; - } -}; - -class LambdaExpr : public Node { - const Node *Type; - -public: - LambdaExpr(const Node *Type_) : Node(KLambdaExpr), Type(Type_) {} - - template<typename Fn> void match(Fn F) const { F(Type); } - + } +}; + +class LambdaExpr : public Node { + const Node *Type; + +public: + LambdaExpr(const Node *Type_) : Node(KLambdaExpr), Type(Type_) {} + + template<typename Fn> void match(Fn F) const { F(Type); } + void printLeft(OutputBuffer &OB) const override { OB += "[]"; - if (Type->getKind() == KClosureTypeName) + if (Type->getKind() == KClosureTypeName) static_cast<const ClosureTypeName *>(Type)->printDeclarator(OB); OB += "{...}"; - } -}; - -class EnumLiteral : public Node { - // ty(integer) - const Node *Ty; - StringView Integer; - -public: - EnumLiteral(const Node *Ty_, StringView Integer_) - : Node(KEnumLiteral), Ty(Ty_), Integer(Integer_) {} - - template<typename Fn> void match(Fn F) const { F(Ty, Integer); } - + } +}; + +class EnumLiteral : public Node { + // ty(integer) + const Node *Ty; + StringView Integer; + +public: + EnumLiteral(const Node *Ty_, StringView Integer_) + : Node(KEnumLiteral), Ty(Ty_), Integer(Integer_) {} + + template<typename Fn> void match(Fn F) const { F(Ty, Integer); } + void printLeft(OutputBuffer &OB) const override { OB << "("; Ty->print(OB); OB << ")"; - - if (Integer[0] == 'n') + + if (Integer[0] == 'n') OB << "-" << Integer.dropFront(1); - else + else OB << Integer; - } -}; - -class IntegerLiteral : public Node { - StringView Type; - StringView Value; - -public: - IntegerLiteral(StringView Type_, StringView Value_) - : Node(KIntegerLiteral), Type(Type_), Value(Value_) {} - - template<typename Fn> void match(Fn F) const { F(Type, Value); } - + } +}; + +class IntegerLiteral : public Node { + StringView Type; + StringView Value; + +public: + IntegerLiteral(StringView Type_, StringView Value_) + : Node(KIntegerLiteral), Type(Type_), Value(Value_) {} + + template<typename Fn> void match(Fn F) const { F(Type, Value); } + void printLeft(OutputBuffer &OB) const override { - if (Type.size() > 3) { + if (Type.size() > 3) { OB += "("; OB += Type; OB += ")"; - } - - if (Value[0] == 'n') { + } + + if (Value[0] == 'n') { OB += "-"; OB += Value.dropFront(1); - } else + } else OB += Value; - - if (Type.size() <= 3) + + if (Type.size() <= 3) OB += Type; - } -}; - -template <class Float> struct FloatData; - -namespace float_literal_impl { -constexpr Node::Kind getFloatLiteralKind(float *) { - return Node::KFloatLiteral; -} -constexpr Node::Kind getFloatLiteralKind(double *) { - return Node::KDoubleLiteral; -} -constexpr Node::Kind getFloatLiteralKind(long double *) { - return Node::KLongDoubleLiteral; -} -} - -template <class Float> class FloatLiteralImpl : public Node { - const StringView Contents; - - static constexpr Kind KindForClass = - float_literal_impl::getFloatLiteralKind((Float *)nullptr); - -public: - FloatLiteralImpl(StringView Contents_) - : Node(KindForClass), Contents(Contents_) {} - - template<typename Fn> void match(Fn F) const { F(Contents); } - + } +}; + +template <class Float> struct FloatData; + +namespace float_literal_impl { +constexpr Node::Kind getFloatLiteralKind(float *) { + return Node::KFloatLiteral; +} +constexpr Node::Kind getFloatLiteralKind(double *) { + return Node::KDoubleLiteral; +} +constexpr Node::Kind getFloatLiteralKind(long double *) { + return Node::KLongDoubleLiteral; +} +} + +template <class Float> class FloatLiteralImpl : public Node { + const StringView Contents; + + static constexpr Kind KindForClass = + float_literal_impl::getFloatLiteralKind((Float *)nullptr); + +public: + FloatLiteralImpl(StringView Contents_) + : Node(KindForClass), Contents(Contents_) {} + + template<typename Fn> void match(Fn F) const { F(Contents); } + void printLeft(OutputBuffer &OB) const override { - const char *first = Contents.begin(); - const char *last = Contents.end() + 1; - - const size_t N = FloatData<Float>::mangled_size; - if (static_cast<std::size_t>(last - first) > N) { - last = first + N; - union { - Float value; - char buf[sizeof(Float)]; - }; - const char *t = first; - char *e = buf; - for (; t != last; ++t, ++e) { - unsigned d1 = isdigit(*t) ? static_cast<unsigned>(*t - '0') - : static_cast<unsigned>(*t - 'a' + 10); - ++t; - unsigned d0 = isdigit(*t) ? static_cast<unsigned>(*t - '0') - : static_cast<unsigned>(*t - 'a' + 10); - *e = static_cast<char>((d1 << 4) + d0); - } -#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ - std::reverse(buf, e); -#endif - char num[FloatData<Float>::max_demangled_size] = {0}; - int n = snprintf(num, sizeof(num), FloatData<Float>::spec, value); + const char *first = Contents.begin(); + const char *last = Contents.end() + 1; + + const size_t N = FloatData<Float>::mangled_size; + if (static_cast<std::size_t>(last - first) > N) { + last = first + N; + union { + Float value; + char buf[sizeof(Float)]; + }; + const char *t = first; + char *e = buf; + for (; t != last; ++t, ++e) { + unsigned d1 = isdigit(*t) ? static_cast<unsigned>(*t - '0') + : static_cast<unsigned>(*t - 'a' + 10); + ++t; + unsigned d0 = isdigit(*t) ? static_cast<unsigned>(*t - '0') + : static_cast<unsigned>(*t - 'a' + 10); + *e = static_cast<char>((d1 << 4) + d0); + } +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ + std::reverse(buf, e); +#endif + char num[FloatData<Float>::max_demangled_size] = {0}; + int n = snprintf(num, sizeof(num), FloatData<Float>::spec, value); OB += StringView(num, num + n); - } - } -}; - -using FloatLiteral = FloatLiteralImpl<float>; -using DoubleLiteral = FloatLiteralImpl<double>; -using LongDoubleLiteral = FloatLiteralImpl<long double>; - -/// Visit the node. Calls \c F(P), where \c P is the node cast to the -/// appropriate derived class. -template<typename Fn> -void Node::visit(Fn F) const { - switch (K) { -#define CASE(X) case K ## X: return F(static_cast<const X*>(this)); - FOR_EACH_NODE_KIND(CASE) -#undef CASE - } - assert(0 && "unknown mangling node kind"); -} - -/// Determine the kind of a node from its type. -template<typename NodeT> struct NodeKind; -#define SPECIALIZATION(X) \ - template<> struct NodeKind<X> { \ - static constexpr Node::Kind Kind = Node::K##X; \ - static constexpr const char *name() { return #X; } \ - }; -FOR_EACH_NODE_KIND(SPECIALIZATION) -#undef SPECIALIZATION - -#undef FOR_EACH_NODE_KIND - -template <typename Derived, typename Alloc> struct AbstractManglingParser { - const char *First; - const char *Last; - - // Name stack, this is used by the parser to hold temporary names that were - // parsed. The parser collapses multiple names into new nodes to construct - // the AST. Once the parser is finished, names.size() == 1. - PODSmallVector<Node *, 32> Names; - - // Substitution table. Itanium supports name substitutions as a means of - // compression. The string "S42_" refers to the 44nd entry (base-36) in this - // table. - PODSmallVector<Node *, 32> Subs; - - using TemplateParamList = PODSmallVector<Node *, 8>; - - class ScopedTemplateParamList { - AbstractManglingParser *Parser; - size_t OldNumTemplateParamLists; - TemplateParamList Params; - - public: - ScopedTemplateParamList(AbstractManglingParser *TheParser) - : Parser(TheParser), - OldNumTemplateParamLists(TheParser->TemplateParams.size()) { - Parser->TemplateParams.push_back(&Params); - } - ~ScopedTemplateParamList() { - assert(Parser->TemplateParams.size() >= OldNumTemplateParamLists); - Parser->TemplateParams.dropBack(OldNumTemplateParamLists); - } - }; - - // Template parameter table. Like the above, but referenced like "T42_". - // This has a smaller size compared to Subs and Names because it can be - // stored on the stack. - TemplateParamList OuterTemplateParams; - - // Lists of template parameters indexed by template parameter depth, - // referenced like "TL2_4_". If nonempty, element 0 is always - // OuterTemplateParams; inner elements are always template parameter lists of - // lambda expressions. For a generic lambda with no explicit template - // parameter list, the corresponding parameter list pointer will be null. - PODSmallVector<TemplateParamList *, 4> TemplateParams; - - // Set of unresolved forward <template-param> references. These can occur in a - // conversion operator's type, and are resolved in the enclosing <encoding>. - PODSmallVector<ForwardTemplateReference *, 4> ForwardTemplateRefs; - - bool TryToParseTemplateArgs = true; - bool PermitForwardTemplateReferences = false; - size_t ParsingLambdaParamsAtLevel = (size_t)-1; - - unsigned NumSyntheticTemplateParameters[3] = {}; - - Alloc ASTAllocator; - - AbstractManglingParser(const char *First_, const char *Last_) - : First(First_), Last(Last_) {} - - Derived &getDerived() { return static_cast<Derived &>(*this); } - - void reset(const char *First_, const char *Last_) { - First = First_; - Last = Last_; - Names.clear(); - Subs.clear(); - TemplateParams.clear(); - ParsingLambdaParamsAtLevel = (size_t)-1; - TryToParseTemplateArgs = true; - PermitForwardTemplateReferences = false; - for (int I = 0; I != 3; ++I) - NumSyntheticTemplateParameters[I] = 0; - ASTAllocator.reset(); - } - - template <class T, class... Args> Node *make(Args &&... args) { - return ASTAllocator.template makeNode<T>(std::forward<Args>(args)...); - } - - template <class It> NodeArray makeNodeArray(It begin, It end) { - size_t sz = static_cast<size_t>(end - begin); - void *mem = ASTAllocator.allocateNodeArray(sz); - Node **data = new (mem) Node *[sz]; - std::copy(begin, end, data); - return NodeArray(data, sz); - } - - NodeArray popTrailingNodeArray(size_t FromPosition) { - assert(FromPosition <= Names.size()); - NodeArray res = - makeNodeArray(Names.begin() + (long)FromPosition, Names.end()); - Names.dropBack(FromPosition); - return res; - } - - bool consumeIf(StringView S) { - if (StringView(First, Last).startsWith(S)) { - First += S.size(); - return true; - } - return false; - } - - bool consumeIf(char C) { - if (First != Last && *First == C) { - ++First; - return true; - } - return false; - } - - char consume() { return First != Last ? *First++ : '\0'; } - - char look(unsigned Lookahead = 0) { - if (static_cast<size_t>(Last - First) <= Lookahead) - return '\0'; - return First[Lookahead]; - } - - size_t numLeft() const { return static_cast<size_t>(Last - First); } - - StringView parseNumber(bool AllowNegative = false); - Qualifiers parseCVQualifiers(); - bool parsePositiveInteger(size_t *Out); - StringView parseBareSourceName(); - - bool parseSeqId(size_t *Out); - Node *parseSubstitution(); - Node *parseTemplateParam(); - Node *parseTemplateParamDecl(); - Node *parseTemplateArgs(bool TagTemplates = false); - Node *parseTemplateArg(); - - /// Parse the <expr> production. - Node *parseExpr(); - Node *parsePrefixExpr(StringView Kind); - Node *parseBinaryExpr(StringView Kind); - Node *parseIntegerLiteral(StringView Lit); - Node *parseExprPrimary(); - template <class Float> Node *parseFloatingLiteral(); - Node *parseFunctionParam(); - Node *parseNewExpr(); - Node *parseConversionExpr(); - Node *parseBracedExpr(); - Node *parseFoldExpr(); - Node *parsePointerToMemberConversionExpr(); - Node *parseSubobjectExpr(); - - /// Parse the <type> production. - Node *parseType(); - Node *parseFunctionType(); - Node *parseVectorType(); - Node *parseDecltype(); - Node *parseArrayType(); - Node *parsePointerToMemberType(); - Node *parseClassEnumType(); - Node *parseQualifiedType(); - - Node *parseEncoding(); - bool parseCallOffset(); - Node *parseSpecialName(); - - /// Holds some extra information about a <name> that is being parsed. This - /// information is only pertinent if the <name> refers to an <encoding>. - struct NameState { - bool CtorDtorConversion = false; - bool EndsWithTemplateArgs = false; - Qualifiers CVQualifiers = QualNone; - FunctionRefQual ReferenceQualifier = FrefQualNone; - size_t ForwardTemplateRefsBegin; - - NameState(AbstractManglingParser *Enclosing) - : ForwardTemplateRefsBegin(Enclosing->ForwardTemplateRefs.size()) {} - }; - - bool resolveForwardTemplateRefs(NameState &State) { - size_t I = State.ForwardTemplateRefsBegin; - size_t E = ForwardTemplateRefs.size(); - for (; I < E; ++I) { - size_t Idx = ForwardTemplateRefs[I]->Index; - if (TemplateParams.empty() || !TemplateParams[0] || - Idx >= TemplateParams[0]->size()) - return true; - ForwardTemplateRefs[I]->Ref = (*TemplateParams[0])[Idx]; - } - ForwardTemplateRefs.dropBack(State.ForwardTemplateRefsBegin); - return false; - } - - /// Parse the <name> production> - Node *parseName(NameState *State = nullptr); - Node *parseLocalName(NameState *State); - Node *parseOperatorName(NameState *State); - Node *parseUnqualifiedName(NameState *State); - Node *parseUnnamedTypeName(NameState *State); - Node *parseSourceName(NameState *State); - Node *parseUnscopedName(NameState *State); - Node *parseNestedName(NameState *State); - Node *parseCtorDtorName(Node *&SoFar, NameState *State); - - Node *parseAbiTags(Node *N); - - /// Parse the <unresolved-name> production. - Node *parseUnresolvedName(); - Node *parseSimpleId(); - Node *parseBaseUnresolvedName(); - Node *parseUnresolvedType(); - Node *parseDestructorName(); - - /// Top-level entry point into the parser. - Node *parse(); -}; - -const char* parse_discriminator(const char* first, const char* last); - -// <name> ::= <nested-name> // N -// ::= <local-name> # See Scope Encoding below // Z -// ::= <unscoped-template-name> <template-args> -// ::= <unscoped-name> -// -// <unscoped-template-name> ::= <unscoped-name> -// ::= <substitution> -template <typename Derived, typename Alloc> -Node *AbstractManglingParser<Derived, Alloc>::parseName(NameState *State) { - consumeIf('L'); // extension - - if (look() == 'N') - return getDerived().parseNestedName(State); - if (look() == 'Z') - return getDerived().parseLocalName(State); - - // ::= <unscoped-template-name> <template-args> - if (look() == 'S' && look(1) != 't') { - Node *S = getDerived().parseSubstitution(); - if (S == nullptr) - return nullptr; - if (look() != 'I') - return nullptr; - Node *TA = getDerived().parseTemplateArgs(State != nullptr); - if (TA == nullptr) - return nullptr; - if (State) State->EndsWithTemplateArgs = true; - return make<NameWithTemplateArgs>(S, TA); - } - - Node *N = getDerived().parseUnscopedName(State); - if (N == nullptr) - return nullptr; - // ::= <unscoped-template-name> <template-args> - if (look() == 'I') { - Subs.push_back(N); - Node *TA = getDerived().parseTemplateArgs(State != nullptr); - if (TA == nullptr) - return nullptr; - if (State) State->EndsWithTemplateArgs = true; - return make<NameWithTemplateArgs>(N, TA); - } - // ::= <unscoped-name> - return N; -} - -// <local-name> := Z <function encoding> E <entity name> [<discriminator>] -// := Z <function encoding> E s [<discriminator>] -// := Z <function encoding> Ed [ <parameter number> ] _ <entity name> -template <typename Derived, typename Alloc> -Node *AbstractManglingParser<Derived, Alloc>::parseLocalName(NameState *State) { - if (!consumeIf('Z')) - return nullptr; - Node *Encoding = getDerived().parseEncoding(); - if (Encoding == nullptr || !consumeIf('E')) - return nullptr; - - if (consumeIf('s')) { - First = parse_discriminator(First, Last); - auto *StringLitName = make<NameType>("string literal"); - if (!StringLitName) - return nullptr; - return make<LocalName>(Encoding, StringLitName); - } - - if (consumeIf('d')) { - parseNumber(true); - if (!consumeIf('_')) - return nullptr; - Node *N = getDerived().parseName(State); - if (N == nullptr) - return nullptr; - return make<LocalName>(Encoding, N); - } - - Node *Entity = getDerived().parseName(State); - if (Entity == nullptr) - return nullptr; - First = parse_discriminator(First, Last); - return make<LocalName>(Encoding, Entity); -} - -// <unscoped-name> ::= <unqualified-name> -// ::= St <unqualified-name> # ::std:: -// extension ::= StL<unqualified-name> -template <typename Derived, typename Alloc> -Node * -AbstractManglingParser<Derived, Alloc>::parseUnscopedName(NameState *State) { - if (consumeIf("StL") || consumeIf("St")) { - Node *R = getDerived().parseUnqualifiedName(State); - if (R == nullptr) - return nullptr; - return make<StdQualifiedName>(R); - } - return getDerived().parseUnqualifiedName(State); -} - -// <unqualified-name> ::= <operator-name> [abi-tags] -// ::= <ctor-dtor-name> -// ::= <source-name> -// ::= <unnamed-type-name> -// ::= DC <source-name>+ E # structured binding declaration -template <typename Derived, typename Alloc> -Node * -AbstractManglingParser<Derived, Alloc>::parseUnqualifiedName(NameState *State) { - // <ctor-dtor-name>s are special-cased in parseNestedName(). - Node *Result; - if (look() == 'U') - Result = getDerived().parseUnnamedTypeName(State); - else if (look() >= '1' && look() <= '9') - Result = getDerived().parseSourceName(State); - else if (consumeIf("DC")) { - size_t BindingsBegin = Names.size(); - do { - Node *Binding = getDerived().parseSourceName(State); - if (Binding == nullptr) - return nullptr; - Names.push_back(Binding); - } while (!consumeIf('E')); - Result = make<StructuredBindingName>(popTrailingNodeArray(BindingsBegin)); - } else - Result = getDerived().parseOperatorName(State); - if (Result != nullptr) - Result = getDerived().parseAbiTags(Result); - return Result; -} - -// <unnamed-type-name> ::= Ut [<nonnegative number>] _ -// ::= <closure-type-name> -// -// <closure-type-name> ::= Ul <lambda-sig> E [ <nonnegative number> ] _ -// -// <lambda-sig> ::= <parameter type>+ # Parameter types or "v" if the lambda has no parameters -template <typename Derived, typename Alloc> -Node * -AbstractManglingParser<Derived, Alloc>::parseUnnamedTypeName(NameState *State) { - // <template-params> refer to the innermost <template-args>. Clear out any - // outer args that we may have inserted into TemplateParams. - if (State != nullptr) - TemplateParams.clear(); - - if (consumeIf("Ut")) { - StringView Count = parseNumber(); - if (!consumeIf('_')) - return nullptr; - return make<UnnamedTypeName>(Count); - } - if (consumeIf("Ul")) { - SwapAndRestore<size_t> SwapParams(ParsingLambdaParamsAtLevel, - TemplateParams.size()); - ScopedTemplateParamList LambdaTemplateParams(this); - - size_t ParamsBegin = Names.size(); - while (look() == 'T' && - StringView("yptn").find(look(1)) != StringView::npos) { - Node *T = parseTemplateParamDecl(); - if (!T) - return nullptr; - Names.push_back(T); - } - NodeArray TempParams = popTrailingNodeArray(ParamsBegin); - - // FIXME: If TempParams is empty and none of the function parameters - // includes 'auto', we should remove LambdaTemplateParams from the - // TemplateParams list. Unfortunately, we don't find out whether there are - // any 'auto' parameters until too late in an example such as: - // - // template<typename T> void f( - // decltype([](decltype([]<typename T>(T v) {}), - // auto) {})) {} - // template<typename T> void f( - // decltype([](decltype([]<typename T>(T w) {}), - // int) {})) {} - // - // Here, the type of v is at level 2 but the type of w is at level 1. We - // don't find this out until we encounter the type of the next parameter. - // - // However, compilers can't actually cope with the former example in - // practice, and it's likely to be made ill-formed in future, so we don't - // need to support it here. - // - // If we encounter an 'auto' in the function parameter types, we will - // recreate a template parameter scope for it, but any intervening lambdas - // will be parsed in the 'wrong' template parameter depth. - if (TempParams.empty()) - TemplateParams.pop_back(); - - if (!consumeIf("vE")) { - do { - Node *P = getDerived().parseType(); - if (P == nullptr) - return nullptr; - Names.push_back(P); - } while (!consumeIf('E')); - } - NodeArray Params = popTrailingNodeArray(ParamsBegin); - - StringView Count = parseNumber(); - if (!consumeIf('_')) - return nullptr; - return make<ClosureTypeName>(TempParams, Params, Count); - } - if (consumeIf("Ub")) { - (void)parseNumber(); - if (!consumeIf('_')) - return nullptr; - return make<NameType>("'block-literal'"); - } - return nullptr; -} - -// <source-name> ::= <positive length number> <identifier> -template <typename Derived, typename Alloc> -Node *AbstractManglingParser<Derived, Alloc>::parseSourceName(NameState *) { - size_t Length = 0; - if (parsePositiveInteger(&Length)) - return nullptr; - if (numLeft() < Length || Length == 0) - return nullptr; - StringView Name(First, First + Length); - First += Length; - if (Name.startsWith("_GLOBAL__N")) - return make<NameType>("(anonymous namespace)"); - return make<NameType>(Name); -} - -// <operator-name> ::= aa # && -// ::= ad # & (unary) -// ::= an # & -// ::= aN # &= -// ::= aS # = -// ::= cl # () -// ::= cm # , -// ::= co # ~ -// ::= cv <type> # (cast) -// ::= da # delete[] -// ::= de # * (unary) -// ::= dl # delete -// ::= dv # / -// ::= dV # /= -// ::= eo # ^ -// ::= eO # ^= -// ::= eq # == -// ::= ge # >= -// ::= gt # > -// ::= ix # [] -// ::= le # <= -// ::= li <source-name> # operator "" -// ::= ls # << -// ::= lS # <<= -// ::= lt # < -// ::= mi # - -// ::= mI # -= -// ::= ml # * -// ::= mL # *= -// ::= mm # -- (postfix in <expression> context) -// ::= na # new[] -// ::= ne # != -// ::= ng # - (unary) -// ::= nt # ! -// ::= nw # new -// ::= oo # || -// ::= or # | -// ::= oR # |= -// ::= pm # ->* -// ::= pl # + -// ::= pL # += -// ::= pp # ++ (postfix in <expression> context) -// ::= ps # + (unary) -// ::= pt # -> -// ::= qu # ? -// ::= rm # % -// ::= rM # %= -// ::= rs # >> -// ::= rS # >>= -// ::= ss # <=> C++2a -// ::= v <digit> <source-name> # vendor extended operator -template <typename Derived, typename Alloc> -Node * -AbstractManglingParser<Derived, Alloc>::parseOperatorName(NameState *State) { - switch (look()) { - case 'a': - switch (look(1)) { - case 'a': - First += 2; - return make<NameType>("operator&&"); - case 'd': - case 'n': - First += 2; - return make<NameType>("operator&"); - case 'N': - First += 2; - return make<NameType>("operator&="); - case 'S': - First += 2; - return make<NameType>("operator="); - } - return nullptr; - case 'c': - switch (look(1)) { - case 'l': - First += 2; - return make<NameType>("operator()"); - case 'm': - First += 2; - return make<NameType>("operator,"); - case 'o': - First += 2; - return make<NameType>("operator~"); - // ::= cv <type> # (cast) - case 'v': { - First += 2; - SwapAndRestore<bool> SaveTemplate(TryToParseTemplateArgs, false); - // If we're parsing an encoding, State != nullptr and the conversion - // operators' <type> could have a <template-param> that refers to some - // <template-arg>s further ahead in the mangled name. - SwapAndRestore<bool> SavePermit(PermitForwardTemplateReferences, - PermitForwardTemplateReferences || - State != nullptr); - Node *Ty = getDerived().parseType(); - if (Ty == nullptr) - return nullptr; - if (State) State->CtorDtorConversion = true; - return make<ConversionOperatorType>(Ty); - } - } - return nullptr; - case 'd': - switch (look(1)) { - case 'a': - First += 2; - return make<NameType>("operator delete[]"); - case 'e': - First += 2; - return make<NameType>("operator*"); - case 'l': - First += 2; - return make<NameType>("operator delete"); - case 'v': - First += 2; - return make<NameType>("operator/"); - case 'V': - First += 2; - return make<NameType>("operator/="); - } - return nullptr; - case 'e': - switch (look(1)) { - case 'o': - First += 2; - return make<NameType>("operator^"); - case 'O': - First += 2; - return make<NameType>("operator^="); - case 'q': - First += 2; - return make<NameType>("operator=="); - } - return nullptr; - case 'g': - switch (look(1)) { - case 'e': - First += 2; - return make<NameType>("operator>="); - case 't': - First += 2; - return make<NameType>("operator>"); - } - return nullptr; - case 'i': - if (look(1) == 'x') { - First += 2; - return make<NameType>("operator[]"); - } - return nullptr; - case 'l': - switch (look(1)) { - case 'e': - First += 2; - return make<NameType>("operator<="); - // ::= li <source-name> # operator "" - case 'i': { - First += 2; - Node *SN = getDerived().parseSourceName(State); - if (SN == nullptr) - return nullptr; - return make<LiteralOperator>(SN); - } - case 's': - First += 2; - return make<NameType>("operator<<"); - case 'S': - First += 2; - return make<NameType>("operator<<="); - case 't': - First += 2; - return make<NameType>("operator<"); - } - return nullptr; - case 'm': - switch (look(1)) { - case 'i': - First += 2; - return make<NameType>("operator-"); - case 'I': - First += 2; - return make<NameType>("operator-="); - case 'l': - First += 2; - return make<NameType>("operator*"); - case 'L': - First += 2; - return make<NameType>("operator*="); - case 'm': - First += 2; - return make<NameType>("operator--"); - } - return nullptr; - case 'n': - switch (look(1)) { - case 'a': - First += 2; - return make<NameType>("operator new[]"); - case 'e': - First += 2; - return make<NameType>("operator!="); - case 'g': - First += 2; - return make<NameType>("operator-"); - case 't': - First += 2; - return make<NameType>("operator!"); - case 'w': - First += 2; - return make<NameType>("operator new"); - } - return nullptr; - case 'o': - switch (look(1)) { - case 'o': - First += 2; - return make<NameType>("operator||"); - case 'r': - First += 2; - return make<NameType>("operator|"); - case 'R': - First += 2; - return make<NameType>("operator|="); - } - return nullptr; - case 'p': - switch (look(1)) { - case 'm': - First += 2; - return make<NameType>("operator->*"); - case 'l': - First += 2; - return make<NameType>("operator+"); - case 'L': - First += 2; - return make<NameType>("operator+="); - case 'p': - First += 2; - return make<NameType>("operator++"); - case 's': - First += 2; - return make<NameType>("operator+"); - case 't': - First += 2; - return make<NameType>("operator->"); - } - return nullptr; - case 'q': - if (look(1) == 'u') { - First += 2; - return make<NameType>("operator?"); - } - return nullptr; - case 'r': - switch (look(1)) { - case 'm': - First += 2; - return make<NameType>("operator%"); - case 'M': - First += 2; - return make<NameType>("operator%="); - case 's': - First += 2; - return make<NameType>("operator>>"); - case 'S': - First += 2; - return make<NameType>("operator>>="); - } - return nullptr; - case 's': - if (look(1) == 's') { - First += 2; - return make<NameType>("operator<=>"); - } - return nullptr; - // ::= v <digit> <source-name> # vendor extended operator - case 'v': - if (std::isdigit(look(1))) { - First += 2; - Node *SN = getDerived().parseSourceName(State); - if (SN == nullptr) - return nullptr; - return make<ConversionOperatorType>(SN); - } - return nullptr; - } - return nullptr; -} - -// <ctor-dtor-name> ::= C1 # complete object constructor -// ::= C2 # base object constructor -// ::= C3 # complete object allocating constructor -// extension ::= C4 # gcc old-style "[unified]" constructor -// extension ::= C5 # the COMDAT used for ctors -// ::= D0 # deleting destructor -// ::= D1 # complete object destructor -// ::= D2 # base object destructor -// extension ::= D4 # gcc old-style "[unified]" destructor -// extension ::= D5 # the COMDAT used for dtors -template <typename Derived, typename Alloc> -Node * -AbstractManglingParser<Derived, Alloc>::parseCtorDtorName(Node *&SoFar, - NameState *State) { - if (SoFar->getKind() == Node::KSpecialSubstitution) { - auto SSK = static_cast<SpecialSubstitution *>(SoFar)->SSK; - switch (SSK) { - case SpecialSubKind::string: - case SpecialSubKind::istream: - case SpecialSubKind::ostream: - case SpecialSubKind::iostream: - SoFar = make<ExpandedSpecialSubstitution>(SSK); - if (!SoFar) - return nullptr; - break; - default: - break; - } - } - - if (consumeIf('C')) { - bool IsInherited = consumeIf('I'); - if (look() != '1' && look() != '2' && look() != '3' && look() != '4' && - look() != '5') - return nullptr; - int Variant = look() - '0'; - ++First; - if (State) State->CtorDtorConversion = true; - if (IsInherited) { - if (getDerived().parseName(State) == nullptr) - return nullptr; - } - return make<CtorDtorName>(SoFar, /*IsDtor=*/false, Variant); - } - - if (look() == 'D' && (look(1) == '0' || look(1) == '1' || look(1) == '2' || - look(1) == '4' || look(1) == '5')) { - int Variant = look(1) - '0'; - First += 2; - if (State) State->CtorDtorConversion = true; - return make<CtorDtorName>(SoFar, /*IsDtor=*/true, Variant); - } - - return nullptr; -} - -// <nested-name> ::= N [<CV-Qualifiers>] [<ref-qualifier>] <prefix> <unqualified-name> E -// ::= N [<CV-Qualifiers>] [<ref-qualifier>] <template-prefix> <template-args> E -// -// <prefix> ::= <prefix> <unqualified-name> -// ::= <template-prefix> <template-args> -// ::= <template-param> -// ::= <decltype> -// ::= # empty -// ::= <substitution> -// ::= <prefix> <data-member-prefix> -// extension ::= L -// -// <data-member-prefix> := <member source-name> [<template-args>] M -// -// <template-prefix> ::= <prefix> <template unqualified-name> -// ::= <template-param> -// ::= <substitution> -template <typename Derived, typename Alloc> -Node * -AbstractManglingParser<Derived, Alloc>::parseNestedName(NameState *State) { - if (!consumeIf('N')) - return nullptr; - - Qualifiers CVTmp = parseCVQualifiers(); - if (State) State->CVQualifiers = CVTmp; - - if (consumeIf('O')) { - if (State) State->ReferenceQualifier = FrefQualRValue; - } else if (consumeIf('R')) { - if (State) State->ReferenceQualifier = FrefQualLValue; - } else - if (State) State->ReferenceQualifier = FrefQualNone; - - Node *SoFar = nullptr; - auto PushComponent = [&](Node *Comp) { - if (!Comp) return false; - if (SoFar) SoFar = make<NestedName>(SoFar, Comp); - else SoFar = Comp; - if (State) State->EndsWithTemplateArgs = false; - return SoFar != nullptr; - }; - - if (consumeIf("St")) { - SoFar = make<NameType>("std"); - if (!SoFar) - return nullptr; - } - - while (!consumeIf('E')) { - consumeIf('L'); // extension - - // <data-member-prefix> := <member source-name> [<template-args>] M - if (consumeIf('M')) { - if (SoFar == nullptr) - return nullptr; - continue; - } - - // ::= <template-param> - if (look() == 'T') { - if (!PushComponent(getDerived().parseTemplateParam())) - return nullptr; - Subs.push_back(SoFar); - continue; - } - - // ::= <template-prefix> <template-args> - if (look() == 'I') { - Node *TA = getDerived().parseTemplateArgs(State != nullptr); - if (TA == nullptr || SoFar == nullptr) - return nullptr; - SoFar = make<NameWithTemplateArgs>(SoFar, TA); - if (!SoFar) - return nullptr; - if (State) State->EndsWithTemplateArgs = true; - Subs.push_back(SoFar); - continue; - } - - // ::= <decltype> - if (look() == 'D' && (look(1) == 't' || look(1) == 'T')) { - if (!PushComponent(getDerived().parseDecltype())) - return nullptr; - Subs.push_back(SoFar); - continue; - } - - // ::= <substitution> - if (look() == 'S' && look(1) != 't') { - Node *S = getDerived().parseSubstitution(); - if (!PushComponent(S)) - return nullptr; - if (SoFar != S) - Subs.push_back(S); - continue; - } - - // Parse an <unqualified-name> thats actually a <ctor-dtor-name>. - if (look() == 'C' || (look() == 'D' && look(1) != 'C')) { - if (SoFar == nullptr) - return nullptr; - if (!PushComponent(getDerived().parseCtorDtorName(SoFar, State))) - return nullptr; - SoFar = getDerived().parseAbiTags(SoFar); - if (SoFar == nullptr) - return nullptr; - Subs.push_back(SoFar); - continue; - } - - // ::= <prefix> <unqualified-name> - if (!PushComponent(getDerived().parseUnqualifiedName(State))) - return nullptr; - Subs.push_back(SoFar); - } - - if (SoFar == nullptr || Subs.empty()) - return nullptr; - - Subs.pop_back(); - return SoFar; -} - -// <simple-id> ::= <source-name> [ <template-args> ] -template <typename Derived, typename Alloc> -Node *AbstractManglingParser<Derived, Alloc>::parseSimpleId() { - Node *SN = getDerived().parseSourceName(/*NameState=*/nullptr); - if (SN == nullptr) - return nullptr; - if (look() == 'I') { - Node *TA = getDerived().parseTemplateArgs(); - if (TA == nullptr) - return nullptr; - return make<NameWithTemplateArgs>(SN, TA); - } - return SN; -} - -// <destructor-name> ::= <unresolved-type> # e.g., ~T or ~decltype(f()) -// ::= <simple-id> # e.g., ~A<2*N> -template <typename Derived, typename Alloc> -Node *AbstractManglingParser<Derived, Alloc>::parseDestructorName() { - Node *Result; - if (std::isdigit(look())) - Result = getDerived().parseSimpleId(); - else - Result = getDerived().parseUnresolvedType(); - if (Result == nullptr) - return nullptr; - return make<DtorName>(Result); -} - -// <unresolved-type> ::= <template-param> -// ::= <decltype> -// ::= <substitution> -template <typename Derived, typename Alloc> -Node *AbstractManglingParser<Derived, Alloc>::parseUnresolvedType() { - if (look() == 'T') { - Node *TP = getDerived().parseTemplateParam(); - if (TP == nullptr) - return nullptr; - Subs.push_back(TP); - return TP; - } - if (look() == 'D') { - Node *DT = getDerived().parseDecltype(); - if (DT == nullptr) - return nullptr; - Subs.push_back(DT); - return DT; - } - return getDerived().parseSubstitution(); -} - -// <base-unresolved-name> ::= <simple-id> # unresolved name -// extension ::= <operator-name> # unresolved operator-function-id -// extension ::= <operator-name> <template-args> # unresolved operator template-id -// ::= on <operator-name> # unresolved operator-function-id -// ::= on <operator-name> <template-args> # unresolved operator template-id -// ::= dn <destructor-name> # destructor or pseudo-destructor; -// # e.g. ~X or ~X<N-1> -template <typename Derived, typename Alloc> -Node *AbstractManglingParser<Derived, Alloc>::parseBaseUnresolvedName() { - if (std::isdigit(look())) - return getDerived().parseSimpleId(); - - if (consumeIf("dn")) - return getDerived().parseDestructorName(); - - consumeIf("on"); - - Node *Oper = getDerived().parseOperatorName(/*NameState=*/nullptr); - if (Oper == nullptr) - return nullptr; - if (look() == 'I') { - Node *TA = getDerived().parseTemplateArgs(); - if (TA == nullptr) - return nullptr; - return make<NameWithTemplateArgs>(Oper, TA); - } - return Oper; -} - -// <unresolved-name> -// extension ::= srN <unresolved-type> [<template-args>] <unresolved-qualifier-level>* E <base-unresolved-name> -// ::= [gs] <base-unresolved-name> # x or (with "gs") ::x -// ::= [gs] sr <unresolved-qualifier-level>+ E <base-unresolved-name> -// # A::x, N::y, A<T>::z; "gs" means leading "::" -// ::= sr <unresolved-type> <base-unresolved-name> # T::x / decltype(p)::x -// extension ::= sr <unresolved-type> <template-args> <base-unresolved-name> -// # T::N::x /decltype(p)::N::x -// (ignored) ::= srN <unresolved-type> <unresolved-qualifier-level>+ E <base-unresolved-name> -// -// <unresolved-qualifier-level> ::= <simple-id> -template <typename Derived, typename Alloc> -Node *AbstractManglingParser<Derived, Alloc>::parseUnresolvedName() { - Node *SoFar = nullptr; - - // srN <unresolved-type> [<template-args>] <unresolved-qualifier-level>* E <base-unresolved-name> - // srN <unresolved-type> <unresolved-qualifier-level>+ E <base-unresolved-name> - if (consumeIf("srN")) { - SoFar = getDerived().parseUnresolvedType(); - if (SoFar == nullptr) - return nullptr; - - if (look() == 'I') { - Node *TA = getDerived().parseTemplateArgs(); - if (TA == nullptr) - return nullptr; - SoFar = make<NameWithTemplateArgs>(SoFar, TA); - if (!SoFar) - return nullptr; - } - - while (!consumeIf('E')) { - Node *Qual = getDerived().parseSimpleId(); - if (Qual == nullptr) - return nullptr; - SoFar = make<QualifiedName>(SoFar, Qual); - if (!SoFar) - return nullptr; - } - - Node *Base = getDerived().parseBaseUnresolvedName(); - if (Base == nullptr) - return nullptr; - return make<QualifiedName>(SoFar, Base); - } - - bool Global = consumeIf("gs"); - - // [gs] <base-unresolved-name> # x or (with "gs") ::x - if (!consumeIf("sr")) { - SoFar = getDerived().parseBaseUnresolvedName(); - if (SoFar == nullptr) - return nullptr; - if (Global) - SoFar = make<GlobalQualifiedName>(SoFar); - return SoFar; - } - - // [gs] sr <unresolved-qualifier-level>+ E <base-unresolved-name> - if (std::isdigit(look())) { - do { - Node *Qual = getDerived().parseSimpleId(); - if (Qual == nullptr) - return nullptr; - if (SoFar) - SoFar = make<QualifiedName>(SoFar, Qual); - else if (Global) - SoFar = make<GlobalQualifiedName>(Qual); - else - SoFar = Qual; - if (!SoFar) - return nullptr; - } while (!consumeIf('E')); - } - // sr <unresolved-type> <base-unresolved-name> - // sr <unresolved-type> <template-args> <base-unresolved-name> - else { - SoFar = getDerived().parseUnresolvedType(); - if (SoFar == nullptr) - return nullptr; - - if (look() == 'I') { - Node *TA = getDerived().parseTemplateArgs(); - if (TA == nullptr) - return nullptr; - SoFar = make<NameWithTemplateArgs>(SoFar, TA); - if (!SoFar) - return nullptr; - } - } - - assert(SoFar != nullptr); - - Node *Base = getDerived().parseBaseUnresolvedName(); - if (Base == nullptr) - return nullptr; - return make<QualifiedName>(SoFar, Base); -} - -// <abi-tags> ::= <abi-tag> [<abi-tags>] -// <abi-tag> ::= B <source-name> -template <typename Derived, typename Alloc> -Node *AbstractManglingParser<Derived, Alloc>::parseAbiTags(Node *N) { - while (consumeIf('B')) { - StringView SN = parseBareSourceName(); - if (SN.empty()) - return nullptr; - N = make<AbiTagAttr>(N, SN); - if (!N) - return nullptr; - } - return N; -} - -// <number> ::= [n] <non-negative decimal integer> -template <typename Alloc, typename Derived> -StringView -AbstractManglingParser<Alloc, Derived>::parseNumber(bool AllowNegative) { - const char *Tmp = First; - if (AllowNegative) - consumeIf('n'); - if (numLeft() == 0 || !std::isdigit(*First)) - return StringView(); - while (numLeft() != 0 && std::isdigit(*First)) - ++First; - return StringView(Tmp, First); -} - -// <positive length number> ::= [0-9]* -template <typename Alloc, typename Derived> -bool AbstractManglingParser<Alloc, Derived>::parsePositiveInteger(size_t *Out) { - *Out = 0; - if (look() < '0' || look() > '9') - return true; - while (look() >= '0' && look() <= '9') { - *Out *= 10; - *Out += static_cast<size_t>(consume() - '0'); - } - return false; -} - -template <typename Alloc, typename Derived> -StringView AbstractManglingParser<Alloc, Derived>::parseBareSourceName() { - size_t Int = 0; - if (parsePositiveInteger(&Int) || numLeft() < Int) - return StringView(); - StringView R(First, First + Int); - First += Int; - return R; -} - -// <function-type> ::= [<CV-qualifiers>] [<exception-spec>] [Dx] F [Y] <bare-function-type> [<ref-qualifier>] E -// -// <exception-spec> ::= Do # non-throwing exception-specification (e.g., noexcept, throw()) -// ::= DO <expression> E # computed (instantiation-dependent) noexcept -// ::= Dw <type>+ E # dynamic exception specification with instantiation-dependent types -// -// <ref-qualifier> ::= R # & ref-qualifier -// <ref-qualifier> ::= O # && ref-qualifier -template <typename Derived, typename Alloc> -Node *AbstractManglingParser<Derived, Alloc>::parseFunctionType() { - Qualifiers CVQuals = parseCVQualifiers(); - - Node *ExceptionSpec = nullptr; - if (consumeIf("Do")) { - ExceptionSpec = make<NameType>("noexcept"); - if (!ExceptionSpec) - return nullptr; - } else if (consumeIf("DO")) { - Node *E = getDerived().parseExpr(); - if (E == nullptr || !consumeIf('E')) - return nullptr; - ExceptionSpec = make<NoexceptSpec>(E); - if (!ExceptionSpec) - return nullptr; - } else if (consumeIf("Dw")) { - size_t SpecsBegin = Names.size(); - while (!consumeIf('E')) { - Node *T = getDerived().parseType(); - if (T == nullptr) - return nullptr; - Names.push_back(T); - } - ExceptionSpec = - make<DynamicExceptionSpec>(popTrailingNodeArray(SpecsBegin)); - if (!ExceptionSpec) - return nullptr; - } - - consumeIf("Dx"); // transaction safe - - if (!consumeIf('F')) - return nullptr; - consumeIf('Y'); // extern "C" - Node *ReturnType = getDerived().parseType(); - if (ReturnType == nullptr) - return nullptr; - - FunctionRefQual ReferenceQualifier = FrefQualNone; - size_t ParamsBegin = Names.size(); - while (true) { - if (consumeIf('E')) - break; - if (consumeIf('v')) - continue; - if (consumeIf("RE")) { - ReferenceQualifier = FrefQualLValue; - break; - } - if (consumeIf("OE")) { - ReferenceQualifier = FrefQualRValue; - break; - } - Node *T = getDerived().parseType(); - if (T == nullptr) - return nullptr; - Names.push_back(T); - } - - NodeArray Params = popTrailingNodeArray(ParamsBegin); - return make<FunctionType>(ReturnType, Params, CVQuals, - ReferenceQualifier, ExceptionSpec); -} - -// extension: -// <vector-type> ::= Dv <positive dimension number> _ <extended element type> -// ::= Dv [<dimension expression>] _ <element type> -// <extended element type> ::= <element type> -// ::= p # AltiVec vector pixel -template <typename Derived, typename Alloc> -Node *AbstractManglingParser<Derived, Alloc>::parseVectorType() { - if (!consumeIf("Dv")) - return nullptr; - if (look() >= '1' && look() <= '9') { - Node *DimensionNumber = make<NameType>(parseNumber()); - if (!DimensionNumber) - return nullptr; - if (!consumeIf('_')) - return nullptr; - if (consumeIf('p')) - return make<PixelVectorType>(DimensionNumber); - Node *ElemType = getDerived().parseType(); - if (ElemType == nullptr) - return nullptr; - return make<VectorType>(ElemType, DimensionNumber); - } - - if (!consumeIf('_')) { - Node *DimExpr = getDerived().parseExpr(); - if (!DimExpr) - return nullptr; - if (!consumeIf('_')) - return nullptr; - Node *ElemType = getDerived().parseType(); - if (!ElemType) - return nullptr; - return make<VectorType>(ElemType, DimExpr); - } - Node *ElemType = getDerived().parseType(); - if (!ElemType) - return nullptr; - return make<VectorType>(ElemType, /*Dimension=*/nullptr); -} - -// <decltype> ::= Dt <expression> E # decltype of an id-expression or class member access (C++0x) -// ::= DT <expression> E # decltype of an expression (C++0x) -template <typename Derived, typename Alloc> -Node *AbstractManglingParser<Derived, Alloc>::parseDecltype() { - if (!consumeIf('D')) - return nullptr; - if (!consumeIf('t') && !consumeIf('T')) - return nullptr; - Node *E = getDerived().parseExpr(); - if (E == nullptr) - return nullptr; - if (!consumeIf('E')) - return nullptr; - return make<EnclosingExpr>("decltype(", E, ")"); -} - -// <array-type> ::= A <positive dimension number> _ <element type> -// ::= A [<dimension expression>] _ <element type> -template <typename Derived, typename Alloc> -Node *AbstractManglingParser<Derived, Alloc>::parseArrayType() { - if (!consumeIf('A')) - return nullptr; - - Node *Dimension = nullptr; - - if (std::isdigit(look())) { - Dimension = make<NameType>(parseNumber()); - if (!Dimension) - return nullptr; - if (!consumeIf('_')) - return nullptr; - } else if (!consumeIf('_')) { - Node *DimExpr = getDerived().parseExpr(); - if (DimExpr == nullptr) - return nullptr; - if (!consumeIf('_')) - return nullptr; - Dimension = DimExpr; - } - - Node *Ty = getDerived().parseType(); - if (Ty == nullptr) - return nullptr; - return make<ArrayType>(Ty, Dimension); -} - -// <pointer-to-member-type> ::= M <class type> <member type> -template <typename Derived, typename Alloc> -Node *AbstractManglingParser<Derived, Alloc>::parsePointerToMemberType() { - if (!consumeIf('M')) - return nullptr; - Node *ClassType = getDerived().parseType(); - if (ClassType == nullptr) - return nullptr; - Node *MemberType = getDerived().parseType(); - if (MemberType == nullptr) - return nullptr; - return make<PointerToMemberType>(ClassType, MemberType); -} - -// <class-enum-type> ::= <name> # non-dependent type name, dependent type name, or dependent typename-specifier -// ::= Ts <name> # dependent elaborated type specifier using 'struct' or 'class' -// ::= Tu <name> # dependent elaborated type specifier using 'union' -// ::= Te <name> # dependent elaborated type specifier using 'enum' -template <typename Derived, typename Alloc> -Node *AbstractManglingParser<Derived, Alloc>::parseClassEnumType() { - StringView ElabSpef; - if (consumeIf("Ts")) - ElabSpef = "struct"; - else if (consumeIf("Tu")) - ElabSpef = "union"; - else if (consumeIf("Te")) - ElabSpef = "enum"; - - Node *Name = getDerived().parseName(); - if (Name == nullptr) - return nullptr; - - if (!ElabSpef.empty()) - return make<ElaboratedTypeSpefType>(ElabSpef, Name); - - return Name; -} - -// <qualified-type> ::= <qualifiers> <type> -// <qualifiers> ::= <extended-qualifier>* <CV-qualifiers> -// <extended-qualifier> ::= U <source-name> [<template-args>] # vendor extended type qualifier -template <typename Derived, typename Alloc> -Node *AbstractManglingParser<Derived, Alloc>::parseQualifiedType() { - if (consumeIf('U')) { - StringView Qual = parseBareSourceName(); - if (Qual.empty()) - return nullptr; - - // extension ::= U <objc-name> <objc-type> # objc-type<identifier> - if (Qual.startsWith("objcproto")) { - StringView ProtoSourceName = Qual.dropFront(std::strlen("objcproto")); - StringView Proto; - { - SwapAndRestore<const char *> SaveFirst(First, ProtoSourceName.begin()), - SaveLast(Last, ProtoSourceName.end()); - Proto = parseBareSourceName(); - } - if (Proto.empty()) - return nullptr; - Node *Child = getDerived().parseQualifiedType(); - if (Child == nullptr) - return nullptr; - return make<ObjCProtoName>(Child, Proto); - } - + } + } +}; + +using FloatLiteral = FloatLiteralImpl<float>; +using DoubleLiteral = FloatLiteralImpl<double>; +using LongDoubleLiteral = FloatLiteralImpl<long double>; + +/// Visit the node. Calls \c F(P), where \c P is the node cast to the +/// appropriate derived class. +template<typename Fn> +void Node::visit(Fn F) const { + switch (K) { +#define CASE(X) case K ## X: return F(static_cast<const X*>(this)); + FOR_EACH_NODE_KIND(CASE) +#undef CASE + } + assert(0 && "unknown mangling node kind"); +} + +/// Determine the kind of a node from its type. +template<typename NodeT> struct NodeKind; +#define SPECIALIZATION(X) \ + template<> struct NodeKind<X> { \ + static constexpr Node::Kind Kind = Node::K##X; \ + static constexpr const char *name() { return #X; } \ + }; +FOR_EACH_NODE_KIND(SPECIALIZATION) +#undef SPECIALIZATION + +#undef FOR_EACH_NODE_KIND + +template <typename Derived, typename Alloc> struct AbstractManglingParser { + const char *First; + const char *Last; + + // Name stack, this is used by the parser to hold temporary names that were + // parsed. The parser collapses multiple names into new nodes to construct + // the AST. Once the parser is finished, names.size() == 1. + PODSmallVector<Node *, 32> Names; + + // Substitution table. Itanium supports name substitutions as a means of + // compression. The string "S42_" refers to the 44nd entry (base-36) in this + // table. + PODSmallVector<Node *, 32> Subs; + + using TemplateParamList = PODSmallVector<Node *, 8>; + + class ScopedTemplateParamList { + AbstractManglingParser *Parser; + size_t OldNumTemplateParamLists; + TemplateParamList Params; + + public: + ScopedTemplateParamList(AbstractManglingParser *TheParser) + : Parser(TheParser), + OldNumTemplateParamLists(TheParser->TemplateParams.size()) { + Parser->TemplateParams.push_back(&Params); + } + ~ScopedTemplateParamList() { + assert(Parser->TemplateParams.size() >= OldNumTemplateParamLists); + Parser->TemplateParams.dropBack(OldNumTemplateParamLists); + } + }; + + // Template parameter table. Like the above, but referenced like "T42_". + // This has a smaller size compared to Subs and Names because it can be + // stored on the stack. + TemplateParamList OuterTemplateParams; + + // Lists of template parameters indexed by template parameter depth, + // referenced like "TL2_4_". If nonempty, element 0 is always + // OuterTemplateParams; inner elements are always template parameter lists of + // lambda expressions. For a generic lambda with no explicit template + // parameter list, the corresponding parameter list pointer will be null. + PODSmallVector<TemplateParamList *, 4> TemplateParams; + + // Set of unresolved forward <template-param> references. These can occur in a + // conversion operator's type, and are resolved in the enclosing <encoding>. + PODSmallVector<ForwardTemplateReference *, 4> ForwardTemplateRefs; + + bool TryToParseTemplateArgs = true; + bool PermitForwardTemplateReferences = false; + size_t ParsingLambdaParamsAtLevel = (size_t)-1; + + unsigned NumSyntheticTemplateParameters[3] = {}; + + Alloc ASTAllocator; + + AbstractManglingParser(const char *First_, const char *Last_) + : First(First_), Last(Last_) {} + + Derived &getDerived() { return static_cast<Derived &>(*this); } + + void reset(const char *First_, const char *Last_) { + First = First_; + Last = Last_; + Names.clear(); + Subs.clear(); + TemplateParams.clear(); + ParsingLambdaParamsAtLevel = (size_t)-1; + TryToParseTemplateArgs = true; + PermitForwardTemplateReferences = false; + for (int I = 0; I != 3; ++I) + NumSyntheticTemplateParameters[I] = 0; + ASTAllocator.reset(); + } + + template <class T, class... Args> Node *make(Args &&... args) { + return ASTAllocator.template makeNode<T>(std::forward<Args>(args)...); + } + + template <class It> NodeArray makeNodeArray(It begin, It end) { + size_t sz = static_cast<size_t>(end - begin); + void *mem = ASTAllocator.allocateNodeArray(sz); + Node **data = new (mem) Node *[sz]; + std::copy(begin, end, data); + return NodeArray(data, sz); + } + + NodeArray popTrailingNodeArray(size_t FromPosition) { + assert(FromPosition <= Names.size()); + NodeArray res = + makeNodeArray(Names.begin() + (long)FromPosition, Names.end()); + Names.dropBack(FromPosition); + return res; + } + + bool consumeIf(StringView S) { + if (StringView(First, Last).startsWith(S)) { + First += S.size(); + return true; + } + return false; + } + + bool consumeIf(char C) { + if (First != Last && *First == C) { + ++First; + return true; + } + return false; + } + + char consume() { return First != Last ? *First++ : '\0'; } + + char look(unsigned Lookahead = 0) { + if (static_cast<size_t>(Last - First) <= Lookahead) + return '\0'; + return First[Lookahead]; + } + + size_t numLeft() const { return static_cast<size_t>(Last - First); } + + StringView parseNumber(bool AllowNegative = false); + Qualifiers parseCVQualifiers(); + bool parsePositiveInteger(size_t *Out); + StringView parseBareSourceName(); + + bool parseSeqId(size_t *Out); + Node *parseSubstitution(); + Node *parseTemplateParam(); + Node *parseTemplateParamDecl(); + Node *parseTemplateArgs(bool TagTemplates = false); + Node *parseTemplateArg(); + + /// Parse the <expr> production. + Node *parseExpr(); + Node *parsePrefixExpr(StringView Kind); + Node *parseBinaryExpr(StringView Kind); + Node *parseIntegerLiteral(StringView Lit); + Node *parseExprPrimary(); + template <class Float> Node *parseFloatingLiteral(); + Node *parseFunctionParam(); + Node *parseNewExpr(); + Node *parseConversionExpr(); + Node *parseBracedExpr(); + Node *parseFoldExpr(); + Node *parsePointerToMemberConversionExpr(); + Node *parseSubobjectExpr(); + + /// Parse the <type> production. + Node *parseType(); + Node *parseFunctionType(); + Node *parseVectorType(); + Node *parseDecltype(); + Node *parseArrayType(); + Node *parsePointerToMemberType(); + Node *parseClassEnumType(); + Node *parseQualifiedType(); + + Node *parseEncoding(); + bool parseCallOffset(); + Node *parseSpecialName(); + + /// Holds some extra information about a <name> that is being parsed. This + /// information is only pertinent if the <name> refers to an <encoding>. + struct NameState { + bool CtorDtorConversion = false; + bool EndsWithTemplateArgs = false; + Qualifiers CVQualifiers = QualNone; + FunctionRefQual ReferenceQualifier = FrefQualNone; + size_t ForwardTemplateRefsBegin; + + NameState(AbstractManglingParser *Enclosing) + : ForwardTemplateRefsBegin(Enclosing->ForwardTemplateRefs.size()) {} + }; + + bool resolveForwardTemplateRefs(NameState &State) { + size_t I = State.ForwardTemplateRefsBegin; + size_t E = ForwardTemplateRefs.size(); + for (; I < E; ++I) { + size_t Idx = ForwardTemplateRefs[I]->Index; + if (TemplateParams.empty() || !TemplateParams[0] || + Idx >= TemplateParams[0]->size()) + return true; + ForwardTemplateRefs[I]->Ref = (*TemplateParams[0])[Idx]; + } + ForwardTemplateRefs.dropBack(State.ForwardTemplateRefsBegin); + return false; + } + + /// Parse the <name> production> + Node *parseName(NameState *State = nullptr); + Node *parseLocalName(NameState *State); + Node *parseOperatorName(NameState *State); + Node *parseUnqualifiedName(NameState *State); + Node *parseUnnamedTypeName(NameState *State); + Node *parseSourceName(NameState *State); + Node *parseUnscopedName(NameState *State); + Node *parseNestedName(NameState *State); + Node *parseCtorDtorName(Node *&SoFar, NameState *State); + + Node *parseAbiTags(Node *N); + + /// Parse the <unresolved-name> production. + Node *parseUnresolvedName(); + Node *parseSimpleId(); + Node *parseBaseUnresolvedName(); + Node *parseUnresolvedType(); + Node *parseDestructorName(); + + /// Top-level entry point into the parser. + Node *parse(); +}; + +const char* parse_discriminator(const char* first, const char* last); + +// <name> ::= <nested-name> // N +// ::= <local-name> # See Scope Encoding below // Z +// ::= <unscoped-template-name> <template-args> +// ::= <unscoped-name> +// +// <unscoped-template-name> ::= <unscoped-name> +// ::= <substitution> +template <typename Derived, typename Alloc> +Node *AbstractManglingParser<Derived, Alloc>::parseName(NameState *State) { + consumeIf('L'); // extension + + if (look() == 'N') + return getDerived().parseNestedName(State); + if (look() == 'Z') + return getDerived().parseLocalName(State); + + // ::= <unscoped-template-name> <template-args> + if (look() == 'S' && look(1) != 't') { + Node *S = getDerived().parseSubstitution(); + if (S == nullptr) + return nullptr; + if (look() != 'I') + return nullptr; + Node *TA = getDerived().parseTemplateArgs(State != nullptr); + if (TA == nullptr) + return nullptr; + if (State) State->EndsWithTemplateArgs = true; + return make<NameWithTemplateArgs>(S, TA); + } + + Node *N = getDerived().parseUnscopedName(State); + if (N == nullptr) + return nullptr; + // ::= <unscoped-template-name> <template-args> + if (look() == 'I') { + Subs.push_back(N); + Node *TA = getDerived().parseTemplateArgs(State != nullptr); + if (TA == nullptr) + return nullptr; + if (State) State->EndsWithTemplateArgs = true; + return make<NameWithTemplateArgs>(N, TA); + } + // ::= <unscoped-name> + return N; +} + +// <local-name> := Z <function encoding> E <entity name> [<discriminator>] +// := Z <function encoding> E s [<discriminator>] +// := Z <function encoding> Ed [ <parameter number> ] _ <entity name> +template <typename Derived, typename Alloc> +Node *AbstractManglingParser<Derived, Alloc>::parseLocalName(NameState *State) { + if (!consumeIf('Z')) + return nullptr; + Node *Encoding = getDerived().parseEncoding(); + if (Encoding == nullptr || !consumeIf('E')) + return nullptr; + + if (consumeIf('s')) { + First = parse_discriminator(First, Last); + auto *StringLitName = make<NameType>("string literal"); + if (!StringLitName) + return nullptr; + return make<LocalName>(Encoding, StringLitName); + } + + if (consumeIf('d')) { + parseNumber(true); + if (!consumeIf('_')) + return nullptr; + Node *N = getDerived().parseName(State); + if (N == nullptr) + return nullptr; + return make<LocalName>(Encoding, N); + } + + Node *Entity = getDerived().parseName(State); + if (Entity == nullptr) + return nullptr; + First = parse_discriminator(First, Last); + return make<LocalName>(Encoding, Entity); +} + +// <unscoped-name> ::= <unqualified-name> +// ::= St <unqualified-name> # ::std:: +// extension ::= StL<unqualified-name> +template <typename Derived, typename Alloc> +Node * +AbstractManglingParser<Derived, Alloc>::parseUnscopedName(NameState *State) { + if (consumeIf("StL") || consumeIf("St")) { + Node *R = getDerived().parseUnqualifiedName(State); + if (R == nullptr) + return nullptr; + return make<StdQualifiedName>(R); + } + return getDerived().parseUnqualifiedName(State); +} + +// <unqualified-name> ::= <operator-name> [abi-tags] +// ::= <ctor-dtor-name> +// ::= <source-name> +// ::= <unnamed-type-name> +// ::= DC <source-name>+ E # structured binding declaration +template <typename Derived, typename Alloc> +Node * +AbstractManglingParser<Derived, Alloc>::parseUnqualifiedName(NameState *State) { + // <ctor-dtor-name>s are special-cased in parseNestedName(). + Node *Result; + if (look() == 'U') + Result = getDerived().parseUnnamedTypeName(State); + else if (look() >= '1' && look() <= '9') + Result = getDerived().parseSourceName(State); + else if (consumeIf("DC")) { + size_t BindingsBegin = Names.size(); + do { + Node *Binding = getDerived().parseSourceName(State); + if (Binding == nullptr) + return nullptr; + Names.push_back(Binding); + } while (!consumeIf('E')); + Result = make<StructuredBindingName>(popTrailingNodeArray(BindingsBegin)); + } else + Result = getDerived().parseOperatorName(State); + if (Result != nullptr) + Result = getDerived().parseAbiTags(Result); + return Result; +} + +// <unnamed-type-name> ::= Ut [<nonnegative number>] _ +// ::= <closure-type-name> +// +// <closure-type-name> ::= Ul <lambda-sig> E [ <nonnegative number> ] _ +// +// <lambda-sig> ::= <parameter type>+ # Parameter types or "v" if the lambda has no parameters +template <typename Derived, typename Alloc> +Node * +AbstractManglingParser<Derived, Alloc>::parseUnnamedTypeName(NameState *State) { + // <template-params> refer to the innermost <template-args>. Clear out any + // outer args that we may have inserted into TemplateParams. + if (State != nullptr) + TemplateParams.clear(); + + if (consumeIf("Ut")) { + StringView Count = parseNumber(); + if (!consumeIf('_')) + return nullptr; + return make<UnnamedTypeName>(Count); + } + if (consumeIf("Ul")) { + SwapAndRestore<size_t> SwapParams(ParsingLambdaParamsAtLevel, + TemplateParams.size()); + ScopedTemplateParamList LambdaTemplateParams(this); + + size_t ParamsBegin = Names.size(); + while (look() == 'T' && + StringView("yptn").find(look(1)) != StringView::npos) { + Node *T = parseTemplateParamDecl(); + if (!T) + return nullptr; + Names.push_back(T); + } + NodeArray TempParams = popTrailingNodeArray(ParamsBegin); + + // FIXME: If TempParams is empty and none of the function parameters + // includes 'auto', we should remove LambdaTemplateParams from the + // TemplateParams list. Unfortunately, we don't find out whether there are + // any 'auto' parameters until too late in an example such as: + // + // template<typename T> void f( + // decltype([](decltype([]<typename T>(T v) {}), + // auto) {})) {} + // template<typename T> void f( + // decltype([](decltype([]<typename T>(T w) {}), + // int) {})) {} + // + // Here, the type of v is at level 2 but the type of w is at level 1. We + // don't find this out until we encounter the type of the next parameter. + // + // However, compilers can't actually cope with the former example in + // practice, and it's likely to be made ill-formed in future, so we don't + // need to support it here. + // + // If we encounter an 'auto' in the function parameter types, we will + // recreate a template parameter scope for it, but any intervening lambdas + // will be parsed in the 'wrong' template parameter depth. + if (TempParams.empty()) + TemplateParams.pop_back(); + + if (!consumeIf("vE")) { + do { + Node *P = getDerived().parseType(); + if (P == nullptr) + return nullptr; + Names.push_back(P); + } while (!consumeIf('E')); + } + NodeArray Params = popTrailingNodeArray(ParamsBegin); + + StringView Count = parseNumber(); + if (!consumeIf('_')) + return nullptr; + return make<ClosureTypeName>(TempParams, Params, Count); + } + if (consumeIf("Ub")) { + (void)parseNumber(); + if (!consumeIf('_')) + return nullptr; + return make<NameType>("'block-literal'"); + } + return nullptr; +} + +// <source-name> ::= <positive length number> <identifier> +template <typename Derived, typename Alloc> +Node *AbstractManglingParser<Derived, Alloc>::parseSourceName(NameState *) { + size_t Length = 0; + if (parsePositiveInteger(&Length)) + return nullptr; + if (numLeft() < Length || Length == 0) + return nullptr; + StringView Name(First, First + Length); + First += Length; + if (Name.startsWith("_GLOBAL__N")) + return make<NameType>("(anonymous namespace)"); + return make<NameType>(Name); +} + +// <operator-name> ::= aa # && +// ::= ad # & (unary) +// ::= an # & +// ::= aN # &= +// ::= aS # = +// ::= cl # () +// ::= cm # , +// ::= co # ~ +// ::= cv <type> # (cast) +// ::= da # delete[] +// ::= de # * (unary) +// ::= dl # delete +// ::= dv # / +// ::= dV # /= +// ::= eo # ^ +// ::= eO # ^= +// ::= eq # == +// ::= ge # >= +// ::= gt # > +// ::= ix # [] +// ::= le # <= +// ::= li <source-name> # operator "" +// ::= ls # << +// ::= lS # <<= +// ::= lt # < +// ::= mi # - +// ::= mI # -= +// ::= ml # * +// ::= mL # *= +// ::= mm # -- (postfix in <expression> context) +// ::= na # new[] +// ::= ne # != +// ::= ng # - (unary) +// ::= nt # ! +// ::= nw # new +// ::= oo # || +// ::= or # | +// ::= oR # |= +// ::= pm # ->* +// ::= pl # + +// ::= pL # += +// ::= pp # ++ (postfix in <expression> context) +// ::= ps # + (unary) +// ::= pt # -> +// ::= qu # ? +// ::= rm # % +// ::= rM # %= +// ::= rs # >> +// ::= rS # >>= +// ::= ss # <=> C++2a +// ::= v <digit> <source-name> # vendor extended operator +template <typename Derived, typename Alloc> +Node * +AbstractManglingParser<Derived, Alloc>::parseOperatorName(NameState *State) { + switch (look()) { + case 'a': + switch (look(1)) { + case 'a': + First += 2; + return make<NameType>("operator&&"); + case 'd': + case 'n': + First += 2; + return make<NameType>("operator&"); + case 'N': + First += 2; + return make<NameType>("operator&="); + case 'S': + First += 2; + return make<NameType>("operator="); + } + return nullptr; + case 'c': + switch (look(1)) { + case 'l': + First += 2; + return make<NameType>("operator()"); + case 'm': + First += 2; + return make<NameType>("operator,"); + case 'o': + First += 2; + return make<NameType>("operator~"); + // ::= cv <type> # (cast) + case 'v': { + First += 2; + SwapAndRestore<bool> SaveTemplate(TryToParseTemplateArgs, false); + // If we're parsing an encoding, State != nullptr and the conversion + // operators' <type> could have a <template-param> that refers to some + // <template-arg>s further ahead in the mangled name. + SwapAndRestore<bool> SavePermit(PermitForwardTemplateReferences, + PermitForwardTemplateReferences || + State != nullptr); + Node *Ty = getDerived().parseType(); + if (Ty == nullptr) + return nullptr; + if (State) State->CtorDtorConversion = true; + return make<ConversionOperatorType>(Ty); + } + } + return nullptr; + case 'd': + switch (look(1)) { + case 'a': + First += 2; + return make<NameType>("operator delete[]"); + case 'e': + First += 2; + return make<NameType>("operator*"); + case 'l': + First += 2; + return make<NameType>("operator delete"); + case 'v': + First += 2; + return make<NameType>("operator/"); + case 'V': + First += 2; + return make<NameType>("operator/="); + } + return nullptr; + case 'e': + switch (look(1)) { + case 'o': + First += 2; + return make<NameType>("operator^"); + case 'O': + First += 2; + return make<NameType>("operator^="); + case 'q': + First += 2; + return make<NameType>("operator=="); + } + return nullptr; + case 'g': + switch (look(1)) { + case 'e': + First += 2; + return make<NameType>("operator>="); + case 't': + First += 2; + return make<NameType>("operator>"); + } + return nullptr; + case 'i': + if (look(1) == 'x') { + First += 2; + return make<NameType>("operator[]"); + } + return nullptr; + case 'l': + switch (look(1)) { + case 'e': + First += 2; + return make<NameType>("operator<="); + // ::= li <source-name> # operator "" + case 'i': { + First += 2; + Node *SN = getDerived().parseSourceName(State); + if (SN == nullptr) + return nullptr; + return make<LiteralOperator>(SN); + } + case 's': + First += 2; + return make<NameType>("operator<<"); + case 'S': + First += 2; + return make<NameType>("operator<<="); + case 't': + First += 2; + return make<NameType>("operator<"); + } + return nullptr; + case 'm': + switch (look(1)) { + case 'i': + First += 2; + return make<NameType>("operator-"); + case 'I': + First += 2; + return make<NameType>("operator-="); + case 'l': + First += 2; + return make<NameType>("operator*"); + case 'L': + First += 2; + return make<NameType>("operator*="); + case 'm': + First += 2; + return make<NameType>("operator--"); + } + return nullptr; + case 'n': + switch (look(1)) { + case 'a': + First += 2; + return make<NameType>("operator new[]"); + case 'e': + First += 2; + return make<NameType>("operator!="); + case 'g': + First += 2; + return make<NameType>("operator-"); + case 't': + First += 2; + return make<NameType>("operator!"); + case 'w': + First += 2; + return make<NameType>("operator new"); + } + return nullptr; + case 'o': + switch (look(1)) { + case 'o': + First += 2; + return make<NameType>("operator||"); + case 'r': + First += 2; + return make<NameType>("operator|"); + case 'R': + First += 2; + return make<NameType>("operator|="); + } + return nullptr; + case 'p': + switch (look(1)) { + case 'm': + First += 2; + return make<NameType>("operator->*"); + case 'l': + First += 2; + return make<NameType>("operator+"); + case 'L': + First += 2; + return make<NameType>("operator+="); + case 'p': + First += 2; + return make<NameType>("operator++"); + case 's': + First += 2; + return make<NameType>("operator+"); + case 't': + First += 2; + return make<NameType>("operator->"); + } + return nullptr; + case 'q': + if (look(1) == 'u') { + First += 2; + return make<NameType>("operator?"); + } + return nullptr; + case 'r': + switch (look(1)) { + case 'm': + First += 2; + return make<NameType>("operator%"); + case 'M': + First += 2; + return make<NameType>("operator%="); + case 's': + First += 2; + return make<NameType>("operator>>"); + case 'S': + First += 2; + return make<NameType>("operator>>="); + } + return nullptr; + case 's': + if (look(1) == 's') { + First += 2; + return make<NameType>("operator<=>"); + } + return nullptr; + // ::= v <digit> <source-name> # vendor extended operator + case 'v': + if (std::isdigit(look(1))) { + First += 2; + Node *SN = getDerived().parseSourceName(State); + if (SN == nullptr) + return nullptr; + return make<ConversionOperatorType>(SN); + } + return nullptr; + } + return nullptr; +} + +// <ctor-dtor-name> ::= C1 # complete object constructor +// ::= C2 # base object constructor +// ::= C3 # complete object allocating constructor +// extension ::= C4 # gcc old-style "[unified]" constructor +// extension ::= C5 # the COMDAT used for ctors +// ::= D0 # deleting destructor +// ::= D1 # complete object destructor +// ::= D2 # base object destructor +// extension ::= D4 # gcc old-style "[unified]" destructor +// extension ::= D5 # the COMDAT used for dtors +template <typename Derived, typename Alloc> +Node * +AbstractManglingParser<Derived, Alloc>::parseCtorDtorName(Node *&SoFar, + NameState *State) { + if (SoFar->getKind() == Node::KSpecialSubstitution) { + auto SSK = static_cast<SpecialSubstitution *>(SoFar)->SSK; + switch (SSK) { + case SpecialSubKind::string: + case SpecialSubKind::istream: + case SpecialSubKind::ostream: + case SpecialSubKind::iostream: + SoFar = make<ExpandedSpecialSubstitution>(SSK); + if (!SoFar) + return nullptr; + break; + default: + break; + } + } + + if (consumeIf('C')) { + bool IsInherited = consumeIf('I'); + if (look() != '1' && look() != '2' && look() != '3' && look() != '4' && + look() != '5') + return nullptr; + int Variant = look() - '0'; + ++First; + if (State) State->CtorDtorConversion = true; + if (IsInherited) { + if (getDerived().parseName(State) == nullptr) + return nullptr; + } + return make<CtorDtorName>(SoFar, /*IsDtor=*/false, Variant); + } + + if (look() == 'D' && (look(1) == '0' || look(1) == '1' || look(1) == '2' || + look(1) == '4' || look(1) == '5')) { + int Variant = look(1) - '0'; + First += 2; + if (State) State->CtorDtorConversion = true; + return make<CtorDtorName>(SoFar, /*IsDtor=*/true, Variant); + } + + return nullptr; +} + +// <nested-name> ::= N [<CV-Qualifiers>] [<ref-qualifier>] <prefix> <unqualified-name> E +// ::= N [<CV-Qualifiers>] [<ref-qualifier>] <template-prefix> <template-args> E +// +// <prefix> ::= <prefix> <unqualified-name> +// ::= <template-prefix> <template-args> +// ::= <template-param> +// ::= <decltype> +// ::= # empty +// ::= <substitution> +// ::= <prefix> <data-member-prefix> +// extension ::= L +// +// <data-member-prefix> := <member source-name> [<template-args>] M +// +// <template-prefix> ::= <prefix> <template unqualified-name> +// ::= <template-param> +// ::= <substitution> +template <typename Derived, typename Alloc> +Node * +AbstractManglingParser<Derived, Alloc>::parseNestedName(NameState *State) { + if (!consumeIf('N')) + return nullptr; + + Qualifiers CVTmp = parseCVQualifiers(); + if (State) State->CVQualifiers = CVTmp; + + if (consumeIf('O')) { + if (State) State->ReferenceQualifier = FrefQualRValue; + } else if (consumeIf('R')) { + if (State) State->ReferenceQualifier = FrefQualLValue; + } else + if (State) State->ReferenceQualifier = FrefQualNone; + + Node *SoFar = nullptr; + auto PushComponent = [&](Node *Comp) { + if (!Comp) return false; + if (SoFar) SoFar = make<NestedName>(SoFar, Comp); + else SoFar = Comp; + if (State) State->EndsWithTemplateArgs = false; + return SoFar != nullptr; + }; + + if (consumeIf("St")) { + SoFar = make<NameType>("std"); + if (!SoFar) + return nullptr; + } + + while (!consumeIf('E')) { + consumeIf('L'); // extension + + // <data-member-prefix> := <member source-name> [<template-args>] M + if (consumeIf('M')) { + if (SoFar == nullptr) + return nullptr; + continue; + } + + // ::= <template-param> + if (look() == 'T') { + if (!PushComponent(getDerived().parseTemplateParam())) + return nullptr; + Subs.push_back(SoFar); + continue; + } + + // ::= <template-prefix> <template-args> + if (look() == 'I') { + Node *TA = getDerived().parseTemplateArgs(State != nullptr); + if (TA == nullptr || SoFar == nullptr) + return nullptr; + SoFar = make<NameWithTemplateArgs>(SoFar, TA); + if (!SoFar) + return nullptr; + if (State) State->EndsWithTemplateArgs = true; + Subs.push_back(SoFar); + continue; + } + + // ::= <decltype> + if (look() == 'D' && (look(1) == 't' || look(1) == 'T')) { + if (!PushComponent(getDerived().parseDecltype())) + return nullptr; + Subs.push_back(SoFar); + continue; + } + + // ::= <substitution> + if (look() == 'S' && look(1) != 't') { + Node *S = getDerived().parseSubstitution(); + if (!PushComponent(S)) + return nullptr; + if (SoFar != S) + Subs.push_back(S); + continue; + } + + // Parse an <unqualified-name> thats actually a <ctor-dtor-name>. + if (look() == 'C' || (look() == 'D' && look(1) != 'C')) { + if (SoFar == nullptr) + return nullptr; + if (!PushComponent(getDerived().parseCtorDtorName(SoFar, State))) + return nullptr; + SoFar = getDerived().parseAbiTags(SoFar); + if (SoFar == nullptr) + return nullptr; + Subs.push_back(SoFar); + continue; + } + + // ::= <prefix> <unqualified-name> + if (!PushComponent(getDerived().parseUnqualifiedName(State))) + return nullptr; + Subs.push_back(SoFar); + } + + if (SoFar == nullptr || Subs.empty()) + return nullptr; + + Subs.pop_back(); + return SoFar; +} + +// <simple-id> ::= <source-name> [ <template-args> ] +template <typename Derived, typename Alloc> +Node *AbstractManglingParser<Derived, Alloc>::parseSimpleId() { + Node *SN = getDerived().parseSourceName(/*NameState=*/nullptr); + if (SN == nullptr) + return nullptr; + if (look() == 'I') { + Node *TA = getDerived().parseTemplateArgs(); + if (TA == nullptr) + return nullptr; + return make<NameWithTemplateArgs>(SN, TA); + } + return SN; +} + +// <destructor-name> ::= <unresolved-type> # e.g., ~T or ~decltype(f()) +// ::= <simple-id> # e.g., ~A<2*N> +template <typename Derived, typename Alloc> +Node *AbstractManglingParser<Derived, Alloc>::parseDestructorName() { + Node *Result; + if (std::isdigit(look())) + Result = getDerived().parseSimpleId(); + else + Result = getDerived().parseUnresolvedType(); + if (Result == nullptr) + return nullptr; + return make<DtorName>(Result); +} + +// <unresolved-type> ::= <template-param> +// ::= <decltype> +// ::= <substitution> +template <typename Derived, typename Alloc> +Node *AbstractManglingParser<Derived, Alloc>::parseUnresolvedType() { + if (look() == 'T') { + Node *TP = getDerived().parseTemplateParam(); + if (TP == nullptr) + return nullptr; + Subs.push_back(TP); + return TP; + } + if (look() == 'D') { + Node *DT = getDerived().parseDecltype(); + if (DT == nullptr) + return nullptr; + Subs.push_back(DT); + return DT; + } + return getDerived().parseSubstitution(); +} + +// <base-unresolved-name> ::= <simple-id> # unresolved name +// extension ::= <operator-name> # unresolved operator-function-id +// extension ::= <operator-name> <template-args> # unresolved operator template-id +// ::= on <operator-name> # unresolved operator-function-id +// ::= on <operator-name> <template-args> # unresolved operator template-id +// ::= dn <destructor-name> # destructor or pseudo-destructor; +// # e.g. ~X or ~X<N-1> +template <typename Derived, typename Alloc> +Node *AbstractManglingParser<Derived, Alloc>::parseBaseUnresolvedName() { + if (std::isdigit(look())) + return getDerived().parseSimpleId(); + + if (consumeIf("dn")) + return getDerived().parseDestructorName(); + + consumeIf("on"); + + Node *Oper = getDerived().parseOperatorName(/*NameState=*/nullptr); + if (Oper == nullptr) + return nullptr; + if (look() == 'I') { + Node *TA = getDerived().parseTemplateArgs(); + if (TA == nullptr) + return nullptr; + return make<NameWithTemplateArgs>(Oper, TA); + } + return Oper; +} + +// <unresolved-name> +// extension ::= srN <unresolved-type> [<template-args>] <unresolved-qualifier-level>* E <base-unresolved-name> +// ::= [gs] <base-unresolved-name> # x or (with "gs") ::x +// ::= [gs] sr <unresolved-qualifier-level>+ E <base-unresolved-name> +// # A::x, N::y, A<T>::z; "gs" means leading "::" +// ::= sr <unresolved-type> <base-unresolved-name> # T::x / decltype(p)::x +// extension ::= sr <unresolved-type> <template-args> <base-unresolved-name> +// # T::N::x /decltype(p)::N::x +// (ignored) ::= srN <unresolved-type> <unresolved-qualifier-level>+ E <base-unresolved-name> +// +// <unresolved-qualifier-level> ::= <simple-id> +template <typename Derived, typename Alloc> +Node *AbstractManglingParser<Derived, Alloc>::parseUnresolvedName() { + Node *SoFar = nullptr; + + // srN <unresolved-type> [<template-args>] <unresolved-qualifier-level>* E <base-unresolved-name> + // srN <unresolved-type> <unresolved-qualifier-level>+ E <base-unresolved-name> + if (consumeIf("srN")) { + SoFar = getDerived().parseUnresolvedType(); + if (SoFar == nullptr) + return nullptr; + + if (look() == 'I') { + Node *TA = getDerived().parseTemplateArgs(); + if (TA == nullptr) + return nullptr; + SoFar = make<NameWithTemplateArgs>(SoFar, TA); + if (!SoFar) + return nullptr; + } + + while (!consumeIf('E')) { + Node *Qual = getDerived().parseSimpleId(); + if (Qual == nullptr) + return nullptr; + SoFar = make<QualifiedName>(SoFar, Qual); + if (!SoFar) + return nullptr; + } + + Node *Base = getDerived().parseBaseUnresolvedName(); + if (Base == nullptr) + return nullptr; + return make<QualifiedName>(SoFar, Base); + } + + bool Global = consumeIf("gs"); + + // [gs] <base-unresolved-name> # x or (with "gs") ::x + if (!consumeIf("sr")) { + SoFar = getDerived().parseBaseUnresolvedName(); + if (SoFar == nullptr) + return nullptr; + if (Global) + SoFar = make<GlobalQualifiedName>(SoFar); + return SoFar; + } + + // [gs] sr <unresolved-qualifier-level>+ E <base-unresolved-name> + if (std::isdigit(look())) { + do { + Node *Qual = getDerived().parseSimpleId(); + if (Qual == nullptr) + return nullptr; + if (SoFar) + SoFar = make<QualifiedName>(SoFar, Qual); + else if (Global) + SoFar = make<GlobalQualifiedName>(Qual); + else + SoFar = Qual; + if (!SoFar) + return nullptr; + } while (!consumeIf('E')); + } + // sr <unresolved-type> <base-unresolved-name> + // sr <unresolved-type> <template-args> <base-unresolved-name> + else { + SoFar = getDerived().parseUnresolvedType(); + if (SoFar == nullptr) + return nullptr; + + if (look() == 'I') { + Node *TA = getDerived().parseTemplateArgs(); + if (TA == nullptr) + return nullptr; + SoFar = make<NameWithTemplateArgs>(SoFar, TA); + if (!SoFar) + return nullptr; + } + } + + assert(SoFar != nullptr); + + Node *Base = getDerived().parseBaseUnresolvedName(); + if (Base == nullptr) + return nullptr; + return make<QualifiedName>(SoFar, Base); +} + +// <abi-tags> ::= <abi-tag> [<abi-tags>] +// <abi-tag> ::= B <source-name> +template <typename Derived, typename Alloc> +Node *AbstractManglingParser<Derived, Alloc>::parseAbiTags(Node *N) { + while (consumeIf('B')) { + StringView SN = parseBareSourceName(); + if (SN.empty()) + return nullptr; + N = make<AbiTagAttr>(N, SN); + if (!N) + return nullptr; + } + return N; +} + +// <number> ::= [n] <non-negative decimal integer> +template <typename Alloc, typename Derived> +StringView +AbstractManglingParser<Alloc, Derived>::parseNumber(bool AllowNegative) { + const char *Tmp = First; + if (AllowNegative) + consumeIf('n'); + if (numLeft() == 0 || !std::isdigit(*First)) + return StringView(); + while (numLeft() != 0 && std::isdigit(*First)) + ++First; + return StringView(Tmp, First); +} + +// <positive length number> ::= [0-9]* +template <typename Alloc, typename Derived> +bool AbstractManglingParser<Alloc, Derived>::parsePositiveInteger(size_t *Out) { + *Out = 0; + if (look() < '0' || look() > '9') + return true; + while (look() >= '0' && look() <= '9') { + *Out *= 10; + *Out += static_cast<size_t>(consume() - '0'); + } + return false; +} + +template <typename Alloc, typename Derived> +StringView AbstractManglingParser<Alloc, Derived>::parseBareSourceName() { + size_t Int = 0; + if (parsePositiveInteger(&Int) || numLeft() < Int) + return StringView(); + StringView R(First, First + Int); + First += Int; + return R; +} + +// <function-type> ::= [<CV-qualifiers>] [<exception-spec>] [Dx] F [Y] <bare-function-type> [<ref-qualifier>] E +// +// <exception-spec> ::= Do # non-throwing exception-specification (e.g., noexcept, throw()) +// ::= DO <expression> E # computed (instantiation-dependent) noexcept +// ::= Dw <type>+ E # dynamic exception specification with instantiation-dependent types +// +// <ref-qualifier> ::= R # & ref-qualifier +// <ref-qualifier> ::= O # && ref-qualifier +template <typename Derived, typename Alloc> +Node *AbstractManglingParser<Derived, Alloc>::parseFunctionType() { + Qualifiers CVQuals = parseCVQualifiers(); + + Node *ExceptionSpec = nullptr; + if (consumeIf("Do")) { + ExceptionSpec = make<NameType>("noexcept"); + if (!ExceptionSpec) + return nullptr; + } else if (consumeIf("DO")) { + Node *E = getDerived().parseExpr(); + if (E == nullptr || !consumeIf('E')) + return nullptr; + ExceptionSpec = make<NoexceptSpec>(E); + if (!ExceptionSpec) + return nullptr; + } else if (consumeIf("Dw")) { + size_t SpecsBegin = Names.size(); + while (!consumeIf('E')) { + Node *T = getDerived().parseType(); + if (T == nullptr) + return nullptr; + Names.push_back(T); + } + ExceptionSpec = + make<DynamicExceptionSpec>(popTrailingNodeArray(SpecsBegin)); + if (!ExceptionSpec) + return nullptr; + } + + consumeIf("Dx"); // transaction safe + + if (!consumeIf('F')) + return nullptr; + consumeIf('Y'); // extern "C" + Node *ReturnType = getDerived().parseType(); + if (ReturnType == nullptr) + return nullptr; + + FunctionRefQual ReferenceQualifier = FrefQualNone; + size_t ParamsBegin = Names.size(); + while (true) { + if (consumeIf('E')) + break; + if (consumeIf('v')) + continue; + if (consumeIf("RE")) { + ReferenceQualifier = FrefQualLValue; + break; + } + if (consumeIf("OE")) { + ReferenceQualifier = FrefQualRValue; + break; + } + Node *T = getDerived().parseType(); + if (T == nullptr) + return nullptr; + Names.push_back(T); + } + + NodeArray Params = popTrailingNodeArray(ParamsBegin); + return make<FunctionType>(ReturnType, Params, CVQuals, + ReferenceQualifier, ExceptionSpec); +} + +// extension: +// <vector-type> ::= Dv <positive dimension number> _ <extended element type> +// ::= Dv [<dimension expression>] _ <element type> +// <extended element type> ::= <element type> +// ::= p # AltiVec vector pixel +template <typename Derived, typename Alloc> +Node *AbstractManglingParser<Derived, Alloc>::parseVectorType() { + if (!consumeIf("Dv")) + return nullptr; + if (look() >= '1' && look() <= '9') { + Node *DimensionNumber = make<NameType>(parseNumber()); + if (!DimensionNumber) + return nullptr; + if (!consumeIf('_')) + return nullptr; + if (consumeIf('p')) + return make<PixelVectorType>(DimensionNumber); + Node *ElemType = getDerived().parseType(); + if (ElemType == nullptr) + return nullptr; + return make<VectorType>(ElemType, DimensionNumber); + } + + if (!consumeIf('_')) { + Node *DimExpr = getDerived().parseExpr(); + if (!DimExpr) + return nullptr; + if (!consumeIf('_')) + return nullptr; + Node *ElemType = getDerived().parseType(); + if (!ElemType) + return nullptr; + return make<VectorType>(ElemType, DimExpr); + } + Node *ElemType = getDerived().parseType(); + if (!ElemType) + return nullptr; + return make<VectorType>(ElemType, /*Dimension=*/nullptr); +} + +// <decltype> ::= Dt <expression> E # decltype of an id-expression or class member access (C++0x) +// ::= DT <expression> E # decltype of an expression (C++0x) +template <typename Derived, typename Alloc> +Node *AbstractManglingParser<Derived, Alloc>::parseDecltype() { + if (!consumeIf('D')) + return nullptr; + if (!consumeIf('t') && !consumeIf('T')) + return nullptr; + Node *E = getDerived().parseExpr(); + if (E == nullptr) + return nullptr; + if (!consumeIf('E')) + return nullptr; + return make<EnclosingExpr>("decltype(", E, ")"); +} + +// <array-type> ::= A <positive dimension number> _ <element type> +// ::= A [<dimension expression>] _ <element type> +template <typename Derived, typename Alloc> +Node *AbstractManglingParser<Derived, Alloc>::parseArrayType() { + if (!consumeIf('A')) + return nullptr; + + Node *Dimension = nullptr; + + if (std::isdigit(look())) { + Dimension = make<NameType>(parseNumber()); + if (!Dimension) + return nullptr; + if (!consumeIf('_')) + return nullptr; + } else if (!consumeIf('_')) { + Node *DimExpr = getDerived().parseExpr(); + if (DimExpr == nullptr) + return nullptr; + if (!consumeIf('_')) + return nullptr; + Dimension = DimExpr; + } + + Node *Ty = getDerived().parseType(); + if (Ty == nullptr) + return nullptr; + return make<ArrayType>(Ty, Dimension); +} + +// <pointer-to-member-type> ::= M <class type> <member type> +template <typename Derived, typename Alloc> +Node *AbstractManglingParser<Derived, Alloc>::parsePointerToMemberType() { + if (!consumeIf('M')) + return nullptr; + Node *ClassType = getDerived().parseType(); + if (ClassType == nullptr) + return nullptr; + Node *MemberType = getDerived().parseType(); + if (MemberType == nullptr) + return nullptr; + return make<PointerToMemberType>(ClassType, MemberType); +} + +// <class-enum-type> ::= <name> # non-dependent type name, dependent type name, or dependent typename-specifier +// ::= Ts <name> # dependent elaborated type specifier using 'struct' or 'class' +// ::= Tu <name> # dependent elaborated type specifier using 'union' +// ::= Te <name> # dependent elaborated type specifier using 'enum' +template <typename Derived, typename Alloc> +Node *AbstractManglingParser<Derived, Alloc>::parseClassEnumType() { + StringView ElabSpef; + if (consumeIf("Ts")) + ElabSpef = "struct"; + else if (consumeIf("Tu")) + ElabSpef = "union"; + else if (consumeIf("Te")) + ElabSpef = "enum"; + + Node *Name = getDerived().parseName(); + if (Name == nullptr) + return nullptr; + + if (!ElabSpef.empty()) + return make<ElaboratedTypeSpefType>(ElabSpef, Name); + + return Name; +} + +// <qualified-type> ::= <qualifiers> <type> +// <qualifiers> ::= <extended-qualifier>* <CV-qualifiers> +// <extended-qualifier> ::= U <source-name> [<template-args>] # vendor extended type qualifier +template <typename Derived, typename Alloc> +Node *AbstractManglingParser<Derived, Alloc>::parseQualifiedType() { + if (consumeIf('U')) { + StringView Qual = parseBareSourceName(); + if (Qual.empty()) + return nullptr; + + // extension ::= U <objc-name> <objc-type> # objc-type<identifier> + if (Qual.startsWith("objcproto")) { + StringView ProtoSourceName = Qual.dropFront(std::strlen("objcproto")); + StringView Proto; + { + SwapAndRestore<const char *> SaveFirst(First, ProtoSourceName.begin()), + SaveLast(Last, ProtoSourceName.end()); + Proto = parseBareSourceName(); + } + if (Proto.empty()) + return nullptr; + Node *Child = getDerived().parseQualifiedType(); + if (Child == nullptr) + return nullptr; + return make<ObjCProtoName>(Child, Proto); + } + Node *TA = nullptr; if (look() == 'I') { TA = getDerived().parseTemplateArgs(); @@ -3730,182 +3730,182 @@ Node *AbstractManglingParser<Derived, Alloc>::parseQualifiedType() { return nullptr; } - Node *Child = getDerived().parseQualifiedType(); - if (Child == nullptr) - return nullptr; + Node *Child = getDerived().parseQualifiedType(); + if (Child == nullptr) + return nullptr; return make<VendorExtQualType>(Child, Qual, TA); - } - - Qualifiers Quals = parseCVQualifiers(); - Node *Ty = getDerived().parseType(); - if (Ty == nullptr) - return nullptr; - if (Quals != QualNone) - Ty = make<QualType>(Ty, Quals); - return Ty; -} - -// <type> ::= <builtin-type> -// ::= <qualified-type> -// ::= <function-type> -// ::= <class-enum-type> -// ::= <array-type> -// ::= <pointer-to-member-type> -// ::= <template-param> -// ::= <template-template-param> <template-args> -// ::= <decltype> -// ::= P <type> # pointer -// ::= R <type> # l-value reference -// ::= O <type> # r-value reference (C++11) -// ::= C <type> # complex pair (C99) -// ::= G <type> # imaginary (C99) -// ::= <substitution> # See Compression below -// extension ::= U <objc-name> <objc-type> # objc-type<identifier> -// extension ::= <vector-type> # <vector-type> starts with Dv -// -// <objc-name> ::= <k0 number> objcproto <k1 number> <identifier> # k0 = 9 + <number of digits in k1> + k1 -// <objc-type> ::= <source-name> # PU<11+>objcproto 11objc_object<source-name> 11objc_object -> id<source-name> -template <typename Derived, typename Alloc> -Node *AbstractManglingParser<Derived, Alloc>::parseType() { - Node *Result = nullptr; - - switch (look()) { - // ::= <qualified-type> - case 'r': - case 'V': - case 'K': { - unsigned AfterQuals = 0; - if (look(AfterQuals) == 'r') ++AfterQuals; - if (look(AfterQuals) == 'V') ++AfterQuals; - if (look(AfterQuals) == 'K') ++AfterQuals; - - if (look(AfterQuals) == 'F' || - (look(AfterQuals) == 'D' && - (look(AfterQuals + 1) == 'o' || look(AfterQuals + 1) == 'O' || - look(AfterQuals + 1) == 'w' || look(AfterQuals + 1) == 'x'))) { - Result = getDerived().parseFunctionType(); - break; - } - DEMANGLE_FALLTHROUGH; - } - case 'U': { - Result = getDerived().parseQualifiedType(); - break; - } - // <builtin-type> ::= v # void - case 'v': - ++First; - return make<NameType>("void"); - // ::= w # wchar_t - case 'w': - ++First; - return make<NameType>("wchar_t"); - // ::= b # bool - case 'b': - ++First; - return make<NameType>("bool"); - // ::= c # char - case 'c': - ++First; - return make<NameType>("char"); - // ::= a # signed char - case 'a': - ++First; - return make<NameType>("signed char"); - // ::= h # unsigned char - case 'h': - ++First; - return make<NameType>("unsigned char"); - // ::= s # short - case 's': - ++First; - return make<NameType>("short"); - // ::= t # unsigned short - case 't': - ++First; - return make<NameType>("unsigned short"); - // ::= i # int - case 'i': - ++First; - return make<NameType>("int"); - // ::= j # unsigned int - case 'j': - ++First; - return make<NameType>("unsigned int"); - // ::= l # long - case 'l': - ++First; - return make<NameType>("long"); - // ::= m # unsigned long - case 'm': - ++First; - return make<NameType>("unsigned long"); - // ::= x # long long, __int64 - case 'x': - ++First; - return make<NameType>("long long"); - // ::= y # unsigned long long, __int64 - case 'y': - ++First; - return make<NameType>("unsigned long long"); - // ::= n # __int128 - case 'n': - ++First; - return make<NameType>("__int128"); - // ::= o # unsigned __int128 - case 'o': - ++First; - return make<NameType>("unsigned __int128"); - // ::= f # float - case 'f': - ++First; - return make<NameType>("float"); - // ::= d # double - case 'd': - ++First; - return make<NameType>("double"); - // ::= e # long double, __float80 - case 'e': - ++First; - return make<NameType>("long double"); - // ::= g # __float128 - case 'g': - ++First; - return make<NameType>("__float128"); - // ::= z # ellipsis - case 'z': - ++First; - return make<NameType>("..."); - - // <builtin-type> ::= u <source-name> # vendor extended type - case 'u': { - ++First; - StringView Res = parseBareSourceName(); - if (Res.empty()) - return nullptr; - // Typically, <builtin-type>s are not considered substitution candidates, - // but the exception to that exception is vendor extended types (Itanium C++ - // ABI 5.9.1). - Result = make<NameType>(Res); - break; - } - case 'D': - switch (look(1)) { - // ::= Dd # IEEE 754r decimal floating point (64 bits) - case 'd': - First += 2; - return make<NameType>("decimal64"); - // ::= De # IEEE 754r decimal floating point (128 bits) - case 'e': - First += 2; - return make<NameType>("decimal128"); - // ::= Df # IEEE 754r decimal floating point (32 bits) - case 'f': - First += 2; - return make<NameType>("decimal32"); - // ::= Dh # IEEE 754r half-precision floating point (16 bits) - case 'h': - First += 2; + } + + Qualifiers Quals = parseCVQualifiers(); + Node *Ty = getDerived().parseType(); + if (Ty == nullptr) + return nullptr; + if (Quals != QualNone) + Ty = make<QualType>(Ty, Quals); + return Ty; +} + +// <type> ::= <builtin-type> +// ::= <qualified-type> +// ::= <function-type> +// ::= <class-enum-type> +// ::= <array-type> +// ::= <pointer-to-member-type> +// ::= <template-param> +// ::= <template-template-param> <template-args> +// ::= <decltype> +// ::= P <type> # pointer +// ::= R <type> # l-value reference +// ::= O <type> # r-value reference (C++11) +// ::= C <type> # complex pair (C99) +// ::= G <type> # imaginary (C99) +// ::= <substitution> # See Compression below +// extension ::= U <objc-name> <objc-type> # objc-type<identifier> +// extension ::= <vector-type> # <vector-type> starts with Dv +// +// <objc-name> ::= <k0 number> objcproto <k1 number> <identifier> # k0 = 9 + <number of digits in k1> + k1 +// <objc-type> ::= <source-name> # PU<11+>objcproto 11objc_object<source-name> 11objc_object -> id<source-name> +template <typename Derived, typename Alloc> +Node *AbstractManglingParser<Derived, Alloc>::parseType() { + Node *Result = nullptr; + + switch (look()) { + // ::= <qualified-type> + case 'r': + case 'V': + case 'K': { + unsigned AfterQuals = 0; + if (look(AfterQuals) == 'r') ++AfterQuals; + if (look(AfterQuals) == 'V') ++AfterQuals; + if (look(AfterQuals) == 'K') ++AfterQuals; + + if (look(AfterQuals) == 'F' || + (look(AfterQuals) == 'D' && + (look(AfterQuals + 1) == 'o' || look(AfterQuals + 1) == 'O' || + look(AfterQuals + 1) == 'w' || look(AfterQuals + 1) == 'x'))) { + Result = getDerived().parseFunctionType(); + break; + } + DEMANGLE_FALLTHROUGH; + } + case 'U': { + Result = getDerived().parseQualifiedType(); + break; + } + // <builtin-type> ::= v # void + case 'v': + ++First; + return make<NameType>("void"); + // ::= w # wchar_t + case 'w': + ++First; + return make<NameType>("wchar_t"); + // ::= b # bool + case 'b': + ++First; + return make<NameType>("bool"); + // ::= c # char + case 'c': + ++First; + return make<NameType>("char"); + // ::= a # signed char + case 'a': + ++First; + return make<NameType>("signed char"); + // ::= h # unsigned char + case 'h': + ++First; + return make<NameType>("unsigned char"); + // ::= s # short + case 's': + ++First; + return make<NameType>("short"); + // ::= t # unsigned short + case 't': + ++First; + return make<NameType>("unsigned short"); + // ::= i # int + case 'i': + ++First; + return make<NameType>("int"); + // ::= j # unsigned int + case 'j': + ++First; + return make<NameType>("unsigned int"); + // ::= l # long + case 'l': + ++First; + return make<NameType>("long"); + // ::= m # unsigned long + case 'm': + ++First; + return make<NameType>("unsigned long"); + // ::= x # long long, __int64 + case 'x': + ++First; + return make<NameType>("long long"); + // ::= y # unsigned long long, __int64 + case 'y': + ++First; + return make<NameType>("unsigned long long"); + // ::= n # __int128 + case 'n': + ++First; + return make<NameType>("__int128"); + // ::= o # unsigned __int128 + case 'o': + ++First; + return make<NameType>("unsigned __int128"); + // ::= f # float + case 'f': + ++First; + return make<NameType>("float"); + // ::= d # double + case 'd': + ++First; + return make<NameType>("double"); + // ::= e # long double, __float80 + case 'e': + ++First; + return make<NameType>("long double"); + // ::= g # __float128 + case 'g': + ++First; + return make<NameType>("__float128"); + // ::= z # ellipsis + case 'z': + ++First; + return make<NameType>("..."); + + // <builtin-type> ::= u <source-name> # vendor extended type + case 'u': { + ++First; + StringView Res = parseBareSourceName(); + if (Res.empty()) + return nullptr; + // Typically, <builtin-type>s are not considered substitution candidates, + // but the exception to that exception is vendor extended types (Itanium C++ + // ABI 5.9.1). + Result = make<NameType>(Res); + break; + } + case 'D': + switch (look(1)) { + // ::= Dd # IEEE 754r decimal floating point (64 bits) + case 'd': + First += 2; + return make<NameType>("decimal64"); + // ::= De # IEEE 754r decimal floating point (128 bits) + case 'e': + First += 2; + return make<NameType>("decimal128"); + // ::= Df # IEEE 754r decimal floating point (32 bits) + case 'f': + First += 2; + return make<NameType>("decimal32"); + // ::= Dh # IEEE 754r half-precision floating point (16 bits) + case 'h': + First += 2; return make<NameType>("half"); // ::= DF <number> _ # ISO/IEC TS 18661 binary floating point (N bits) case 'F': { @@ -3917,1834 +3917,1834 @@ Node *AbstractManglingParser<Derived, Alloc>::parseType() { return nullptr; return make<BinaryFPType>(DimensionNumber); } - // ::= Di # char32_t - case 'i': - First += 2; - return make<NameType>("char32_t"); - // ::= Ds # char16_t - case 's': - First += 2; - return make<NameType>("char16_t"); - // ::= Du # char8_t (C++2a, not yet in the Itanium spec) - case 'u': - First += 2; - return make<NameType>("char8_t"); - // ::= Da # auto (in dependent new-expressions) - case 'a': - First += 2; - return make<NameType>("auto"); - // ::= Dc # decltype(auto) - case 'c': - First += 2; - return make<NameType>("decltype(auto)"); - // ::= Dn # std::nullptr_t (i.e., decltype(nullptr)) - case 'n': - First += 2; - return make<NameType>("std::nullptr_t"); - - // ::= <decltype> - case 't': - case 'T': { - Result = getDerived().parseDecltype(); - break; - } - // extension ::= <vector-type> # <vector-type> starts with Dv - case 'v': { - Result = getDerived().parseVectorType(); - break; - } - // ::= Dp <type> # pack expansion (C++0x) - case 'p': { - First += 2; - Node *Child = getDerived().parseType(); - if (!Child) - return nullptr; - Result = make<ParameterPackExpansion>(Child); - break; - } - // Exception specifier on a function type. - case 'o': - case 'O': - case 'w': - // Transaction safe function type. - case 'x': - Result = getDerived().parseFunctionType(); - break; - } - break; - // ::= <function-type> - case 'F': { - Result = getDerived().parseFunctionType(); - break; - } - // ::= <array-type> - case 'A': { - Result = getDerived().parseArrayType(); - break; - } - // ::= <pointer-to-member-type> - case 'M': { - Result = getDerived().parsePointerToMemberType(); - break; - } - // ::= <template-param> - case 'T': { - // This could be an elaborate type specifier on a <class-enum-type>. - if (look(1) == 's' || look(1) == 'u' || look(1) == 'e') { - Result = getDerived().parseClassEnumType(); - break; - } - - Result = getDerived().parseTemplateParam(); - if (Result == nullptr) - return nullptr; - - // Result could be either of: - // <type> ::= <template-param> - // <type> ::= <template-template-param> <template-args> - // - // <template-template-param> ::= <template-param> - // ::= <substitution> - // - // If this is followed by some <template-args>, and we're permitted to - // parse them, take the second production. - - if (TryToParseTemplateArgs && look() == 'I') { - Node *TA = getDerived().parseTemplateArgs(); - if (TA == nullptr) - return nullptr; - Result = make<NameWithTemplateArgs>(Result, TA); - } - break; - } - // ::= P <type> # pointer - case 'P': { - ++First; - Node *Ptr = getDerived().parseType(); - if (Ptr == nullptr) - return nullptr; - Result = make<PointerType>(Ptr); - break; - } - // ::= R <type> # l-value reference - case 'R': { - ++First; - Node *Ref = getDerived().parseType(); - if (Ref == nullptr) - return nullptr; - Result = make<ReferenceType>(Ref, ReferenceKind::LValue); - break; - } - // ::= O <type> # r-value reference (C++11) - case 'O': { - ++First; - Node *Ref = getDerived().parseType(); - if (Ref == nullptr) - return nullptr; - Result = make<ReferenceType>(Ref, ReferenceKind::RValue); - break; - } - // ::= C <type> # complex pair (C99) - case 'C': { - ++First; - Node *P = getDerived().parseType(); - if (P == nullptr) - return nullptr; - Result = make<PostfixQualifiedType>(P, " complex"); - break; - } - // ::= G <type> # imaginary (C99) - case 'G': { - ++First; - Node *P = getDerived().parseType(); - if (P == nullptr) - return P; - Result = make<PostfixQualifiedType>(P, " imaginary"); - break; - } - // ::= <substitution> # See Compression below - case 'S': { - if (look(1) && look(1) != 't') { - Node *Sub = getDerived().parseSubstitution(); - if (Sub == nullptr) - return nullptr; - - // Sub could be either of: - // <type> ::= <substitution> - // <type> ::= <template-template-param> <template-args> - // - // <template-template-param> ::= <template-param> - // ::= <substitution> - // - // If this is followed by some <template-args>, and we're permitted to - // parse them, take the second production. - - if (TryToParseTemplateArgs && look() == 'I') { - Node *TA = getDerived().parseTemplateArgs(); - if (TA == nullptr) - return nullptr; - Result = make<NameWithTemplateArgs>(Sub, TA); - break; - } - - // If all we parsed was a substitution, don't re-insert into the - // substitution table. - return Sub; - } - DEMANGLE_FALLTHROUGH; - } - // ::= <class-enum-type> - default: { - Result = getDerived().parseClassEnumType(); - break; - } - } - - // If we parsed a type, insert it into the substitution table. Note that all - // <builtin-type>s and <substitution>s have already bailed out, because they - // don't get substitutions. - if (Result != nullptr) - Subs.push_back(Result); - return Result; -} - -template <typename Derived, typename Alloc> -Node *AbstractManglingParser<Derived, Alloc>::parsePrefixExpr(StringView Kind) { - Node *E = getDerived().parseExpr(); - if (E == nullptr) - return nullptr; - return make<PrefixExpr>(Kind, E); -} - -template <typename Derived, typename Alloc> -Node *AbstractManglingParser<Derived, Alloc>::parseBinaryExpr(StringView Kind) { - Node *LHS = getDerived().parseExpr(); - if (LHS == nullptr) - return nullptr; - Node *RHS = getDerived().parseExpr(); - if (RHS == nullptr) - return nullptr; - return make<BinaryExpr>(LHS, Kind, RHS); -} - -template <typename Derived, typename Alloc> -Node * -AbstractManglingParser<Derived, Alloc>::parseIntegerLiteral(StringView Lit) { - StringView Tmp = parseNumber(true); - if (!Tmp.empty() && consumeIf('E')) - return make<IntegerLiteral>(Lit, Tmp); - return nullptr; -} - -// <CV-Qualifiers> ::= [r] [V] [K] -template <typename Alloc, typename Derived> -Qualifiers AbstractManglingParser<Alloc, Derived>::parseCVQualifiers() { - Qualifiers CVR = QualNone; - if (consumeIf('r')) - CVR |= QualRestrict; - if (consumeIf('V')) - CVR |= QualVolatile; - if (consumeIf('K')) - CVR |= QualConst; - return CVR; -} - -// <function-param> ::= fp <top-level CV-Qualifiers> _ # L == 0, first parameter -// ::= fp <top-level CV-Qualifiers> <parameter-2 non-negative number> _ # L == 0, second and later parameters -// ::= fL <L-1 non-negative number> p <top-level CV-Qualifiers> _ # L > 0, first parameter -// ::= fL <L-1 non-negative number> p <top-level CV-Qualifiers> <parameter-2 non-negative number> _ # L > 0, second and later parameters -// ::= fpT # 'this' expression (not part of standard?) -template <typename Derived, typename Alloc> -Node *AbstractManglingParser<Derived, Alloc>::parseFunctionParam() { - if (consumeIf("fpT")) - return make<NameType>("this"); - if (consumeIf("fp")) { - parseCVQualifiers(); - StringView Num = parseNumber(); - if (!consumeIf('_')) - return nullptr; - return make<FunctionParam>(Num); - } - if (consumeIf("fL")) { - if (parseNumber().empty()) - return nullptr; - if (!consumeIf('p')) - return nullptr; - parseCVQualifiers(); - StringView Num = parseNumber(); - if (!consumeIf('_')) - return nullptr; - return make<FunctionParam>(Num); - } - return nullptr; -} - -// [gs] nw <expression>* _ <type> E # new (expr-list) type -// [gs] nw <expression>* _ <type> <initializer> # new (expr-list) type (init) -// [gs] na <expression>* _ <type> E # new[] (expr-list) type -// [gs] na <expression>* _ <type> <initializer> # new[] (expr-list) type (init) -// <initializer> ::= pi <expression>* E # parenthesized initialization -template <typename Derived, typename Alloc> -Node *AbstractManglingParser<Derived, Alloc>::parseNewExpr() { - bool Global = consumeIf("gs"); - bool IsArray = look(1) == 'a'; - if (!consumeIf("nw") && !consumeIf("na")) - return nullptr; - size_t Exprs = Names.size(); - while (!consumeIf('_')) { - Node *Ex = getDerived().parseExpr(); - if (Ex == nullptr) - return nullptr; - Names.push_back(Ex); - } - NodeArray ExprList = popTrailingNodeArray(Exprs); - Node *Ty = getDerived().parseType(); - if (Ty == nullptr) - return Ty; - if (consumeIf("pi")) { - size_t InitsBegin = Names.size(); - while (!consumeIf('E')) { - Node *Init = getDerived().parseExpr(); - if (Init == nullptr) - return Init; - Names.push_back(Init); - } - NodeArray Inits = popTrailingNodeArray(InitsBegin); - return make<NewExpr>(ExprList, Ty, Inits, Global, IsArray); - } else if (!consumeIf('E')) - return nullptr; - return make<NewExpr>(ExprList, Ty, NodeArray(), Global, IsArray); -} - -// cv <type> <expression> # conversion with one argument -// cv <type> _ <expression>* E # conversion with a different number of arguments -template <typename Derived, typename Alloc> -Node *AbstractManglingParser<Derived, Alloc>::parseConversionExpr() { - if (!consumeIf("cv")) - return nullptr; - Node *Ty; - { - SwapAndRestore<bool> SaveTemp(TryToParseTemplateArgs, false); - Ty = getDerived().parseType(); - } - - if (Ty == nullptr) - return nullptr; - - if (consumeIf('_')) { - size_t ExprsBegin = Names.size(); - while (!consumeIf('E')) { - Node *E = getDerived().parseExpr(); - if (E == nullptr) - return E; - Names.push_back(E); - } - NodeArray Exprs = popTrailingNodeArray(ExprsBegin); - return make<ConversionExpr>(Ty, Exprs); - } - - Node *E[1] = {getDerived().parseExpr()}; - if (E[0] == nullptr) - return nullptr; - return make<ConversionExpr>(Ty, makeNodeArray(E, E + 1)); -} - -// <expr-primary> ::= L <type> <value number> E # integer literal -// ::= L <type> <value float> E # floating literal -// ::= L <string type> E # string literal -// ::= L <nullptr type> E # nullptr literal (i.e., "LDnE") -// ::= L <lambda type> E # lambda expression -// FIXME: ::= L <type> <real-part float> _ <imag-part float> E # complex floating point literal (C 2000) -// ::= L <mangled-name> E # external name -template <typename Derived, typename Alloc> -Node *AbstractManglingParser<Derived, Alloc>::parseExprPrimary() { - if (!consumeIf('L')) - return nullptr; - switch (look()) { - case 'w': - ++First; - return getDerived().parseIntegerLiteral("wchar_t"); - case 'b': - if (consumeIf("b0E")) - return make<BoolExpr>(0); - if (consumeIf("b1E")) - return make<BoolExpr>(1); - return nullptr; - case 'c': - ++First; - return getDerived().parseIntegerLiteral("char"); - case 'a': - ++First; - return getDerived().parseIntegerLiteral("signed char"); - case 'h': - ++First; - return getDerived().parseIntegerLiteral("unsigned char"); - case 's': - ++First; - return getDerived().parseIntegerLiteral("short"); - case 't': - ++First; - return getDerived().parseIntegerLiteral("unsigned short"); - case 'i': - ++First; - return getDerived().parseIntegerLiteral(""); - case 'j': - ++First; - return getDerived().parseIntegerLiteral("u"); - case 'l': - ++First; - return getDerived().parseIntegerLiteral("l"); - case 'm': - ++First; - return getDerived().parseIntegerLiteral("ul"); - case 'x': - ++First; - return getDerived().parseIntegerLiteral("ll"); - case 'y': - ++First; - return getDerived().parseIntegerLiteral("ull"); - case 'n': - ++First; - return getDerived().parseIntegerLiteral("__int128"); - case 'o': - ++First; - return getDerived().parseIntegerLiteral("unsigned __int128"); - case 'f': - ++First; - return getDerived().template parseFloatingLiteral<float>(); - case 'd': - ++First; - return getDerived().template parseFloatingLiteral<double>(); - case 'e': - ++First; -#if defined(__powerpc__) || defined(__s390__) - // Handle cases where long doubles encoded with e have the same size - // and representation as doubles. - return getDerived().template parseFloatingLiteral<double>(); -#else - return getDerived().template parseFloatingLiteral<long double>(); -#endif - case '_': - if (consumeIf("_Z")) { - Node *R = getDerived().parseEncoding(); - if (R != nullptr && consumeIf('E')) - return R; - } - return nullptr; - case 'A': { - Node *T = getDerived().parseType(); - if (T == nullptr) - return nullptr; - // FIXME: We need to include the string contents in the mangling. - if (consumeIf('E')) - return make<StringLiteral>(T); - return nullptr; - } - case 'D': - if (consumeIf("DnE")) - return make<NameType>("nullptr"); - return nullptr; - case 'T': - // Invalid mangled name per - // http://sourcerytools.com/pipermail/cxx-abi-dev/2011-August/002422.html - return nullptr; - case 'U': { - // FIXME: Should we support LUb... for block literals? - if (look(1) != 'l') - return nullptr; - Node *T = parseUnnamedTypeName(nullptr); - if (!T || !consumeIf('E')) - return nullptr; - return make<LambdaExpr>(T); - } - default: { - // might be named type - Node *T = getDerived().parseType(); - if (T == nullptr) - return nullptr; - StringView N = parseNumber(/*AllowNegative=*/true); - if (N.empty()) - return nullptr; - if (!consumeIf('E')) - return nullptr; - return make<EnumLiteral>(T, N); - } - } -} - -// <braced-expression> ::= <expression> -// ::= di <field source-name> <braced-expression> # .name = expr -// ::= dx <index expression> <braced-expression> # [expr] = expr -// ::= dX <range begin expression> <range end expression> <braced-expression> -template <typename Derived, typename Alloc> -Node *AbstractManglingParser<Derived, Alloc>::parseBracedExpr() { - if (look() == 'd') { - switch (look(1)) { - case 'i': { - First += 2; - Node *Field = getDerived().parseSourceName(/*NameState=*/nullptr); - if (Field == nullptr) - return nullptr; - Node *Init = getDerived().parseBracedExpr(); - if (Init == nullptr) - return nullptr; - return make<BracedExpr>(Field, Init, /*isArray=*/false); - } - case 'x': { - First += 2; - Node *Index = getDerived().parseExpr(); - if (Index == nullptr) - return nullptr; - Node *Init = getDerived().parseBracedExpr(); - if (Init == nullptr) - return nullptr; - return make<BracedExpr>(Index, Init, /*isArray=*/true); - } - case 'X': { - First += 2; - Node *RangeBegin = getDerived().parseExpr(); - if (RangeBegin == nullptr) - return nullptr; - Node *RangeEnd = getDerived().parseExpr(); - if (RangeEnd == nullptr) - return nullptr; - Node *Init = getDerived().parseBracedExpr(); - if (Init == nullptr) - return nullptr; - return make<BracedRangeExpr>(RangeBegin, RangeEnd, Init); - } - } - } - return getDerived().parseExpr(); -} - -// (not yet in the spec) -// <fold-expr> ::= fL <binary-operator-name> <expression> <expression> -// ::= fR <binary-operator-name> <expression> <expression> -// ::= fl <binary-operator-name> <expression> -// ::= fr <binary-operator-name> <expression> -template <typename Derived, typename Alloc> -Node *AbstractManglingParser<Derived, Alloc>::parseFoldExpr() { - if (!consumeIf('f')) - return nullptr; - - char FoldKind = look(); - bool IsLeftFold, HasInitializer; - HasInitializer = FoldKind == 'L' || FoldKind == 'R'; - if (FoldKind == 'l' || FoldKind == 'L') - IsLeftFold = true; - else if (FoldKind == 'r' || FoldKind == 'R') - IsLeftFold = false; - else - return nullptr; - ++First; - - // FIXME: This map is duplicated in parseOperatorName and parseExpr. - StringView OperatorName; - if (consumeIf("aa")) OperatorName = "&&"; - else if (consumeIf("an")) OperatorName = "&"; - else if (consumeIf("aN")) OperatorName = "&="; - else if (consumeIf("aS")) OperatorName = "="; - else if (consumeIf("cm")) OperatorName = ","; - else if (consumeIf("ds")) OperatorName = ".*"; - else if (consumeIf("dv")) OperatorName = "/"; - else if (consumeIf("dV")) OperatorName = "/="; - else if (consumeIf("eo")) OperatorName = "^"; - else if (consumeIf("eO")) OperatorName = "^="; - else if (consumeIf("eq")) OperatorName = "=="; - else if (consumeIf("ge")) OperatorName = ">="; - else if (consumeIf("gt")) OperatorName = ">"; - else if (consumeIf("le")) OperatorName = "<="; - else if (consumeIf("ls")) OperatorName = "<<"; - else if (consumeIf("lS")) OperatorName = "<<="; - else if (consumeIf("lt")) OperatorName = "<"; - else if (consumeIf("mi")) OperatorName = "-"; - else if (consumeIf("mI")) OperatorName = "-="; - else if (consumeIf("ml")) OperatorName = "*"; - else if (consumeIf("mL")) OperatorName = "*="; - else if (consumeIf("ne")) OperatorName = "!="; - else if (consumeIf("oo")) OperatorName = "||"; - else if (consumeIf("or")) OperatorName = "|"; - else if (consumeIf("oR")) OperatorName = "|="; - else if (consumeIf("pl")) OperatorName = "+"; - else if (consumeIf("pL")) OperatorName = "+="; - else if (consumeIf("rm")) OperatorName = "%"; - else if (consumeIf("rM")) OperatorName = "%="; - else if (consumeIf("rs")) OperatorName = ">>"; - else if (consumeIf("rS")) OperatorName = ">>="; - else return nullptr; - - Node *Pack = getDerived().parseExpr(), *Init = nullptr; - if (Pack == nullptr) - return nullptr; - if (HasInitializer) { - Init = getDerived().parseExpr(); - if (Init == nullptr) - return nullptr; - } - - if (IsLeftFold && Init) - std::swap(Pack, Init); - - return make<FoldExpr>(IsLeftFold, OperatorName, Pack, Init); -} - -// <expression> ::= mc <parameter type> <expr> [<offset number>] E -// -// Not yet in the spec: https://github.com/itanium-cxx-abi/cxx-abi/issues/47 -template <typename Derived, typename Alloc> -Node *AbstractManglingParser<Derived, Alloc>::parsePointerToMemberConversionExpr() { - Node *Ty = getDerived().parseType(); - if (!Ty) - return nullptr; - Node *Expr = getDerived().parseExpr(); - if (!Expr) - return nullptr; - StringView Offset = getDerived().parseNumber(true); - if (!consumeIf('E')) - return nullptr; - return make<PointerToMemberConversionExpr>(Ty, Expr, Offset); -} - -// <expression> ::= so <referent type> <expr> [<offset number>] <union-selector>* [p] E -// <union-selector> ::= _ [<number>] -// -// Not yet in the spec: https://github.com/itanium-cxx-abi/cxx-abi/issues/47 -template <typename Derived, typename Alloc> -Node *AbstractManglingParser<Derived, Alloc>::parseSubobjectExpr() { - Node *Ty = getDerived().parseType(); - if (!Ty) - return nullptr; - Node *Expr = getDerived().parseExpr(); - if (!Expr) - return nullptr; - StringView Offset = getDerived().parseNumber(true); - size_t SelectorsBegin = Names.size(); - while (consumeIf('_')) { - Node *Selector = make<NameType>(parseNumber()); - if (!Selector) - return nullptr; - Names.push_back(Selector); - } - bool OnePastTheEnd = consumeIf('p'); - if (!consumeIf('E')) - return nullptr; - return make<SubobjectExpr>( - Ty, Expr, Offset, popTrailingNodeArray(SelectorsBegin), OnePastTheEnd); -} - -// <expression> ::= <unary operator-name> <expression> -// ::= <binary operator-name> <expression> <expression> -// ::= <ternary operator-name> <expression> <expression> <expression> -// ::= cl <expression>+ E # call -// ::= cv <type> <expression> # conversion with one argument -// ::= cv <type> _ <expression>* E # conversion with a different number of arguments -// ::= [gs] nw <expression>* _ <type> E # new (expr-list) type -// ::= [gs] nw <expression>* _ <type> <initializer> # new (expr-list) type (init) -// ::= [gs] na <expression>* _ <type> E # new[] (expr-list) type -// ::= [gs] na <expression>* _ <type> <initializer> # new[] (expr-list) type (init) -// ::= [gs] dl <expression> # delete expression -// ::= [gs] da <expression> # delete[] expression -// ::= pp_ <expression> # prefix ++ -// ::= mm_ <expression> # prefix -- -// ::= ti <type> # typeid (type) -// ::= te <expression> # typeid (expression) -// ::= dc <type> <expression> # dynamic_cast<type> (expression) -// ::= sc <type> <expression> # static_cast<type> (expression) -// ::= cc <type> <expression> # const_cast<type> (expression) -// ::= rc <type> <expression> # reinterpret_cast<type> (expression) -// ::= st <type> # sizeof (a type) -// ::= sz <expression> # sizeof (an expression) -// ::= at <type> # alignof (a type) -// ::= az <expression> # alignof (an expression) -// ::= nx <expression> # noexcept (expression) -// ::= <template-param> -// ::= <function-param> -// ::= dt <expression> <unresolved-name> # expr.name -// ::= pt <expression> <unresolved-name> # expr->name -// ::= ds <expression> <expression> # expr.*expr -// ::= sZ <template-param> # size of a parameter pack -// ::= sZ <function-param> # size of a function parameter pack -// ::= sP <template-arg>* E # sizeof...(T), size of a captured template parameter pack from an alias template -// ::= sp <expression> # pack expansion -// ::= tw <expression> # throw expression -// ::= tr # throw with no operand (rethrow) -// ::= <unresolved-name> # f(p), N::f(p), ::f(p), -// # freestanding dependent name (e.g., T::x), -// # objectless nonstatic member reference -// ::= fL <binary-operator-name> <expression> <expression> -// ::= fR <binary-operator-name> <expression> <expression> -// ::= fl <binary-operator-name> <expression> -// ::= fr <binary-operator-name> <expression> -// ::= <expr-primary> -template <typename Derived, typename Alloc> -Node *AbstractManglingParser<Derived, Alloc>::parseExpr() { - bool Global = consumeIf("gs"); - if (numLeft() < 2) - return nullptr; - - switch (*First) { - case 'L': - return getDerived().parseExprPrimary(); - case 'T': - return getDerived().parseTemplateParam(); - case 'f': { - // Disambiguate a fold expression from a <function-param>. - if (look(1) == 'p' || (look(1) == 'L' && std::isdigit(look(2)))) - return getDerived().parseFunctionParam(); - return getDerived().parseFoldExpr(); - } - case 'a': - switch (First[1]) { - case 'a': - First += 2; - return getDerived().parseBinaryExpr("&&"); - case 'd': - First += 2; - return getDerived().parsePrefixExpr("&"); - case 'n': - First += 2; - return getDerived().parseBinaryExpr("&"); - case 'N': - First += 2; - return getDerived().parseBinaryExpr("&="); - case 'S': - First += 2; - return getDerived().parseBinaryExpr("="); - case 't': { - First += 2; - Node *Ty = getDerived().parseType(); - if (Ty == nullptr) - return nullptr; - return make<EnclosingExpr>("alignof (", Ty, ")"); - } - case 'z': { - First += 2; - Node *Ty = getDerived().parseExpr(); - if (Ty == nullptr) - return nullptr; - return make<EnclosingExpr>("alignof (", Ty, ")"); - } - } - return nullptr; - case 'c': - switch (First[1]) { - // cc <type> <expression> # const_cast<type>(expression) - case 'c': { - First += 2; - Node *Ty = getDerived().parseType(); - if (Ty == nullptr) - return Ty; - Node *Ex = getDerived().parseExpr(); - if (Ex == nullptr) - return Ex; - return make<CastExpr>("const_cast", Ty, Ex); - } - // cl <expression>+ E # call - case 'l': { - First += 2; - Node *Callee = getDerived().parseExpr(); - if (Callee == nullptr) - return Callee; - size_t ExprsBegin = Names.size(); - while (!consumeIf('E')) { - Node *E = getDerived().parseExpr(); - if (E == nullptr) - return E; - Names.push_back(E); - } - return make<CallExpr>(Callee, popTrailingNodeArray(ExprsBegin)); - } - case 'm': - First += 2; - return getDerived().parseBinaryExpr(","); - case 'o': - First += 2; - return getDerived().parsePrefixExpr("~"); - case 'v': - return getDerived().parseConversionExpr(); - } - return nullptr; - case 'd': - switch (First[1]) { - case 'a': { - First += 2; - Node *Ex = getDerived().parseExpr(); - if (Ex == nullptr) - return Ex; - return make<DeleteExpr>(Ex, Global, /*is_array=*/true); - } - case 'c': { - First += 2; - Node *T = getDerived().parseType(); - if (T == nullptr) - return T; - Node *Ex = getDerived().parseExpr(); - if (Ex == nullptr) - return Ex; - return make<CastExpr>("dynamic_cast", T, Ex); - } - case 'e': - First += 2; - return getDerived().parsePrefixExpr("*"); - case 'l': { - First += 2; - Node *E = getDerived().parseExpr(); - if (E == nullptr) - return E; - return make<DeleteExpr>(E, Global, /*is_array=*/false); - } - case 'n': - return getDerived().parseUnresolvedName(); - case 's': { - First += 2; - Node *LHS = getDerived().parseExpr(); - if (LHS == nullptr) - return nullptr; - Node *RHS = getDerived().parseExpr(); - if (RHS == nullptr) - return nullptr; - return make<MemberExpr>(LHS, ".*", RHS); - } - case 't': { - First += 2; - Node *LHS = getDerived().parseExpr(); - if (LHS == nullptr) - return LHS; - Node *RHS = getDerived().parseExpr(); - if (RHS == nullptr) - return nullptr; - return make<MemberExpr>(LHS, ".", RHS); - } - case 'v': - First += 2; - return getDerived().parseBinaryExpr("/"); - case 'V': - First += 2; - return getDerived().parseBinaryExpr("/="); - } - return nullptr; - case 'e': - switch (First[1]) { - case 'o': - First += 2; - return getDerived().parseBinaryExpr("^"); - case 'O': - First += 2; - return getDerived().parseBinaryExpr("^="); - case 'q': - First += 2; - return getDerived().parseBinaryExpr("=="); - } - return nullptr; - case 'g': - switch (First[1]) { - case 'e': - First += 2; - return getDerived().parseBinaryExpr(">="); - case 't': - First += 2; - return getDerived().parseBinaryExpr(">"); - } - return nullptr; - case 'i': - switch (First[1]) { - case 'x': { - First += 2; - Node *Base = getDerived().parseExpr(); - if (Base == nullptr) - return nullptr; - Node *Index = getDerived().parseExpr(); - if (Index == nullptr) - return Index; - return make<ArraySubscriptExpr>(Base, Index); - } - case 'l': { - First += 2; - size_t InitsBegin = Names.size(); - while (!consumeIf('E')) { - Node *E = getDerived().parseBracedExpr(); - if (E == nullptr) - return nullptr; - Names.push_back(E); - } - return make<InitListExpr>(nullptr, popTrailingNodeArray(InitsBegin)); - } - } - return nullptr; - case 'l': - switch (First[1]) { - case 'e': - First += 2; - return getDerived().parseBinaryExpr("<="); - case 's': - First += 2; - return getDerived().parseBinaryExpr("<<"); - case 'S': - First += 2; - return getDerived().parseBinaryExpr("<<="); - case 't': - First += 2; - return getDerived().parseBinaryExpr("<"); - } - return nullptr; - case 'm': - switch (First[1]) { - case 'c': - First += 2; - return parsePointerToMemberConversionExpr(); - case 'i': - First += 2; - return getDerived().parseBinaryExpr("-"); - case 'I': - First += 2; - return getDerived().parseBinaryExpr("-="); - case 'l': - First += 2; - return getDerived().parseBinaryExpr("*"); - case 'L': - First += 2; - return getDerived().parseBinaryExpr("*="); - case 'm': - First += 2; - if (consumeIf('_')) - return getDerived().parsePrefixExpr("--"); - Node *Ex = getDerived().parseExpr(); - if (Ex == nullptr) - return nullptr; - return make<PostfixExpr>(Ex, "--"); - } - return nullptr; - case 'n': - switch (First[1]) { - case 'a': - case 'w': - return getDerived().parseNewExpr(); - case 'e': - First += 2; - return getDerived().parseBinaryExpr("!="); - case 'g': - First += 2; - return getDerived().parsePrefixExpr("-"); - case 't': - First += 2; - return getDerived().parsePrefixExpr("!"); - case 'x': - First += 2; - Node *Ex = getDerived().parseExpr(); - if (Ex == nullptr) - return Ex; - return make<EnclosingExpr>("noexcept (", Ex, ")"); - } - return nullptr; - case 'o': - switch (First[1]) { - case 'n': - return getDerived().parseUnresolvedName(); - case 'o': - First += 2; - return getDerived().parseBinaryExpr("||"); - case 'r': - First += 2; - return getDerived().parseBinaryExpr("|"); - case 'R': - First += 2; - return getDerived().parseBinaryExpr("|="); - } - return nullptr; - case 'p': - switch (First[1]) { - case 'm': - First += 2; - return getDerived().parseBinaryExpr("->*"); - case 'l': - First += 2; - return getDerived().parseBinaryExpr("+"); - case 'L': - First += 2; - return getDerived().parseBinaryExpr("+="); - case 'p': { - First += 2; - if (consumeIf('_')) - return getDerived().parsePrefixExpr("++"); - Node *Ex = getDerived().parseExpr(); - if (Ex == nullptr) - return Ex; - return make<PostfixExpr>(Ex, "++"); - } - case 's': - First += 2; - return getDerived().parsePrefixExpr("+"); - case 't': { - First += 2; - Node *L = getDerived().parseExpr(); - if (L == nullptr) - return nullptr; - Node *R = getDerived().parseExpr(); - if (R == nullptr) - return nullptr; - return make<MemberExpr>(L, "->", R); - } - } - return nullptr; - case 'q': - if (First[1] == 'u') { - First += 2; - Node *Cond = getDerived().parseExpr(); - if (Cond == nullptr) - return nullptr; - Node *LHS = getDerived().parseExpr(); - if (LHS == nullptr) - return nullptr; - Node *RHS = getDerived().parseExpr(); - if (RHS == nullptr) - return nullptr; - return make<ConditionalExpr>(Cond, LHS, RHS); - } - return nullptr; - case 'r': - switch (First[1]) { - case 'c': { - First += 2; - Node *T = getDerived().parseType(); - if (T == nullptr) - return T; - Node *Ex = getDerived().parseExpr(); - if (Ex == nullptr) - return Ex; - return make<CastExpr>("reinterpret_cast", T, Ex); - } - case 'm': - First += 2; - return getDerived().parseBinaryExpr("%"); - case 'M': - First += 2; - return getDerived().parseBinaryExpr("%="); - case 's': - First += 2; - return getDerived().parseBinaryExpr(">>"); - case 'S': - First += 2; - return getDerived().parseBinaryExpr(">>="); - } - return nullptr; - case 's': - switch (First[1]) { - case 'c': { - First += 2; - Node *T = getDerived().parseType(); - if (T == nullptr) - return T; - Node *Ex = getDerived().parseExpr(); - if (Ex == nullptr) - return Ex; - return make<CastExpr>("static_cast", T, Ex); - } - case 'o': - First += 2; - return parseSubobjectExpr(); - case 'p': { - First += 2; - Node *Child = getDerived().parseExpr(); - if (Child == nullptr) - return nullptr; - return make<ParameterPackExpansion>(Child); - } - case 'r': - return getDerived().parseUnresolvedName(); - case 't': { - First += 2; - Node *Ty = getDerived().parseType(); - if (Ty == nullptr) - return Ty; - return make<EnclosingExpr>("sizeof (", Ty, ")"); - } - case 'z': { - First += 2; - Node *Ex = getDerived().parseExpr(); - if (Ex == nullptr) - return Ex; - return make<EnclosingExpr>("sizeof (", Ex, ")"); - } - case 'Z': - First += 2; - if (look() == 'T') { - Node *R = getDerived().parseTemplateParam(); - if (R == nullptr) - return nullptr; - return make<SizeofParamPackExpr>(R); - } else if (look() == 'f') { - Node *FP = getDerived().parseFunctionParam(); - if (FP == nullptr) - return nullptr; - return make<EnclosingExpr>("sizeof... (", FP, ")"); - } - return nullptr; - case 'P': { - First += 2; - size_t ArgsBegin = Names.size(); - while (!consumeIf('E')) { - Node *Arg = getDerived().parseTemplateArg(); - if (Arg == nullptr) - return nullptr; - Names.push_back(Arg); - } - auto *Pack = make<NodeArrayNode>(popTrailingNodeArray(ArgsBegin)); - if (!Pack) - return nullptr; - return make<EnclosingExpr>("sizeof... (", Pack, ")"); - } - } - return nullptr; - case 't': - switch (First[1]) { - case 'e': { - First += 2; - Node *Ex = getDerived().parseExpr(); - if (Ex == nullptr) - return Ex; - return make<EnclosingExpr>("typeid (", Ex, ")"); - } - case 'i': { - First += 2; - Node *Ty = getDerived().parseType(); - if (Ty == nullptr) - return Ty; - return make<EnclosingExpr>("typeid (", Ty, ")"); - } - case 'l': { - First += 2; - Node *Ty = getDerived().parseType(); - if (Ty == nullptr) - return nullptr; - size_t InitsBegin = Names.size(); - while (!consumeIf('E')) { - Node *E = getDerived().parseBracedExpr(); - if (E == nullptr) - return nullptr; - Names.push_back(E); - } - return make<InitListExpr>(Ty, popTrailingNodeArray(InitsBegin)); - } - case 'r': - First += 2; - return make<NameType>("throw"); - case 'w': { - First += 2; - Node *Ex = getDerived().parseExpr(); - if (Ex == nullptr) - return nullptr; - return make<ThrowExpr>(Ex); - } - } - return nullptr; - case 'u': { - ++First; - Node *Name = getDerived().parseSourceName(/*NameState=*/nullptr); - if (!Name) - return nullptr; - // Special case legacy __uuidof mangling. The 't' and 'z' appear where the - // standard encoding expects a <template-arg>, and would be otherwise be - // interpreted as <type> node 'short' or 'ellipsis'. However, neither - // __uuidof(short) nor __uuidof(...) can actually appear, so there is no - // actual conflict here. - if (Name->getBaseName() == "__uuidof") { - if (numLeft() < 2) - return nullptr; - if (*First == 't') { - ++First; - Node *Ty = getDerived().parseType(); - if (!Ty) - return nullptr; - return make<CallExpr>(Name, makeNodeArray(&Ty, &Ty + 1)); - } - if (*First == 'z') { - ++First; - Node *Ex = getDerived().parseExpr(); - if (!Ex) - return nullptr; - return make<CallExpr>(Name, makeNodeArray(&Ex, &Ex + 1)); - } - } - size_t ExprsBegin = Names.size(); - while (!consumeIf('E')) { - Node *E = getDerived().parseTemplateArg(); - if (E == nullptr) - return E; - Names.push_back(E); - } - return make<CallExpr>(Name, popTrailingNodeArray(ExprsBegin)); - } - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - return getDerived().parseUnresolvedName(); - } - return nullptr; -} - -// <call-offset> ::= h <nv-offset> _ -// ::= v <v-offset> _ -// -// <nv-offset> ::= <offset number> -// # non-virtual base override -// -// <v-offset> ::= <offset number> _ <virtual offset number> -// # virtual base override, with vcall offset -template <typename Alloc, typename Derived> -bool AbstractManglingParser<Alloc, Derived>::parseCallOffset() { - // Just scan through the call offset, we never add this information into the - // output. - if (consumeIf('h')) - return parseNumber(true).empty() || !consumeIf('_'); - if (consumeIf('v')) - return parseNumber(true).empty() || !consumeIf('_') || - parseNumber(true).empty() || !consumeIf('_'); - return true; -} - -// <special-name> ::= TV <type> # virtual table -// ::= TT <type> # VTT structure (construction vtable index) -// ::= TI <type> # typeinfo structure -// ::= TS <type> # typeinfo name (null-terminated byte string) -// ::= Tc <call-offset> <call-offset> <base encoding> -// # base is the nominal target function of thunk -// # first call-offset is 'this' adjustment -// # second call-offset is result adjustment -// ::= T <call-offset> <base encoding> -// # base is the nominal target function of thunk -// ::= GV <object name> # Guard variable for one-time initialization -// # No <type> -// ::= TW <object name> # Thread-local wrapper -// ::= TH <object name> # Thread-local initialization -// ::= GR <object name> _ # First temporary -// ::= GR <object name> <seq-id> _ # Subsequent temporaries -// extension ::= TC <first type> <number> _ <second type> # construction vtable for second-in-first -// extension ::= GR <object name> # reference temporary for object -template <typename Derived, typename Alloc> -Node *AbstractManglingParser<Derived, Alloc>::parseSpecialName() { - switch (look()) { - case 'T': - switch (look(1)) { - // TA <template-arg> # template parameter object - // - // Not yet in the spec: https://github.com/itanium-cxx-abi/cxx-abi/issues/63 - case 'A': { - First += 2; - Node *Arg = getDerived().parseTemplateArg(); - if (Arg == nullptr) - return nullptr; - return make<SpecialName>("template parameter object for ", Arg); - } - // TV <type> # virtual table - case 'V': { - First += 2; - Node *Ty = getDerived().parseType(); - if (Ty == nullptr) - return nullptr; - return make<SpecialName>("vtable for ", Ty); - } - // TT <type> # VTT structure (construction vtable index) - case 'T': { - First += 2; - Node *Ty = getDerived().parseType(); - if (Ty == nullptr) - return nullptr; - return make<SpecialName>("VTT for ", Ty); - } - // TI <type> # typeinfo structure - case 'I': { - First += 2; - Node *Ty = getDerived().parseType(); - if (Ty == nullptr) - return nullptr; - return make<SpecialName>("typeinfo for ", Ty); - } - // TS <type> # typeinfo name (null-terminated byte string) - case 'S': { - First += 2; - Node *Ty = getDerived().parseType(); - if (Ty == nullptr) - return nullptr; - return make<SpecialName>("typeinfo name for ", Ty); - } - // Tc <call-offset> <call-offset> <base encoding> - case 'c': { - First += 2; - if (parseCallOffset() || parseCallOffset()) - return nullptr; - Node *Encoding = getDerived().parseEncoding(); - if (Encoding == nullptr) - return nullptr; - return make<SpecialName>("covariant return thunk to ", Encoding); - } - // extension ::= TC <first type> <number> _ <second type> - // # construction vtable for second-in-first - case 'C': { - First += 2; - Node *FirstType = getDerived().parseType(); - if (FirstType == nullptr) - return nullptr; - if (parseNumber(true).empty() || !consumeIf('_')) - return nullptr; - Node *SecondType = getDerived().parseType(); - if (SecondType == nullptr) - return nullptr; - return make<CtorVtableSpecialName>(SecondType, FirstType); - } - // TW <object name> # Thread-local wrapper - case 'W': { - First += 2; - Node *Name = getDerived().parseName(); - if (Name == nullptr) - return nullptr; - return make<SpecialName>("thread-local wrapper routine for ", Name); - } - // TH <object name> # Thread-local initialization - case 'H': { - First += 2; - Node *Name = getDerived().parseName(); - if (Name == nullptr) - return nullptr; - return make<SpecialName>("thread-local initialization routine for ", Name); - } - // T <call-offset> <base encoding> - default: { - ++First; - bool IsVirt = look() == 'v'; - if (parseCallOffset()) - return nullptr; - Node *BaseEncoding = getDerived().parseEncoding(); - if (BaseEncoding == nullptr) - return nullptr; - if (IsVirt) - return make<SpecialName>("virtual thunk to ", BaseEncoding); - else - return make<SpecialName>("non-virtual thunk to ", BaseEncoding); - } - } - case 'G': - switch (look(1)) { - // GV <object name> # Guard variable for one-time initialization - case 'V': { - First += 2; - Node *Name = getDerived().parseName(); - if (Name == nullptr) - return nullptr; - return make<SpecialName>("guard variable for ", Name); - } - // GR <object name> # reference temporary for object - // GR <object name> _ # First temporary - // GR <object name> <seq-id> _ # Subsequent temporaries - case 'R': { - First += 2; - Node *Name = getDerived().parseName(); - if (Name == nullptr) - return nullptr; - size_t Count; - bool ParsedSeqId = !parseSeqId(&Count); - if (!consumeIf('_') && ParsedSeqId) - return nullptr; - return make<SpecialName>("reference temporary for ", Name); - } - } - } - return nullptr; -} - -// <encoding> ::= <function name> <bare-function-type> -// ::= <data name> -// ::= <special-name> -template <typename Derived, typename Alloc> -Node *AbstractManglingParser<Derived, Alloc>::parseEncoding() { - // The template parameters of an encoding are unrelated to those of the - // enclosing context. - class SaveTemplateParams { - AbstractManglingParser *Parser; - decltype(TemplateParams) OldParams; + // ::= Di # char32_t + case 'i': + First += 2; + return make<NameType>("char32_t"); + // ::= Ds # char16_t + case 's': + First += 2; + return make<NameType>("char16_t"); + // ::= Du # char8_t (C++2a, not yet in the Itanium spec) + case 'u': + First += 2; + return make<NameType>("char8_t"); + // ::= Da # auto (in dependent new-expressions) + case 'a': + First += 2; + return make<NameType>("auto"); + // ::= Dc # decltype(auto) + case 'c': + First += 2; + return make<NameType>("decltype(auto)"); + // ::= Dn # std::nullptr_t (i.e., decltype(nullptr)) + case 'n': + First += 2; + return make<NameType>("std::nullptr_t"); + + // ::= <decltype> + case 't': + case 'T': { + Result = getDerived().parseDecltype(); + break; + } + // extension ::= <vector-type> # <vector-type> starts with Dv + case 'v': { + Result = getDerived().parseVectorType(); + break; + } + // ::= Dp <type> # pack expansion (C++0x) + case 'p': { + First += 2; + Node *Child = getDerived().parseType(); + if (!Child) + return nullptr; + Result = make<ParameterPackExpansion>(Child); + break; + } + // Exception specifier on a function type. + case 'o': + case 'O': + case 'w': + // Transaction safe function type. + case 'x': + Result = getDerived().parseFunctionType(); + break; + } + break; + // ::= <function-type> + case 'F': { + Result = getDerived().parseFunctionType(); + break; + } + // ::= <array-type> + case 'A': { + Result = getDerived().parseArrayType(); + break; + } + // ::= <pointer-to-member-type> + case 'M': { + Result = getDerived().parsePointerToMemberType(); + break; + } + // ::= <template-param> + case 'T': { + // This could be an elaborate type specifier on a <class-enum-type>. + if (look(1) == 's' || look(1) == 'u' || look(1) == 'e') { + Result = getDerived().parseClassEnumType(); + break; + } + + Result = getDerived().parseTemplateParam(); + if (Result == nullptr) + return nullptr; + + // Result could be either of: + // <type> ::= <template-param> + // <type> ::= <template-template-param> <template-args> + // + // <template-template-param> ::= <template-param> + // ::= <substitution> + // + // If this is followed by some <template-args>, and we're permitted to + // parse them, take the second production. + + if (TryToParseTemplateArgs && look() == 'I') { + Node *TA = getDerived().parseTemplateArgs(); + if (TA == nullptr) + return nullptr; + Result = make<NameWithTemplateArgs>(Result, TA); + } + break; + } + // ::= P <type> # pointer + case 'P': { + ++First; + Node *Ptr = getDerived().parseType(); + if (Ptr == nullptr) + return nullptr; + Result = make<PointerType>(Ptr); + break; + } + // ::= R <type> # l-value reference + case 'R': { + ++First; + Node *Ref = getDerived().parseType(); + if (Ref == nullptr) + return nullptr; + Result = make<ReferenceType>(Ref, ReferenceKind::LValue); + break; + } + // ::= O <type> # r-value reference (C++11) + case 'O': { + ++First; + Node *Ref = getDerived().parseType(); + if (Ref == nullptr) + return nullptr; + Result = make<ReferenceType>(Ref, ReferenceKind::RValue); + break; + } + // ::= C <type> # complex pair (C99) + case 'C': { + ++First; + Node *P = getDerived().parseType(); + if (P == nullptr) + return nullptr; + Result = make<PostfixQualifiedType>(P, " complex"); + break; + } + // ::= G <type> # imaginary (C99) + case 'G': { + ++First; + Node *P = getDerived().parseType(); + if (P == nullptr) + return P; + Result = make<PostfixQualifiedType>(P, " imaginary"); + break; + } + // ::= <substitution> # See Compression below + case 'S': { + if (look(1) && look(1) != 't') { + Node *Sub = getDerived().parseSubstitution(); + if (Sub == nullptr) + return nullptr; + + // Sub could be either of: + // <type> ::= <substitution> + // <type> ::= <template-template-param> <template-args> + // + // <template-template-param> ::= <template-param> + // ::= <substitution> + // + // If this is followed by some <template-args>, and we're permitted to + // parse them, take the second production. + + if (TryToParseTemplateArgs && look() == 'I') { + Node *TA = getDerived().parseTemplateArgs(); + if (TA == nullptr) + return nullptr; + Result = make<NameWithTemplateArgs>(Sub, TA); + break; + } + + // If all we parsed was a substitution, don't re-insert into the + // substitution table. + return Sub; + } + DEMANGLE_FALLTHROUGH; + } + // ::= <class-enum-type> + default: { + Result = getDerived().parseClassEnumType(); + break; + } + } + + // If we parsed a type, insert it into the substitution table. Note that all + // <builtin-type>s and <substitution>s have already bailed out, because they + // don't get substitutions. + if (Result != nullptr) + Subs.push_back(Result); + return Result; +} + +template <typename Derived, typename Alloc> +Node *AbstractManglingParser<Derived, Alloc>::parsePrefixExpr(StringView Kind) { + Node *E = getDerived().parseExpr(); + if (E == nullptr) + return nullptr; + return make<PrefixExpr>(Kind, E); +} + +template <typename Derived, typename Alloc> +Node *AbstractManglingParser<Derived, Alloc>::parseBinaryExpr(StringView Kind) { + Node *LHS = getDerived().parseExpr(); + if (LHS == nullptr) + return nullptr; + Node *RHS = getDerived().parseExpr(); + if (RHS == nullptr) + return nullptr; + return make<BinaryExpr>(LHS, Kind, RHS); +} + +template <typename Derived, typename Alloc> +Node * +AbstractManglingParser<Derived, Alloc>::parseIntegerLiteral(StringView Lit) { + StringView Tmp = parseNumber(true); + if (!Tmp.empty() && consumeIf('E')) + return make<IntegerLiteral>(Lit, Tmp); + return nullptr; +} + +// <CV-Qualifiers> ::= [r] [V] [K] +template <typename Alloc, typename Derived> +Qualifiers AbstractManglingParser<Alloc, Derived>::parseCVQualifiers() { + Qualifiers CVR = QualNone; + if (consumeIf('r')) + CVR |= QualRestrict; + if (consumeIf('V')) + CVR |= QualVolatile; + if (consumeIf('K')) + CVR |= QualConst; + return CVR; +} + +// <function-param> ::= fp <top-level CV-Qualifiers> _ # L == 0, first parameter +// ::= fp <top-level CV-Qualifiers> <parameter-2 non-negative number> _ # L == 0, second and later parameters +// ::= fL <L-1 non-negative number> p <top-level CV-Qualifiers> _ # L > 0, first parameter +// ::= fL <L-1 non-negative number> p <top-level CV-Qualifiers> <parameter-2 non-negative number> _ # L > 0, second and later parameters +// ::= fpT # 'this' expression (not part of standard?) +template <typename Derived, typename Alloc> +Node *AbstractManglingParser<Derived, Alloc>::parseFunctionParam() { + if (consumeIf("fpT")) + return make<NameType>("this"); + if (consumeIf("fp")) { + parseCVQualifiers(); + StringView Num = parseNumber(); + if (!consumeIf('_')) + return nullptr; + return make<FunctionParam>(Num); + } + if (consumeIf("fL")) { + if (parseNumber().empty()) + return nullptr; + if (!consumeIf('p')) + return nullptr; + parseCVQualifiers(); + StringView Num = parseNumber(); + if (!consumeIf('_')) + return nullptr; + return make<FunctionParam>(Num); + } + return nullptr; +} + +// [gs] nw <expression>* _ <type> E # new (expr-list) type +// [gs] nw <expression>* _ <type> <initializer> # new (expr-list) type (init) +// [gs] na <expression>* _ <type> E # new[] (expr-list) type +// [gs] na <expression>* _ <type> <initializer> # new[] (expr-list) type (init) +// <initializer> ::= pi <expression>* E # parenthesized initialization +template <typename Derived, typename Alloc> +Node *AbstractManglingParser<Derived, Alloc>::parseNewExpr() { + bool Global = consumeIf("gs"); + bool IsArray = look(1) == 'a'; + if (!consumeIf("nw") && !consumeIf("na")) + return nullptr; + size_t Exprs = Names.size(); + while (!consumeIf('_')) { + Node *Ex = getDerived().parseExpr(); + if (Ex == nullptr) + return nullptr; + Names.push_back(Ex); + } + NodeArray ExprList = popTrailingNodeArray(Exprs); + Node *Ty = getDerived().parseType(); + if (Ty == nullptr) + return Ty; + if (consumeIf("pi")) { + size_t InitsBegin = Names.size(); + while (!consumeIf('E')) { + Node *Init = getDerived().parseExpr(); + if (Init == nullptr) + return Init; + Names.push_back(Init); + } + NodeArray Inits = popTrailingNodeArray(InitsBegin); + return make<NewExpr>(ExprList, Ty, Inits, Global, IsArray); + } else if (!consumeIf('E')) + return nullptr; + return make<NewExpr>(ExprList, Ty, NodeArray(), Global, IsArray); +} + +// cv <type> <expression> # conversion with one argument +// cv <type> _ <expression>* E # conversion with a different number of arguments +template <typename Derived, typename Alloc> +Node *AbstractManglingParser<Derived, Alloc>::parseConversionExpr() { + if (!consumeIf("cv")) + return nullptr; + Node *Ty; + { + SwapAndRestore<bool> SaveTemp(TryToParseTemplateArgs, false); + Ty = getDerived().parseType(); + } + + if (Ty == nullptr) + return nullptr; + + if (consumeIf('_')) { + size_t ExprsBegin = Names.size(); + while (!consumeIf('E')) { + Node *E = getDerived().parseExpr(); + if (E == nullptr) + return E; + Names.push_back(E); + } + NodeArray Exprs = popTrailingNodeArray(ExprsBegin); + return make<ConversionExpr>(Ty, Exprs); + } + + Node *E[1] = {getDerived().parseExpr()}; + if (E[0] == nullptr) + return nullptr; + return make<ConversionExpr>(Ty, makeNodeArray(E, E + 1)); +} + +// <expr-primary> ::= L <type> <value number> E # integer literal +// ::= L <type> <value float> E # floating literal +// ::= L <string type> E # string literal +// ::= L <nullptr type> E # nullptr literal (i.e., "LDnE") +// ::= L <lambda type> E # lambda expression +// FIXME: ::= L <type> <real-part float> _ <imag-part float> E # complex floating point literal (C 2000) +// ::= L <mangled-name> E # external name +template <typename Derived, typename Alloc> +Node *AbstractManglingParser<Derived, Alloc>::parseExprPrimary() { + if (!consumeIf('L')) + return nullptr; + switch (look()) { + case 'w': + ++First; + return getDerived().parseIntegerLiteral("wchar_t"); + case 'b': + if (consumeIf("b0E")) + return make<BoolExpr>(0); + if (consumeIf("b1E")) + return make<BoolExpr>(1); + return nullptr; + case 'c': + ++First; + return getDerived().parseIntegerLiteral("char"); + case 'a': + ++First; + return getDerived().parseIntegerLiteral("signed char"); + case 'h': + ++First; + return getDerived().parseIntegerLiteral("unsigned char"); + case 's': + ++First; + return getDerived().parseIntegerLiteral("short"); + case 't': + ++First; + return getDerived().parseIntegerLiteral("unsigned short"); + case 'i': + ++First; + return getDerived().parseIntegerLiteral(""); + case 'j': + ++First; + return getDerived().parseIntegerLiteral("u"); + case 'l': + ++First; + return getDerived().parseIntegerLiteral("l"); + case 'm': + ++First; + return getDerived().parseIntegerLiteral("ul"); + case 'x': + ++First; + return getDerived().parseIntegerLiteral("ll"); + case 'y': + ++First; + return getDerived().parseIntegerLiteral("ull"); + case 'n': + ++First; + return getDerived().parseIntegerLiteral("__int128"); + case 'o': + ++First; + return getDerived().parseIntegerLiteral("unsigned __int128"); + case 'f': + ++First; + return getDerived().template parseFloatingLiteral<float>(); + case 'd': + ++First; + return getDerived().template parseFloatingLiteral<double>(); + case 'e': + ++First; +#if defined(__powerpc__) || defined(__s390__) + // Handle cases where long doubles encoded with e have the same size + // and representation as doubles. + return getDerived().template parseFloatingLiteral<double>(); +#else + return getDerived().template parseFloatingLiteral<long double>(); +#endif + case '_': + if (consumeIf("_Z")) { + Node *R = getDerived().parseEncoding(); + if (R != nullptr && consumeIf('E')) + return R; + } + return nullptr; + case 'A': { + Node *T = getDerived().parseType(); + if (T == nullptr) + return nullptr; + // FIXME: We need to include the string contents in the mangling. + if (consumeIf('E')) + return make<StringLiteral>(T); + return nullptr; + } + case 'D': + if (consumeIf("DnE")) + return make<NameType>("nullptr"); + return nullptr; + case 'T': + // Invalid mangled name per + // http://sourcerytools.com/pipermail/cxx-abi-dev/2011-August/002422.html + return nullptr; + case 'U': { + // FIXME: Should we support LUb... for block literals? + if (look(1) != 'l') + return nullptr; + Node *T = parseUnnamedTypeName(nullptr); + if (!T || !consumeIf('E')) + return nullptr; + return make<LambdaExpr>(T); + } + default: { + // might be named type + Node *T = getDerived().parseType(); + if (T == nullptr) + return nullptr; + StringView N = parseNumber(/*AllowNegative=*/true); + if (N.empty()) + return nullptr; + if (!consumeIf('E')) + return nullptr; + return make<EnumLiteral>(T, N); + } + } +} + +// <braced-expression> ::= <expression> +// ::= di <field source-name> <braced-expression> # .name = expr +// ::= dx <index expression> <braced-expression> # [expr] = expr +// ::= dX <range begin expression> <range end expression> <braced-expression> +template <typename Derived, typename Alloc> +Node *AbstractManglingParser<Derived, Alloc>::parseBracedExpr() { + if (look() == 'd') { + switch (look(1)) { + case 'i': { + First += 2; + Node *Field = getDerived().parseSourceName(/*NameState=*/nullptr); + if (Field == nullptr) + return nullptr; + Node *Init = getDerived().parseBracedExpr(); + if (Init == nullptr) + return nullptr; + return make<BracedExpr>(Field, Init, /*isArray=*/false); + } + case 'x': { + First += 2; + Node *Index = getDerived().parseExpr(); + if (Index == nullptr) + return nullptr; + Node *Init = getDerived().parseBracedExpr(); + if (Init == nullptr) + return nullptr; + return make<BracedExpr>(Index, Init, /*isArray=*/true); + } + case 'X': { + First += 2; + Node *RangeBegin = getDerived().parseExpr(); + if (RangeBegin == nullptr) + return nullptr; + Node *RangeEnd = getDerived().parseExpr(); + if (RangeEnd == nullptr) + return nullptr; + Node *Init = getDerived().parseBracedExpr(); + if (Init == nullptr) + return nullptr; + return make<BracedRangeExpr>(RangeBegin, RangeEnd, Init); + } + } + } + return getDerived().parseExpr(); +} + +// (not yet in the spec) +// <fold-expr> ::= fL <binary-operator-name> <expression> <expression> +// ::= fR <binary-operator-name> <expression> <expression> +// ::= fl <binary-operator-name> <expression> +// ::= fr <binary-operator-name> <expression> +template <typename Derived, typename Alloc> +Node *AbstractManglingParser<Derived, Alloc>::parseFoldExpr() { + if (!consumeIf('f')) + return nullptr; + + char FoldKind = look(); + bool IsLeftFold, HasInitializer; + HasInitializer = FoldKind == 'L' || FoldKind == 'R'; + if (FoldKind == 'l' || FoldKind == 'L') + IsLeftFold = true; + else if (FoldKind == 'r' || FoldKind == 'R') + IsLeftFold = false; + else + return nullptr; + ++First; + + // FIXME: This map is duplicated in parseOperatorName and parseExpr. + StringView OperatorName; + if (consumeIf("aa")) OperatorName = "&&"; + else if (consumeIf("an")) OperatorName = "&"; + else if (consumeIf("aN")) OperatorName = "&="; + else if (consumeIf("aS")) OperatorName = "="; + else if (consumeIf("cm")) OperatorName = ","; + else if (consumeIf("ds")) OperatorName = ".*"; + else if (consumeIf("dv")) OperatorName = "/"; + else if (consumeIf("dV")) OperatorName = "/="; + else if (consumeIf("eo")) OperatorName = "^"; + else if (consumeIf("eO")) OperatorName = "^="; + else if (consumeIf("eq")) OperatorName = "=="; + else if (consumeIf("ge")) OperatorName = ">="; + else if (consumeIf("gt")) OperatorName = ">"; + else if (consumeIf("le")) OperatorName = "<="; + else if (consumeIf("ls")) OperatorName = "<<"; + else if (consumeIf("lS")) OperatorName = "<<="; + else if (consumeIf("lt")) OperatorName = "<"; + else if (consumeIf("mi")) OperatorName = "-"; + else if (consumeIf("mI")) OperatorName = "-="; + else if (consumeIf("ml")) OperatorName = "*"; + else if (consumeIf("mL")) OperatorName = "*="; + else if (consumeIf("ne")) OperatorName = "!="; + else if (consumeIf("oo")) OperatorName = "||"; + else if (consumeIf("or")) OperatorName = "|"; + else if (consumeIf("oR")) OperatorName = "|="; + else if (consumeIf("pl")) OperatorName = "+"; + else if (consumeIf("pL")) OperatorName = "+="; + else if (consumeIf("rm")) OperatorName = "%"; + else if (consumeIf("rM")) OperatorName = "%="; + else if (consumeIf("rs")) OperatorName = ">>"; + else if (consumeIf("rS")) OperatorName = ">>="; + else return nullptr; + + Node *Pack = getDerived().parseExpr(), *Init = nullptr; + if (Pack == nullptr) + return nullptr; + if (HasInitializer) { + Init = getDerived().parseExpr(); + if (Init == nullptr) + return nullptr; + } + + if (IsLeftFold && Init) + std::swap(Pack, Init); + + return make<FoldExpr>(IsLeftFold, OperatorName, Pack, Init); +} + +// <expression> ::= mc <parameter type> <expr> [<offset number>] E +// +// Not yet in the spec: https://github.com/itanium-cxx-abi/cxx-abi/issues/47 +template <typename Derived, typename Alloc> +Node *AbstractManglingParser<Derived, Alloc>::parsePointerToMemberConversionExpr() { + Node *Ty = getDerived().parseType(); + if (!Ty) + return nullptr; + Node *Expr = getDerived().parseExpr(); + if (!Expr) + return nullptr; + StringView Offset = getDerived().parseNumber(true); + if (!consumeIf('E')) + return nullptr; + return make<PointerToMemberConversionExpr>(Ty, Expr, Offset); +} + +// <expression> ::= so <referent type> <expr> [<offset number>] <union-selector>* [p] E +// <union-selector> ::= _ [<number>] +// +// Not yet in the spec: https://github.com/itanium-cxx-abi/cxx-abi/issues/47 +template <typename Derived, typename Alloc> +Node *AbstractManglingParser<Derived, Alloc>::parseSubobjectExpr() { + Node *Ty = getDerived().parseType(); + if (!Ty) + return nullptr; + Node *Expr = getDerived().parseExpr(); + if (!Expr) + return nullptr; + StringView Offset = getDerived().parseNumber(true); + size_t SelectorsBegin = Names.size(); + while (consumeIf('_')) { + Node *Selector = make<NameType>(parseNumber()); + if (!Selector) + return nullptr; + Names.push_back(Selector); + } + bool OnePastTheEnd = consumeIf('p'); + if (!consumeIf('E')) + return nullptr; + return make<SubobjectExpr>( + Ty, Expr, Offset, popTrailingNodeArray(SelectorsBegin), OnePastTheEnd); +} + +// <expression> ::= <unary operator-name> <expression> +// ::= <binary operator-name> <expression> <expression> +// ::= <ternary operator-name> <expression> <expression> <expression> +// ::= cl <expression>+ E # call +// ::= cv <type> <expression> # conversion with one argument +// ::= cv <type> _ <expression>* E # conversion with a different number of arguments +// ::= [gs] nw <expression>* _ <type> E # new (expr-list) type +// ::= [gs] nw <expression>* _ <type> <initializer> # new (expr-list) type (init) +// ::= [gs] na <expression>* _ <type> E # new[] (expr-list) type +// ::= [gs] na <expression>* _ <type> <initializer> # new[] (expr-list) type (init) +// ::= [gs] dl <expression> # delete expression +// ::= [gs] da <expression> # delete[] expression +// ::= pp_ <expression> # prefix ++ +// ::= mm_ <expression> # prefix -- +// ::= ti <type> # typeid (type) +// ::= te <expression> # typeid (expression) +// ::= dc <type> <expression> # dynamic_cast<type> (expression) +// ::= sc <type> <expression> # static_cast<type> (expression) +// ::= cc <type> <expression> # const_cast<type> (expression) +// ::= rc <type> <expression> # reinterpret_cast<type> (expression) +// ::= st <type> # sizeof (a type) +// ::= sz <expression> # sizeof (an expression) +// ::= at <type> # alignof (a type) +// ::= az <expression> # alignof (an expression) +// ::= nx <expression> # noexcept (expression) +// ::= <template-param> +// ::= <function-param> +// ::= dt <expression> <unresolved-name> # expr.name +// ::= pt <expression> <unresolved-name> # expr->name +// ::= ds <expression> <expression> # expr.*expr +// ::= sZ <template-param> # size of a parameter pack +// ::= sZ <function-param> # size of a function parameter pack +// ::= sP <template-arg>* E # sizeof...(T), size of a captured template parameter pack from an alias template +// ::= sp <expression> # pack expansion +// ::= tw <expression> # throw expression +// ::= tr # throw with no operand (rethrow) +// ::= <unresolved-name> # f(p), N::f(p), ::f(p), +// # freestanding dependent name (e.g., T::x), +// # objectless nonstatic member reference +// ::= fL <binary-operator-name> <expression> <expression> +// ::= fR <binary-operator-name> <expression> <expression> +// ::= fl <binary-operator-name> <expression> +// ::= fr <binary-operator-name> <expression> +// ::= <expr-primary> +template <typename Derived, typename Alloc> +Node *AbstractManglingParser<Derived, Alloc>::parseExpr() { + bool Global = consumeIf("gs"); + if (numLeft() < 2) + return nullptr; + + switch (*First) { + case 'L': + return getDerived().parseExprPrimary(); + case 'T': + return getDerived().parseTemplateParam(); + case 'f': { + // Disambiguate a fold expression from a <function-param>. + if (look(1) == 'p' || (look(1) == 'L' && std::isdigit(look(2)))) + return getDerived().parseFunctionParam(); + return getDerived().parseFoldExpr(); + } + case 'a': + switch (First[1]) { + case 'a': + First += 2; + return getDerived().parseBinaryExpr("&&"); + case 'd': + First += 2; + return getDerived().parsePrefixExpr("&"); + case 'n': + First += 2; + return getDerived().parseBinaryExpr("&"); + case 'N': + First += 2; + return getDerived().parseBinaryExpr("&="); + case 'S': + First += 2; + return getDerived().parseBinaryExpr("="); + case 't': { + First += 2; + Node *Ty = getDerived().parseType(); + if (Ty == nullptr) + return nullptr; + return make<EnclosingExpr>("alignof (", Ty, ")"); + } + case 'z': { + First += 2; + Node *Ty = getDerived().parseExpr(); + if (Ty == nullptr) + return nullptr; + return make<EnclosingExpr>("alignof (", Ty, ")"); + } + } + return nullptr; + case 'c': + switch (First[1]) { + // cc <type> <expression> # const_cast<type>(expression) + case 'c': { + First += 2; + Node *Ty = getDerived().parseType(); + if (Ty == nullptr) + return Ty; + Node *Ex = getDerived().parseExpr(); + if (Ex == nullptr) + return Ex; + return make<CastExpr>("const_cast", Ty, Ex); + } + // cl <expression>+ E # call + case 'l': { + First += 2; + Node *Callee = getDerived().parseExpr(); + if (Callee == nullptr) + return Callee; + size_t ExprsBegin = Names.size(); + while (!consumeIf('E')) { + Node *E = getDerived().parseExpr(); + if (E == nullptr) + return E; + Names.push_back(E); + } + return make<CallExpr>(Callee, popTrailingNodeArray(ExprsBegin)); + } + case 'm': + First += 2; + return getDerived().parseBinaryExpr(","); + case 'o': + First += 2; + return getDerived().parsePrefixExpr("~"); + case 'v': + return getDerived().parseConversionExpr(); + } + return nullptr; + case 'd': + switch (First[1]) { + case 'a': { + First += 2; + Node *Ex = getDerived().parseExpr(); + if (Ex == nullptr) + return Ex; + return make<DeleteExpr>(Ex, Global, /*is_array=*/true); + } + case 'c': { + First += 2; + Node *T = getDerived().parseType(); + if (T == nullptr) + return T; + Node *Ex = getDerived().parseExpr(); + if (Ex == nullptr) + return Ex; + return make<CastExpr>("dynamic_cast", T, Ex); + } + case 'e': + First += 2; + return getDerived().parsePrefixExpr("*"); + case 'l': { + First += 2; + Node *E = getDerived().parseExpr(); + if (E == nullptr) + return E; + return make<DeleteExpr>(E, Global, /*is_array=*/false); + } + case 'n': + return getDerived().parseUnresolvedName(); + case 's': { + First += 2; + Node *LHS = getDerived().parseExpr(); + if (LHS == nullptr) + return nullptr; + Node *RHS = getDerived().parseExpr(); + if (RHS == nullptr) + return nullptr; + return make<MemberExpr>(LHS, ".*", RHS); + } + case 't': { + First += 2; + Node *LHS = getDerived().parseExpr(); + if (LHS == nullptr) + return LHS; + Node *RHS = getDerived().parseExpr(); + if (RHS == nullptr) + return nullptr; + return make<MemberExpr>(LHS, ".", RHS); + } + case 'v': + First += 2; + return getDerived().parseBinaryExpr("/"); + case 'V': + First += 2; + return getDerived().parseBinaryExpr("/="); + } + return nullptr; + case 'e': + switch (First[1]) { + case 'o': + First += 2; + return getDerived().parseBinaryExpr("^"); + case 'O': + First += 2; + return getDerived().parseBinaryExpr("^="); + case 'q': + First += 2; + return getDerived().parseBinaryExpr("=="); + } + return nullptr; + case 'g': + switch (First[1]) { + case 'e': + First += 2; + return getDerived().parseBinaryExpr(">="); + case 't': + First += 2; + return getDerived().parseBinaryExpr(">"); + } + return nullptr; + case 'i': + switch (First[1]) { + case 'x': { + First += 2; + Node *Base = getDerived().parseExpr(); + if (Base == nullptr) + return nullptr; + Node *Index = getDerived().parseExpr(); + if (Index == nullptr) + return Index; + return make<ArraySubscriptExpr>(Base, Index); + } + case 'l': { + First += 2; + size_t InitsBegin = Names.size(); + while (!consumeIf('E')) { + Node *E = getDerived().parseBracedExpr(); + if (E == nullptr) + return nullptr; + Names.push_back(E); + } + return make<InitListExpr>(nullptr, popTrailingNodeArray(InitsBegin)); + } + } + return nullptr; + case 'l': + switch (First[1]) { + case 'e': + First += 2; + return getDerived().parseBinaryExpr("<="); + case 's': + First += 2; + return getDerived().parseBinaryExpr("<<"); + case 'S': + First += 2; + return getDerived().parseBinaryExpr("<<="); + case 't': + First += 2; + return getDerived().parseBinaryExpr("<"); + } + return nullptr; + case 'm': + switch (First[1]) { + case 'c': + First += 2; + return parsePointerToMemberConversionExpr(); + case 'i': + First += 2; + return getDerived().parseBinaryExpr("-"); + case 'I': + First += 2; + return getDerived().parseBinaryExpr("-="); + case 'l': + First += 2; + return getDerived().parseBinaryExpr("*"); + case 'L': + First += 2; + return getDerived().parseBinaryExpr("*="); + case 'm': + First += 2; + if (consumeIf('_')) + return getDerived().parsePrefixExpr("--"); + Node *Ex = getDerived().parseExpr(); + if (Ex == nullptr) + return nullptr; + return make<PostfixExpr>(Ex, "--"); + } + return nullptr; + case 'n': + switch (First[1]) { + case 'a': + case 'w': + return getDerived().parseNewExpr(); + case 'e': + First += 2; + return getDerived().parseBinaryExpr("!="); + case 'g': + First += 2; + return getDerived().parsePrefixExpr("-"); + case 't': + First += 2; + return getDerived().parsePrefixExpr("!"); + case 'x': + First += 2; + Node *Ex = getDerived().parseExpr(); + if (Ex == nullptr) + return Ex; + return make<EnclosingExpr>("noexcept (", Ex, ")"); + } + return nullptr; + case 'o': + switch (First[1]) { + case 'n': + return getDerived().parseUnresolvedName(); + case 'o': + First += 2; + return getDerived().parseBinaryExpr("||"); + case 'r': + First += 2; + return getDerived().parseBinaryExpr("|"); + case 'R': + First += 2; + return getDerived().parseBinaryExpr("|="); + } + return nullptr; + case 'p': + switch (First[1]) { + case 'm': + First += 2; + return getDerived().parseBinaryExpr("->*"); + case 'l': + First += 2; + return getDerived().parseBinaryExpr("+"); + case 'L': + First += 2; + return getDerived().parseBinaryExpr("+="); + case 'p': { + First += 2; + if (consumeIf('_')) + return getDerived().parsePrefixExpr("++"); + Node *Ex = getDerived().parseExpr(); + if (Ex == nullptr) + return Ex; + return make<PostfixExpr>(Ex, "++"); + } + case 's': + First += 2; + return getDerived().parsePrefixExpr("+"); + case 't': { + First += 2; + Node *L = getDerived().parseExpr(); + if (L == nullptr) + return nullptr; + Node *R = getDerived().parseExpr(); + if (R == nullptr) + return nullptr; + return make<MemberExpr>(L, "->", R); + } + } + return nullptr; + case 'q': + if (First[1] == 'u') { + First += 2; + Node *Cond = getDerived().parseExpr(); + if (Cond == nullptr) + return nullptr; + Node *LHS = getDerived().parseExpr(); + if (LHS == nullptr) + return nullptr; + Node *RHS = getDerived().parseExpr(); + if (RHS == nullptr) + return nullptr; + return make<ConditionalExpr>(Cond, LHS, RHS); + } + return nullptr; + case 'r': + switch (First[1]) { + case 'c': { + First += 2; + Node *T = getDerived().parseType(); + if (T == nullptr) + return T; + Node *Ex = getDerived().parseExpr(); + if (Ex == nullptr) + return Ex; + return make<CastExpr>("reinterpret_cast", T, Ex); + } + case 'm': + First += 2; + return getDerived().parseBinaryExpr("%"); + case 'M': + First += 2; + return getDerived().parseBinaryExpr("%="); + case 's': + First += 2; + return getDerived().parseBinaryExpr(">>"); + case 'S': + First += 2; + return getDerived().parseBinaryExpr(">>="); + } + return nullptr; + case 's': + switch (First[1]) { + case 'c': { + First += 2; + Node *T = getDerived().parseType(); + if (T == nullptr) + return T; + Node *Ex = getDerived().parseExpr(); + if (Ex == nullptr) + return Ex; + return make<CastExpr>("static_cast", T, Ex); + } + case 'o': + First += 2; + return parseSubobjectExpr(); + case 'p': { + First += 2; + Node *Child = getDerived().parseExpr(); + if (Child == nullptr) + return nullptr; + return make<ParameterPackExpansion>(Child); + } + case 'r': + return getDerived().parseUnresolvedName(); + case 't': { + First += 2; + Node *Ty = getDerived().parseType(); + if (Ty == nullptr) + return Ty; + return make<EnclosingExpr>("sizeof (", Ty, ")"); + } + case 'z': { + First += 2; + Node *Ex = getDerived().parseExpr(); + if (Ex == nullptr) + return Ex; + return make<EnclosingExpr>("sizeof (", Ex, ")"); + } + case 'Z': + First += 2; + if (look() == 'T') { + Node *R = getDerived().parseTemplateParam(); + if (R == nullptr) + return nullptr; + return make<SizeofParamPackExpr>(R); + } else if (look() == 'f') { + Node *FP = getDerived().parseFunctionParam(); + if (FP == nullptr) + return nullptr; + return make<EnclosingExpr>("sizeof... (", FP, ")"); + } + return nullptr; + case 'P': { + First += 2; + size_t ArgsBegin = Names.size(); + while (!consumeIf('E')) { + Node *Arg = getDerived().parseTemplateArg(); + if (Arg == nullptr) + return nullptr; + Names.push_back(Arg); + } + auto *Pack = make<NodeArrayNode>(popTrailingNodeArray(ArgsBegin)); + if (!Pack) + return nullptr; + return make<EnclosingExpr>("sizeof... (", Pack, ")"); + } + } + return nullptr; + case 't': + switch (First[1]) { + case 'e': { + First += 2; + Node *Ex = getDerived().parseExpr(); + if (Ex == nullptr) + return Ex; + return make<EnclosingExpr>("typeid (", Ex, ")"); + } + case 'i': { + First += 2; + Node *Ty = getDerived().parseType(); + if (Ty == nullptr) + return Ty; + return make<EnclosingExpr>("typeid (", Ty, ")"); + } + case 'l': { + First += 2; + Node *Ty = getDerived().parseType(); + if (Ty == nullptr) + return nullptr; + size_t InitsBegin = Names.size(); + while (!consumeIf('E')) { + Node *E = getDerived().parseBracedExpr(); + if (E == nullptr) + return nullptr; + Names.push_back(E); + } + return make<InitListExpr>(Ty, popTrailingNodeArray(InitsBegin)); + } + case 'r': + First += 2; + return make<NameType>("throw"); + case 'w': { + First += 2; + Node *Ex = getDerived().parseExpr(); + if (Ex == nullptr) + return nullptr; + return make<ThrowExpr>(Ex); + } + } + return nullptr; + case 'u': { + ++First; + Node *Name = getDerived().parseSourceName(/*NameState=*/nullptr); + if (!Name) + return nullptr; + // Special case legacy __uuidof mangling. The 't' and 'z' appear where the + // standard encoding expects a <template-arg>, and would be otherwise be + // interpreted as <type> node 'short' or 'ellipsis'. However, neither + // __uuidof(short) nor __uuidof(...) can actually appear, so there is no + // actual conflict here. + if (Name->getBaseName() == "__uuidof") { + if (numLeft() < 2) + return nullptr; + if (*First == 't') { + ++First; + Node *Ty = getDerived().parseType(); + if (!Ty) + return nullptr; + return make<CallExpr>(Name, makeNodeArray(&Ty, &Ty + 1)); + } + if (*First == 'z') { + ++First; + Node *Ex = getDerived().parseExpr(); + if (!Ex) + return nullptr; + return make<CallExpr>(Name, makeNodeArray(&Ex, &Ex + 1)); + } + } + size_t ExprsBegin = Names.size(); + while (!consumeIf('E')) { + Node *E = getDerived().parseTemplateArg(); + if (E == nullptr) + return E; + Names.push_back(E); + } + return make<CallExpr>(Name, popTrailingNodeArray(ExprsBegin)); + } + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + return getDerived().parseUnresolvedName(); + } + return nullptr; +} + +// <call-offset> ::= h <nv-offset> _ +// ::= v <v-offset> _ +// +// <nv-offset> ::= <offset number> +// # non-virtual base override +// +// <v-offset> ::= <offset number> _ <virtual offset number> +// # virtual base override, with vcall offset +template <typename Alloc, typename Derived> +bool AbstractManglingParser<Alloc, Derived>::parseCallOffset() { + // Just scan through the call offset, we never add this information into the + // output. + if (consumeIf('h')) + return parseNumber(true).empty() || !consumeIf('_'); + if (consumeIf('v')) + return parseNumber(true).empty() || !consumeIf('_') || + parseNumber(true).empty() || !consumeIf('_'); + return true; +} + +// <special-name> ::= TV <type> # virtual table +// ::= TT <type> # VTT structure (construction vtable index) +// ::= TI <type> # typeinfo structure +// ::= TS <type> # typeinfo name (null-terminated byte string) +// ::= Tc <call-offset> <call-offset> <base encoding> +// # base is the nominal target function of thunk +// # first call-offset is 'this' adjustment +// # second call-offset is result adjustment +// ::= T <call-offset> <base encoding> +// # base is the nominal target function of thunk +// ::= GV <object name> # Guard variable for one-time initialization +// # No <type> +// ::= TW <object name> # Thread-local wrapper +// ::= TH <object name> # Thread-local initialization +// ::= GR <object name> _ # First temporary +// ::= GR <object name> <seq-id> _ # Subsequent temporaries +// extension ::= TC <first type> <number> _ <second type> # construction vtable for second-in-first +// extension ::= GR <object name> # reference temporary for object +template <typename Derived, typename Alloc> +Node *AbstractManglingParser<Derived, Alloc>::parseSpecialName() { + switch (look()) { + case 'T': + switch (look(1)) { + // TA <template-arg> # template parameter object + // + // Not yet in the spec: https://github.com/itanium-cxx-abi/cxx-abi/issues/63 + case 'A': { + First += 2; + Node *Arg = getDerived().parseTemplateArg(); + if (Arg == nullptr) + return nullptr; + return make<SpecialName>("template parameter object for ", Arg); + } + // TV <type> # virtual table + case 'V': { + First += 2; + Node *Ty = getDerived().parseType(); + if (Ty == nullptr) + return nullptr; + return make<SpecialName>("vtable for ", Ty); + } + // TT <type> # VTT structure (construction vtable index) + case 'T': { + First += 2; + Node *Ty = getDerived().parseType(); + if (Ty == nullptr) + return nullptr; + return make<SpecialName>("VTT for ", Ty); + } + // TI <type> # typeinfo structure + case 'I': { + First += 2; + Node *Ty = getDerived().parseType(); + if (Ty == nullptr) + return nullptr; + return make<SpecialName>("typeinfo for ", Ty); + } + // TS <type> # typeinfo name (null-terminated byte string) + case 'S': { + First += 2; + Node *Ty = getDerived().parseType(); + if (Ty == nullptr) + return nullptr; + return make<SpecialName>("typeinfo name for ", Ty); + } + // Tc <call-offset> <call-offset> <base encoding> + case 'c': { + First += 2; + if (parseCallOffset() || parseCallOffset()) + return nullptr; + Node *Encoding = getDerived().parseEncoding(); + if (Encoding == nullptr) + return nullptr; + return make<SpecialName>("covariant return thunk to ", Encoding); + } + // extension ::= TC <first type> <number> _ <second type> + // # construction vtable for second-in-first + case 'C': { + First += 2; + Node *FirstType = getDerived().parseType(); + if (FirstType == nullptr) + return nullptr; + if (parseNumber(true).empty() || !consumeIf('_')) + return nullptr; + Node *SecondType = getDerived().parseType(); + if (SecondType == nullptr) + return nullptr; + return make<CtorVtableSpecialName>(SecondType, FirstType); + } + // TW <object name> # Thread-local wrapper + case 'W': { + First += 2; + Node *Name = getDerived().parseName(); + if (Name == nullptr) + return nullptr; + return make<SpecialName>("thread-local wrapper routine for ", Name); + } + // TH <object name> # Thread-local initialization + case 'H': { + First += 2; + Node *Name = getDerived().parseName(); + if (Name == nullptr) + return nullptr; + return make<SpecialName>("thread-local initialization routine for ", Name); + } + // T <call-offset> <base encoding> + default: { + ++First; + bool IsVirt = look() == 'v'; + if (parseCallOffset()) + return nullptr; + Node *BaseEncoding = getDerived().parseEncoding(); + if (BaseEncoding == nullptr) + return nullptr; + if (IsVirt) + return make<SpecialName>("virtual thunk to ", BaseEncoding); + else + return make<SpecialName>("non-virtual thunk to ", BaseEncoding); + } + } + case 'G': + switch (look(1)) { + // GV <object name> # Guard variable for one-time initialization + case 'V': { + First += 2; + Node *Name = getDerived().parseName(); + if (Name == nullptr) + return nullptr; + return make<SpecialName>("guard variable for ", Name); + } + // GR <object name> # reference temporary for object + // GR <object name> _ # First temporary + // GR <object name> <seq-id> _ # Subsequent temporaries + case 'R': { + First += 2; + Node *Name = getDerived().parseName(); + if (Name == nullptr) + return nullptr; + size_t Count; + bool ParsedSeqId = !parseSeqId(&Count); + if (!consumeIf('_') && ParsedSeqId) + return nullptr; + return make<SpecialName>("reference temporary for ", Name); + } + } + } + return nullptr; +} + +// <encoding> ::= <function name> <bare-function-type> +// ::= <data name> +// ::= <special-name> +template <typename Derived, typename Alloc> +Node *AbstractManglingParser<Derived, Alloc>::parseEncoding() { + // The template parameters of an encoding are unrelated to those of the + // enclosing context. + class SaveTemplateParams { + AbstractManglingParser *Parser; + decltype(TemplateParams) OldParams; decltype(OuterTemplateParams) OldOuterParams; - - public: - SaveTemplateParams(AbstractManglingParser *TheParser) : Parser(TheParser) { - OldParams = std::move(Parser->TemplateParams); + + public: + SaveTemplateParams(AbstractManglingParser *TheParser) : Parser(TheParser) { + OldParams = std::move(Parser->TemplateParams); OldOuterParams = std::move(Parser->OuterTemplateParams); - Parser->TemplateParams.clear(); + Parser->TemplateParams.clear(); Parser->OuterTemplateParams.clear(); - } - ~SaveTemplateParams() { - Parser->TemplateParams = std::move(OldParams); + } + ~SaveTemplateParams() { + Parser->TemplateParams = std::move(OldParams); Parser->OuterTemplateParams = std::move(OldOuterParams); - } - } SaveTemplateParams(this); - - if (look() == 'G' || look() == 'T') - return getDerived().parseSpecialName(); - - auto IsEndOfEncoding = [&] { - // The set of chars that can potentially follow an <encoding> (none of which - // can start a <type>). Enumerating these allows us to avoid speculative - // parsing. - return numLeft() == 0 || look() == 'E' || look() == '.' || look() == '_'; - }; - - NameState NameInfo(this); - Node *Name = getDerived().parseName(&NameInfo); - if (Name == nullptr) - return nullptr; - - if (resolveForwardTemplateRefs(NameInfo)) - return nullptr; - - if (IsEndOfEncoding()) - return Name; - - Node *Attrs = nullptr; - if (consumeIf("Ua9enable_ifI")) { - size_t BeforeArgs = Names.size(); - while (!consumeIf('E')) { - Node *Arg = getDerived().parseTemplateArg(); - if (Arg == nullptr) - return nullptr; - Names.push_back(Arg); - } - Attrs = make<EnableIfAttr>(popTrailingNodeArray(BeforeArgs)); - if (!Attrs) - return nullptr; - } - - Node *ReturnType = nullptr; - if (!NameInfo.CtorDtorConversion && NameInfo.EndsWithTemplateArgs) { - ReturnType = getDerived().parseType(); - if (ReturnType == nullptr) - return nullptr; - } - - if (consumeIf('v')) - return make<FunctionEncoding>(ReturnType, Name, NodeArray(), - Attrs, NameInfo.CVQualifiers, - NameInfo.ReferenceQualifier); - - size_t ParamsBegin = Names.size(); - do { - Node *Ty = getDerived().parseType(); - if (Ty == nullptr) - return nullptr; - Names.push_back(Ty); - } while (!IsEndOfEncoding()); - - return make<FunctionEncoding>(ReturnType, Name, - popTrailingNodeArray(ParamsBegin), - Attrs, NameInfo.CVQualifiers, - NameInfo.ReferenceQualifier); -} - -template <class Float> -struct FloatData; - -template <> -struct FloatData<float> -{ - static const size_t mangled_size = 8; - static const size_t max_demangled_size = 24; - static constexpr const char* spec = "%af"; -}; - -template <> -struct FloatData<double> -{ - static const size_t mangled_size = 16; - static const size_t max_demangled_size = 32; - static constexpr const char* spec = "%a"; -}; - -template <> -struct FloatData<long double> -{ -#if defined(__mips__) && defined(__mips_n64) || defined(__aarch64__) || \ - defined(__wasm__) - static const size_t mangled_size = 32; -#elif defined(__arm__) || defined(__mips__) || defined(__hexagon__) - static const size_t mangled_size = 16; -#else - static const size_t mangled_size = 20; // May need to be adjusted to 16 or 24 on other platforms -#endif - // `-0x1.ffffffffffffffffffffffffffffp+16383` + 'L' + '\0' == 42 bytes. - // 28 'f's * 4 bits == 112 bits, which is the number of mantissa bits. - // Negatives are one character longer than positives. - // `0x1.` and `p` are constant, and exponents `+16383` and `-16382` are the - // same length. 1 sign bit, 112 mantissa bits, and 15 exponent bits == 128. - static const size_t max_demangled_size = 42; - static constexpr const char *spec = "%LaL"; -}; - -template <typename Alloc, typename Derived> -template <class Float> -Node *AbstractManglingParser<Alloc, Derived>::parseFloatingLiteral() { - const size_t N = FloatData<Float>::mangled_size; - if (numLeft() <= N) - return nullptr; - StringView Data(First, First + N); - for (char C : Data) - if (!std::isxdigit(C)) - return nullptr; - First += N; - if (!consumeIf('E')) - return nullptr; - return make<FloatLiteralImpl<Float>>(Data); -} - -// <seq-id> ::= <0-9A-Z>+ -template <typename Alloc, typename Derived> -bool AbstractManglingParser<Alloc, Derived>::parseSeqId(size_t *Out) { - if (!(look() >= '0' && look() <= '9') && - !(look() >= 'A' && look() <= 'Z')) - return true; - - size_t Id = 0; - while (true) { - if (look() >= '0' && look() <= '9') { - Id *= 36; - Id += static_cast<size_t>(look() - '0'); - } else if (look() >= 'A' && look() <= 'Z') { - Id *= 36; - Id += static_cast<size_t>(look() - 'A') + 10; - } else { - *Out = Id; - return false; - } - ++First; - } -} - -// <substitution> ::= S <seq-id> _ -// ::= S_ -// <substitution> ::= Sa # ::std::allocator -// <substitution> ::= Sb # ::std::basic_string -// <substitution> ::= Ss # ::std::basic_string < char, -// ::std::char_traits<char>, -// ::std::allocator<char> > -// <substitution> ::= Si # ::std::basic_istream<char, std::char_traits<char> > -// <substitution> ::= So # ::std::basic_ostream<char, std::char_traits<char> > -// <substitution> ::= Sd # ::std::basic_iostream<char, std::char_traits<char> > -template <typename Derived, typename Alloc> -Node *AbstractManglingParser<Derived, Alloc>::parseSubstitution() { - if (!consumeIf('S')) - return nullptr; - - if (std::islower(look())) { - Node *SpecialSub; - switch (look()) { - case 'a': - ++First; - SpecialSub = make<SpecialSubstitution>(SpecialSubKind::allocator); - break; - case 'b': - ++First; - SpecialSub = make<SpecialSubstitution>(SpecialSubKind::basic_string); - break; - case 's': - ++First; - SpecialSub = make<SpecialSubstitution>(SpecialSubKind::string); - break; - case 'i': - ++First; - SpecialSub = make<SpecialSubstitution>(SpecialSubKind::istream); - break; - case 'o': - ++First; - SpecialSub = make<SpecialSubstitution>(SpecialSubKind::ostream); - break; - case 'd': - ++First; - SpecialSub = make<SpecialSubstitution>(SpecialSubKind::iostream); - break; - default: - return nullptr; - } - if (!SpecialSub) - return nullptr; - // Itanium C++ ABI 5.1.2: If a name that would use a built-in <substitution> - // has ABI tags, the tags are appended to the substitution; the result is a - // substitutable component. - Node *WithTags = getDerived().parseAbiTags(SpecialSub); - if (WithTags != SpecialSub) { - Subs.push_back(WithTags); - SpecialSub = WithTags; - } - return SpecialSub; - } - - // ::= S_ - if (consumeIf('_')) { - if (Subs.empty()) - return nullptr; - return Subs[0]; - } - - // ::= S <seq-id> _ - size_t Index = 0; - if (parseSeqId(&Index)) - return nullptr; - ++Index; - if (!consumeIf('_') || Index >= Subs.size()) - return nullptr; - return Subs[Index]; -} - -// <template-param> ::= T_ # first template parameter -// ::= T <parameter-2 non-negative number> _ -// ::= TL <level-1> __ -// ::= TL <level-1> _ <parameter-2 non-negative number> _ -template <typename Derived, typename Alloc> -Node *AbstractManglingParser<Derived, Alloc>::parseTemplateParam() { - if (!consumeIf('T')) - return nullptr; - - size_t Level = 0; - if (consumeIf('L')) { - if (parsePositiveInteger(&Level)) - return nullptr; - ++Level; - if (!consumeIf('_')) - return nullptr; - } - - size_t Index = 0; - if (!consumeIf('_')) { - if (parsePositiveInteger(&Index)) - return nullptr; - ++Index; - if (!consumeIf('_')) - return nullptr; - } - - // If we're in a context where this <template-param> refers to a - // <template-arg> further ahead in the mangled name (currently just conversion - // operator types), then we should only look it up in the right context. - // This can only happen at the outermost level. - if (PermitForwardTemplateReferences && Level == 0) { - Node *ForwardRef = make<ForwardTemplateReference>(Index); - if (!ForwardRef) - return nullptr; - assert(ForwardRef->getKind() == Node::KForwardTemplateReference); - ForwardTemplateRefs.push_back( - static_cast<ForwardTemplateReference *>(ForwardRef)); - return ForwardRef; - } - - if (Level >= TemplateParams.size() || !TemplateParams[Level] || - Index >= TemplateParams[Level]->size()) { - // Itanium ABI 5.1.8: In a generic lambda, uses of auto in the parameter - // list are mangled as the corresponding artificial template type parameter. - if (ParsingLambdaParamsAtLevel == Level && Level <= TemplateParams.size()) { - // This will be popped by the ScopedTemplateParamList in - // parseUnnamedTypeName. - if (Level == TemplateParams.size()) - TemplateParams.push_back(nullptr); - return make<NameType>("auto"); - } - - return nullptr; - } - - return (*TemplateParams[Level])[Index]; -} - -// <template-param-decl> ::= Ty # type parameter -// ::= Tn <type> # non-type parameter -// ::= Tt <template-param-decl>* E # template parameter -// ::= Tp <template-param-decl> # parameter pack -template <typename Derived, typename Alloc> -Node *AbstractManglingParser<Derived, Alloc>::parseTemplateParamDecl() { - auto InventTemplateParamName = [&](TemplateParamKind Kind) { - unsigned Index = NumSyntheticTemplateParameters[(int)Kind]++; - Node *N = make<SyntheticTemplateParamName>(Kind, Index); - if (N) TemplateParams.back()->push_back(N); - return N; - }; - - if (consumeIf("Ty")) { - Node *Name = InventTemplateParamName(TemplateParamKind::Type); - if (!Name) - return nullptr; - return make<TypeTemplateParamDecl>(Name); - } - - if (consumeIf("Tn")) { - Node *Name = InventTemplateParamName(TemplateParamKind::NonType); - if (!Name) - return nullptr; - Node *Type = parseType(); - if (!Type) - return nullptr; - return make<NonTypeTemplateParamDecl>(Name, Type); - } - - if (consumeIf("Tt")) { - Node *Name = InventTemplateParamName(TemplateParamKind::Template); - if (!Name) - return nullptr; - size_t ParamsBegin = Names.size(); - ScopedTemplateParamList TemplateTemplateParamParams(this); - while (!consumeIf("E")) { - Node *P = parseTemplateParamDecl(); - if (!P) - return nullptr; - Names.push_back(P); - } - NodeArray Params = popTrailingNodeArray(ParamsBegin); - return make<TemplateTemplateParamDecl>(Name, Params); - } - - if (consumeIf("Tp")) { - Node *P = parseTemplateParamDecl(); - if (!P) - return nullptr; - return make<TemplateParamPackDecl>(P); - } - - return nullptr; -} - -// <template-arg> ::= <type> # type or template -// ::= X <expression> E # expression -// ::= <expr-primary> # simple expressions -// ::= J <template-arg>* E # argument pack -// ::= LZ <encoding> E # extension -template <typename Derived, typename Alloc> -Node *AbstractManglingParser<Derived, Alloc>::parseTemplateArg() { - switch (look()) { - case 'X': { - ++First; - Node *Arg = getDerived().parseExpr(); - if (Arg == nullptr || !consumeIf('E')) - return nullptr; - return Arg; - } - case 'J': { - ++First; - size_t ArgsBegin = Names.size(); - while (!consumeIf('E')) { - Node *Arg = getDerived().parseTemplateArg(); - if (Arg == nullptr) - return nullptr; - Names.push_back(Arg); - } - NodeArray Args = popTrailingNodeArray(ArgsBegin); - return make<TemplateArgumentPack>(Args); - } - case 'L': { - // ::= LZ <encoding> E # extension - if (look(1) == 'Z') { - First += 2; - Node *Arg = getDerived().parseEncoding(); - if (Arg == nullptr || !consumeIf('E')) - return nullptr; - return Arg; - } - // ::= <expr-primary> # simple expressions - return getDerived().parseExprPrimary(); - } - default: - return getDerived().parseType(); - } -} - -// <template-args> ::= I <template-arg>* E -// extension, the abi says <template-arg>+ -template <typename Derived, typename Alloc> -Node * -AbstractManglingParser<Derived, Alloc>::parseTemplateArgs(bool TagTemplates) { - if (!consumeIf('I')) - return nullptr; - - // <template-params> refer to the innermost <template-args>. Clear out any - // outer args that we may have inserted into TemplateParams. - if (TagTemplates) { - TemplateParams.clear(); - TemplateParams.push_back(&OuterTemplateParams); - OuterTemplateParams.clear(); - } - - size_t ArgsBegin = Names.size(); - while (!consumeIf('E')) { - if (TagTemplates) { - auto OldParams = std::move(TemplateParams); - Node *Arg = getDerived().parseTemplateArg(); - TemplateParams = std::move(OldParams); - if (Arg == nullptr) - return nullptr; - Names.push_back(Arg); - Node *TableEntry = Arg; - if (Arg->getKind() == Node::KTemplateArgumentPack) { - TableEntry = make<ParameterPack>( - static_cast<TemplateArgumentPack*>(TableEntry)->getElements()); - if (!TableEntry) - return nullptr; - } - TemplateParams.back()->push_back(TableEntry); - } else { - Node *Arg = getDerived().parseTemplateArg(); - if (Arg == nullptr) - return nullptr; - Names.push_back(Arg); - } - } - return make<TemplateArgs>(popTrailingNodeArray(ArgsBegin)); -} - -// <mangled-name> ::= _Z <encoding> -// ::= <type> -// extension ::= ___Z <encoding> _block_invoke -// extension ::= ___Z <encoding> _block_invoke<decimal-digit>+ -// extension ::= ___Z <encoding> _block_invoke_<decimal-digit>+ -template <typename Derived, typename Alloc> -Node *AbstractManglingParser<Derived, Alloc>::parse() { - if (consumeIf("_Z") || consumeIf("__Z")) { - Node *Encoding = getDerived().parseEncoding(); - if (Encoding == nullptr) - return nullptr; - if (look() == '.') { - Encoding = make<DotSuffix>(Encoding, StringView(First, Last)); - First = Last; - } - if (numLeft() != 0) - return nullptr; - return Encoding; - } - - if (consumeIf("___Z") || consumeIf("____Z")) { - Node *Encoding = getDerived().parseEncoding(); - if (Encoding == nullptr || !consumeIf("_block_invoke")) - return nullptr; - bool RequireNumber = consumeIf('_'); - if (parseNumber().empty() && RequireNumber) - return nullptr; - if (look() == '.') - First = Last; - if (numLeft() != 0) - return nullptr; - return make<SpecialName>("invocation function for block in ", Encoding); - } - - Node *Ty = getDerived().parseType(); - if (numLeft() != 0) - return nullptr; - return Ty; -} - -template <typename Alloc> -struct ManglingParser : AbstractManglingParser<ManglingParser<Alloc>, Alloc> { - using AbstractManglingParser<ManglingParser<Alloc>, - Alloc>::AbstractManglingParser; -}; - -DEMANGLE_NAMESPACE_END - -#endif // DEMANGLE_ITANIUMDEMANGLE_H + } + } SaveTemplateParams(this); + + if (look() == 'G' || look() == 'T') + return getDerived().parseSpecialName(); + + auto IsEndOfEncoding = [&] { + // The set of chars that can potentially follow an <encoding> (none of which + // can start a <type>). Enumerating these allows us to avoid speculative + // parsing. + return numLeft() == 0 || look() == 'E' || look() == '.' || look() == '_'; + }; + + NameState NameInfo(this); + Node *Name = getDerived().parseName(&NameInfo); + if (Name == nullptr) + return nullptr; + + if (resolveForwardTemplateRefs(NameInfo)) + return nullptr; + + if (IsEndOfEncoding()) + return Name; + + Node *Attrs = nullptr; + if (consumeIf("Ua9enable_ifI")) { + size_t BeforeArgs = Names.size(); + while (!consumeIf('E')) { + Node *Arg = getDerived().parseTemplateArg(); + if (Arg == nullptr) + return nullptr; + Names.push_back(Arg); + } + Attrs = make<EnableIfAttr>(popTrailingNodeArray(BeforeArgs)); + if (!Attrs) + return nullptr; + } + + Node *ReturnType = nullptr; + if (!NameInfo.CtorDtorConversion && NameInfo.EndsWithTemplateArgs) { + ReturnType = getDerived().parseType(); + if (ReturnType == nullptr) + return nullptr; + } + + if (consumeIf('v')) + return make<FunctionEncoding>(ReturnType, Name, NodeArray(), + Attrs, NameInfo.CVQualifiers, + NameInfo.ReferenceQualifier); + + size_t ParamsBegin = Names.size(); + do { + Node *Ty = getDerived().parseType(); + if (Ty == nullptr) + return nullptr; + Names.push_back(Ty); + } while (!IsEndOfEncoding()); + + return make<FunctionEncoding>(ReturnType, Name, + popTrailingNodeArray(ParamsBegin), + Attrs, NameInfo.CVQualifiers, + NameInfo.ReferenceQualifier); +} + +template <class Float> +struct FloatData; + +template <> +struct FloatData<float> +{ + static const size_t mangled_size = 8; + static const size_t max_demangled_size = 24; + static constexpr const char* spec = "%af"; +}; + +template <> +struct FloatData<double> +{ + static const size_t mangled_size = 16; + static const size_t max_demangled_size = 32; + static constexpr const char* spec = "%a"; +}; + +template <> +struct FloatData<long double> +{ +#if defined(__mips__) && defined(__mips_n64) || defined(__aarch64__) || \ + defined(__wasm__) + static const size_t mangled_size = 32; +#elif defined(__arm__) || defined(__mips__) || defined(__hexagon__) + static const size_t mangled_size = 16; +#else + static const size_t mangled_size = 20; // May need to be adjusted to 16 or 24 on other platforms +#endif + // `-0x1.ffffffffffffffffffffffffffffp+16383` + 'L' + '\0' == 42 bytes. + // 28 'f's * 4 bits == 112 bits, which is the number of mantissa bits. + // Negatives are one character longer than positives. + // `0x1.` and `p` are constant, and exponents `+16383` and `-16382` are the + // same length. 1 sign bit, 112 mantissa bits, and 15 exponent bits == 128. + static const size_t max_demangled_size = 42; + static constexpr const char *spec = "%LaL"; +}; + +template <typename Alloc, typename Derived> +template <class Float> +Node *AbstractManglingParser<Alloc, Derived>::parseFloatingLiteral() { + const size_t N = FloatData<Float>::mangled_size; + if (numLeft() <= N) + return nullptr; + StringView Data(First, First + N); + for (char C : Data) + if (!std::isxdigit(C)) + return nullptr; + First += N; + if (!consumeIf('E')) + return nullptr; + return make<FloatLiteralImpl<Float>>(Data); +} + +// <seq-id> ::= <0-9A-Z>+ +template <typename Alloc, typename Derived> +bool AbstractManglingParser<Alloc, Derived>::parseSeqId(size_t *Out) { + if (!(look() >= '0' && look() <= '9') && + !(look() >= 'A' && look() <= 'Z')) + return true; + + size_t Id = 0; + while (true) { + if (look() >= '0' && look() <= '9') { + Id *= 36; + Id += static_cast<size_t>(look() - '0'); + } else if (look() >= 'A' && look() <= 'Z') { + Id *= 36; + Id += static_cast<size_t>(look() - 'A') + 10; + } else { + *Out = Id; + return false; + } + ++First; + } +} + +// <substitution> ::= S <seq-id> _ +// ::= S_ +// <substitution> ::= Sa # ::std::allocator +// <substitution> ::= Sb # ::std::basic_string +// <substitution> ::= Ss # ::std::basic_string < char, +// ::std::char_traits<char>, +// ::std::allocator<char> > +// <substitution> ::= Si # ::std::basic_istream<char, std::char_traits<char> > +// <substitution> ::= So # ::std::basic_ostream<char, std::char_traits<char> > +// <substitution> ::= Sd # ::std::basic_iostream<char, std::char_traits<char> > +template <typename Derived, typename Alloc> +Node *AbstractManglingParser<Derived, Alloc>::parseSubstitution() { + if (!consumeIf('S')) + return nullptr; + + if (std::islower(look())) { + Node *SpecialSub; + switch (look()) { + case 'a': + ++First; + SpecialSub = make<SpecialSubstitution>(SpecialSubKind::allocator); + break; + case 'b': + ++First; + SpecialSub = make<SpecialSubstitution>(SpecialSubKind::basic_string); + break; + case 's': + ++First; + SpecialSub = make<SpecialSubstitution>(SpecialSubKind::string); + break; + case 'i': + ++First; + SpecialSub = make<SpecialSubstitution>(SpecialSubKind::istream); + break; + case 'o': + ++First; + SpecialSub = make<SpecialSubstitution>(SpecialSubKind::ostream); + break; + case 'd': + ++First; + SpecialSub = make<SpecialSubstitution>(SpecialSubKind::iostream); + break; + default: + return nullptr; + } + if (!SpecialSub) + return nullptr; + // Itanium C++ ABI 5.1.2: If a name that would use a built-in <substitution> + // has ABI tags, the tags are appended to the substitution; the result is a + // substitutable component. + Node *WithTags = getDerived().parseAbiTags(SpecialSub); + if (WithTags != SpecialSub) { + Subs.push_back(WithTags); + SpecialSub = WithTags; + } + return SpecialSub; + } + + // ::= S_ + if (consumeIf('_')) { + if (Subs.empty()) + return nullptr; + return Subs[0]; + } + + // ::= S <seq-id> _ + size_t Index = 0; + if (parseSeqId(&Index)) + return nullptr; + ++Index; + if (!consumeIf('_') || Index >= Subs.size()) + return nullptr; + return Subs[Index]; +} + +// <template-param> ::= T_ # first template parameter +// ::= T <parameter-2 non-negative number> _ +// ::= TL <level-1> __ +// ::= TL <level-1> _ <parameter-2 non-negative number> _ +template <typename Derived, typename Alloc> +Node *AbstractManglingParser<Derived, Alloc>::parseTemplateParam() { + if (!consumeIf('T')) + return nullptr; + + size_t Level = 0; + if (consumeIf('L')) { + if (parsePositiveInteger(&Level)) + return nullptr; + ++Level; + if (!consumeIf('_')) + return nullptr; + } + + size_t Index = 0; + if (!consumeIf('_')) { + if (parsePositiveInteger(&Index)) + return nullptr; + ++Index; + if (!consumeIf('_')) + return nullptr; + } + + // If we're in a context where this <template-param> refers to a + // <template-arg> further ahead in the mangled name (currently just conversion + // operator types), then we should only look it up in the right context. + // This can only happen at the outermost level. + if (PermitForwardTemplateReferences && Level == 0) { + Node *ForwardRef = make<ForwardTemplateReference>(Index); + if (!ForwardRef) + return nullptr; + assert(ForwardRef->getKind() == Node::KForwardTemplateReference); + ForwardTemplateRefs.push_back( + static_cast<ForwardTemplateReference *>(ForwardRef)); + return ForwardRef; + } + + if (Level >= TemplateParams.size() || !TemplateParams[Level] || + Index >= TemplateParams[Level]->size()) { + // Itanium ABI 5.1.8: In a generic lambda, uses of auto in the parameter + // list are mangled as the corresponding artificial template type parameter. + if (ParsingLambdaParamsAtLevel == Level && Level <= TemplateParams.size()) { + // This will be popped by the ScopedTemplateParamList in + // parseUnnamedTypeName. + if (Level == TemplateParams.size()) + TemplateParams.push_back(nullptr); + return make<NameType>("auto"); + } + + return nullptr; + } + + return (*TemplateParams[Level])[Index]; +} + +// <template-param-decl> ::= Ty # type parameter +// ::= Tn <type> # non-type parameter +// ::= Tt <template-param-decl>* E # template parameter +// ::= Tp <template-param-decl> # parameter pack +template <typename Derived, typename Alloc> +Node *AbstractManglingParser<Derived, Alloc>::parseTemplateParamDecl() { + auto InventTemplateParamName = [&](TemplateParamKind Kind) { + unsigned Index = NumSyntheticTemplateParameters[(int)Kind]++; + Node *N = make<SyntheticTemplateParamName>(Kind, Index); + if (N) TemplateParams.back()->push_back(N); + return N; + }; + + if (consumeIf("Ty")) { + Node *Name = InventTemplateParamName(TemplateParamKind::Type); + if (!Name) + return nullptr; + return make<TypeTemplateParamDecl>(Name); + } + + if (consumeIf("Tn")) { + Node *Name = InventTemplateParamName(TemplateParamKind::NonType); + if (!Name) + return nullptr; + Node *Type = parseType(); + if (!Type) + return nullptr; + return make<NonTypeTemplateParamDecl>(Name, Type); + } + + if (consumeIf("Tt")) { + Node *Name = InventTemplateParamName(TemplateParamKind::Template); + if (!Name) + return nullptr; + size_t ParamsBegin = Names.size(); + ScopedTemplateParamList TemplateTemplateParamParams(this); + while (!consumeIf("E")) { + Node *P = parseTemplateParamDecl(); + if (!P) + return nullptr; + Names.push_back(P); + } + NodeArray Params = popTrailingNodeArray(ParamsBegin); + return make<TemplateTemplateParamDecl>(Name, Params); + } + + if (consumeIf("Tp")) { + Node *P = parseTemplateParamDecl(); + if (!P) + return nullptr; + return make<TemplateParamPackDecl>(P); + } + + return nullptr; +} + +// <template-arg> ::= <type> # type or template +// ::= X <expression> E # expression +// ::= <expr-primary> # simple expressions +// ::= J <template-arg>* E # argument pack +// ::= LZ <encoding> E # extension +template <typename Derived, typename Alloc> +Node *AbstractManglingParser<Derived, Alloc>::parseTemplateArg() { + switch (look()) { + case 'X': { + ++First; + Node *Arg = getDerived().parseExpr(); + if (Arg == nullptr || !consumeIf('E')) + return nullptr; + return Arg; + } + case 'J': { + ++First; + size_t ArgsBegin = Names.size(); + while (!consumeIf('E')) { + Node *Arg = getDerived().parseTemplateArg(); + if (Arg == nullptr) + return nullptr; + Names.push_back(Arg); + } + NodeArray Args = popTrailingNodeArray(ArgsBegin); + return make<TemplateArgumentPack>(Args); + } + case 'L': { + // ::= LZ <encoding> E # extension + if (look(1) == 'Z') { + First += 2; + Node *Arg = getDerived().parseEncoding(); + if (Arg == nullptr || !consumeIf('E')) + return nullptr; + return Arg; + } + // ::= <expr-primary> # simple expressions + return getDerived().parseExprPrimary(); + } + default: + return getDerived().parseType(); + } +} + +// <template-args> ::= I <template-arg>* E +// extension, the abi says <template-arg>+ +template <typename Derived, typename Alloc> +Node * +AbstractManglingParser<Derived, Alloc>::parseTemplateArgs(bool TagTemplates) { + if (!consumeIf('I')) + return nullptr; + + // <template-params> refer to the innermost <template-args>. Clear out any + // outer args that we may have inserted into TemplateParams. + if (TagTemplates) { + TemplateParams.clear(); + TemplateParams.push_back(&OuterTemplateParams); + OuterTemplateParams.clear(); + } + + size_t ArgsBegin = Names.size(); + while (!consumeIf('E')) { + if (TagTemplates) { + auto OldParams = std::move(TemplateParams); + Node *Arg = getDerived().parseTemplateArg(); + TemplateParams = std::move(OldParams); + if (Arg == nullptr) + return nullptr; + Names.push_back(Arg); + Node *TableEntry = Arg; + if (Arg->getKind() == Node::KTemplateArgumentPack) { + TableEntry = make<ParameterPack>( + static_cast<TemplateArgumentPack*>(TableEntry)->getElements()); + if (!TableEntry) + return nullptr; + } + TemplateParams.back()->push_back(TableEntry); + } else { + Node *Arg = getDerived().parseTemplateArg(); + if (Arg == nullptr) + return nullptr; + Names.push_back(Arg); + } + } + return make<TemplateArgs>(popTrailingNodeArray(ArgsBegin)); +} + +// <mangled-name> ::= _Z <encoding> +// ::= <type> +// extension ::= ___Z <encoding> _block_invoke +// extension ::= ___Z <encoding> _block_invoke<decimal-digit>+ +// extension ::= ___Z <encoding> _block_invoke_<decimal-digit>+ +template <typename Derived, typename Alloc> +Node *AbstractManglingParser<Derived, Alloc>::parse() { + if (consumeIf("_Z") || consumeIf("__Z")) { + Node *Encoding = getDerived().parseEncoding(); + if (Encoding == nullptr) + return nullptr; + if (look() == '.') { + Encoding = make<DotSuffix>(Encoding, StringView(First, Last)); + First = Last; + } + if (numLeft() != 0) + return nullptr; + return Encoding; + } + + if (consumeIf("___Z") || consumeIf("____Z")) { + Node *Encoding = getDerived().parseEncoding(); + if (Encoding == nullptr || !consumeIf("_block_invoke")) + return nullptr; + bool RequireNumber = consumeIf('_'); + if (parseNumber().empty() && RequireNumber) + return nullptr; + if (look() == '.') + First = Last; + if (numLeft() != 0) + return nullptr; + return make<SpecialName>("invocation function for block in ", Encoding); + } + + Node *Ty = getDerived().parseType(); + if (numLeft() != 0) + return nullptr; + return Ty; +} + +template <typename Alloc> +struct ManglingParser : AbstractManglingParser<ManglingParser<Alloc>, Alloc> { + using AbstractManglingParser<ManglingParser<Alloc>, + Alloc>::AbstractManglingParser; +}; + +DEMANGLE_NAMESPACE_END + +#endif // DEMANGLE_ITANIUMDEMANGLE_H diff --git a/contrib/libs/cxxsupp/libcxxabi/src/demangle/README.txt b/contrib/libs/cxxsupp/libcxxabi/src/demangle/README.txt index 514ff6dd16..d51e406425 100644 --- a/contrib/libs/cxxsupp/libcxxabi/src/demangle/README.txt +++ b/contrib/libs/cxxsupp/libcxxabi/src/demangle/README.txt @@ -1,52 +1,52 @@ -Itanium Name Demangler Library -============================== - -Introduction ------------- - -This directory contains the generic itanium name demangler library. The main -purpose of the library is to demangle C++ symbols, i.e. convert the string -"_Z1fv" into "f()". You can also use the CRTP base ManglingParser to perform -some simple analysis on the mangled name, or (in LLVM) use the opaque -ItaniumPartialDemangler to query the demangled AST. - -Why are there multiple copies of the this library in the source tree? ---------------------------------------------------------------------- - -This directory is mirrored between libcxxabi/demangle and -llvm/include/llvm/Demangle. The simple reason for this is that both projects -need to demangle symbols, but neither can depend on each other. libcxxabi needs -the demangler to implement __cxa_demangle, which is part of the itanium ABI -spec. LLVM needs a copy for a bunch of places, but doesn't want to use the -system's __cxa_demangle because it a) might not be available (i.e., on Windows), -and b) probably isn't that up-to-date on the latest language features. - -The copy of the demangler in LLVM has some extra stuff that aren't needed in -libcxxabi (ie, the MSVC demangler, ItaniumPartialDemangler), which depend on the -shared generic components. Despite these differences, we want to keep the "core" -generic demangling library identical between both copies to simplify development -and testing. - -If you're working on the generic library, then do the work first in libcxxabi, -then run the cp-to-llvm.sh script in src/demangle. This script takes as an -argument the path to llvm, and re-copies the changes you made to libcxxabi over. -Note that this script just blindly overwrites all changes to the generic library -in llvm, so be careful. - -Because the core demangler needs to work in libcxxabi, everything needs to be -declared in an anonymous namespace (see DEMANGLE_NAMESPACE_BEGIN), and you can't -introduce any code that depends on the libcxx dylib. - -Hopefully, when LLVM becomes a monorepo, we can de-duplicate this code, and have -both LLVM and libcxxabi depend on a shared demangler library. - -Testing -------- - -The tests are split up between libcxxabi/test/{unit,}test_demangle.cpp, and -llvm/unittest/Demangle. The llvm directory should only get tests for stuff not -included in the core library. In the future though, we should probably move all -the tests to LLVM. - -It is also a really good idea to run libFuzzer after non-trivial changes, see -libcxxabi/fuzz/cxa_demangle_fuzzer.cpp and https://llvm.org/docs/LibFuzzer.html. +Itanium Name Demangler Library +============================== + +Introduction +------------ + +This directory contains the generic itanium name demangler library. The main +purpose of the library is to demangle C++ symbols, i.e. convert the string +"_Z1fv" into "f()". You can also use the CRTP base ManglingParser to perform +some simple analysis on the mangled name, or (in LLVM) use the opaque +ItaniumPartialDemangler to query the demangled AST. + +Why are there multiple copies of the this library in the source tree? +--------------------------------------------------------------------- + +This directory is mirrored between libcxxabi/demangle and +llvm/include/llvm/Demangle. The simple reason for this is that both projects +need to demangle symbols, but neither can depend on each other. libcxxabi needs +the demangler to implement __cxa_demangle, which is part of the itanium ABI +spec. LLVM needs a copy for a bunch of places, but doesn't want to use the +system's __cxa_demangle because it a) might not be available (i.e., on Windows), +and b) probably isn't that up-to-date on the latest language features. + +The copy of the demangler in LLVM has some extra stuff that aren't needed in +libcxxabi (ie, the MSVC demangler, ItaniumPartialDemangler), which depend on the +shared generic components. Despite these differences, we want to keep the "core" +generic demangling library identical between both copies to simplify development +and testing. + +If you're working on the generic library, then do the work first in libcxxabi, +then run the cp-to-llvm.sh script in src/demangle. This script takes as an +argument the path to llvm, and re-copies the changes you made to libcxxabi over. +Note that this script just blindly overwrites all changes to the generic library +in llvm, so be careful. + +Because the core demangler needs to work in libcxxabi, everything needs to be +declared in an anonymous namespace (see DEMANGLE_NAMESPACE_BEGIN), and you can't +introduce any code that depends on the libcxx dylib. + +Hopefully, when LLVM becomes a monorepo, we can de-duplicate this code, and have +both LLVM and libcxxabi depend on a shared demangler library. + +Testing +------- + +The tests are split up between libcxxabi/test/{unit,}test_demangle.cpp, and +llvm/unittest/Demangle. The llvm directory should only get tests for stuff not +included in the core library. In the future though, we should probably move all +the tests to LLVM. + +It is also a really good idea to run libFuzzer after non-trivial changes, see +libcxxabi/fuzz/cxa_demangle_fuzzer.cpp and https://llvm.org/docs/LibFuzzer.html. diff --git a/contrib/libs/cxxsupp/libcxxabi/src/demangle/StringView.h b/contrib/libs/cxxsupp/libcxxabi/src/demangle/StringView.h index 1e4d3803f0..2432892d59 100644 --- a/contrib/libs/cxxsupp/libcxxabi/src/demangle/StringView.h +++ b/contrib/libs/cxxsupp/libcxxabi/src/demangle/StringView.h @@ -1,119 +1,119 @@ -//===--- StringView.h -------------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// -// -// FIXME: Use std::string_view instead when we support C++17. -// -//===----------------------------------------------------------------------===// - -#ifndef DEMANGLE_STRINGVIEW_H -#define DEMANGLE_STRINGVIEW_H - -#include "DemangleConfig.h" -#include <algorithm> -#include <cassert> -#include <cstring> - -DEMANGLE_NAMESPACE_BEGIN - -class StringView { - const char *First; - const char *Last; - -public: - static const size_t npos = ~size_t(0); - - template <size_t N> - StringView(const char (&Str)[N]) : First(Str), Last(Str + N - 1) {} - StringView(const char *First_, const char *Last_) - : First(First_), Last(Last_) {} - StringView(const char *First_, size_t Len) - : First(First_), Last(First_ + Len) {} - StringView(const char *Str) : First(Str), Last(Str + std::strlen(Str)) {} - StringView() : First(nullptr), Last(nullptr) {} - +//===--- StringView.h -------------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// FIXME: Use std::string_view instead when we support C++17. +// +//===----------------------------------------------------------------------===// + +#ifndef DEMANGLE_STRINGVIEW_H +#define DEMANGLE_STRINGVIEW_H + +#include "DemangleConfig.h" +#include <algorithm> +#include <cassert> +#include <cstring> + +DEMANGLE_NAMESPACE_BEGIN + +class StringView { + const char *First; + const char *Last; + +public: + static const size_t npos = ~size_t(0); + + template <size_t N> + StringView(const char (&Str)[N]) : First(Str), Last(Str + N - 1) {} + StringView(const char *First_, const char *Last_) + : First(First_), Last(Last_) {} + StringView(const char *First_, size_t Len) + : First(First_), Last(First_ + Len) {} + StringView(const char *Str) : First(Str), Last(Str + std::strlen(Str)) {} + StringView() : First(nullptr), Last(nullptr) {} + StringView substr(size_t Pos, size_t Len = npos) const { assert(Pos <= size()); return StringView(begin() + Pos, std::min(Len, size() - Pos)); - } - - size_t find(char C, size_t From = 0) const { - size_t FindBegin = std::min(From, size()); - // Avoid calling memchr with nullptr. - if (FindBegin < size()) { - // Just forward to memchr, which is faster than a hand-rolled loop. - if (const void *P = ::memchr(First + FindBegin, C, size() - FindBegin)) - return size_t(static_cast<const char *>(P) - First); - } - return npos; - } - - StringView dropFront(size_t N = 1) const { - if (N >= size()) - N = size(); - return StringView(First + N, Last); - } - - StringView dropBack(size_t N = 1) const { - if (N >= size()) - N = size(); - return StringView(First, Last - N); - } - - char front() const { - assert(!empty()); - return *begin(); - } - - char back() const { - assert(!empty()); - return *(end() - 1); - } - - char popFront() { - assert(!empty()); - return *First++; - } - - bool consumeFront(char C) { - if (!startsWith(C)) - return false; - *this = dropFront(1); - return true; - } - - bool consumeFront(StringView S) { - if (!startsWith(S)) - return false; - *this = dropFront(S.size()); - return true; - } - - bool startsWith(char C) const { return !empty() && *begin() == C; } - - bool startsWith(StringView Str) const { - if (Str.size() > size()) - return false; - return std::equal(Str.begin(), Str.end(), begin()); - } - - const char &operator[](size_t Idx) const { return *(begin() + Idx); } - - const char *begin() const { return First; } - const char *end() const { return Last; } - size_t size() const { return static_cast<size_t>(Last - First); } - bool empty() const { return First == Last; } -}; - -inline bool operator==(const StringView &LHS, const StringView &RHS) { - return LHS.size() == RHS.size() && - std::equal(LHS.begin(), LHS.end(), RHS.begin()); -} - -DEMANGLE_NAMESPACE_END - -#endif + } + + size_t find(char C, size_t From = 0) const { + size_t FindBegin = std::min(From, size()); + // Avoid calling memchr with nullptr. + if (FindBegin < size()) { + // Just forward to memchr, which is faster than a hand-rolled loop. + if (const void *P = ::memchr(First + FindBegin, C, size() - FindBegin)) + return size_t(static_cast<const char *>(P) - First); + } + return npos; + } + + StringView dropFront(size_t N = 1) const { + if (N >= size()) + N = size(); + return StringView(First + N, Last); + } + + StringView dropBack(size_t N = 1) const { + if (N >= size()) + N = size(); + return StringView(First, Last - N); + } + + char front() const { + assert(!empty()); + return *begin(); + } + + char back() const { + assert(!empty()); + return *(end() - 1); + } + + char popFront() { + assert(!empty()); + return *First++; + } + + bool consumeFront(char C) { + if (!startsWith(C)) + return false; + *this = dropFront(1); + return true; + } + + bool consumeFront(StringView S) { + if (!startsWith(S)) + return false; + *this = dropFront(S.size()); + return true; + } + + bool startsWith(char C) const { return !empty() && *begin() == C; } + + bool startsWith(StringView Str) const { + if (Str.size() > size()) + return false; + return std::equal(Str.begin(), Str.end(), begin()); + } + + const char &operator[](size_t Idx) const { return *(begin() + Idx); } + + const char *begin() const { return First; } + const char *end() const { return Last; } + size_t size() const { return static_cast<size_t>(Last - First); } + bool empty() const { return First == Last; } +}; + +inline bool operator==(const StringView &LHS, const StringView &RHS) { + return LHS.size() == RHS.size() && + std::equal(LHS.begin(), LHS.end(), RHS.begin()); +} + +DEMANGLE_NAMESPACE_END + +#endif diff --git a/contrib/libs/cxxsupp/libcxxabi/src/demangle/Utility.h b/contrib/libs/cxxsupp/libcxxabi/src/demangle/Utility.h index 733d83ad1b..a327f860d8 100644 --- a/contrib/libs/cxxsupp/libcxxabi/src/demangle/Utility.h +++ b/contrib/libs/cxxsupp/libcxxabi/src/demangle/Utility.h @@ -1,103 +1,103 @@ -//===--- Utility.h ----------------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// -// -// Provide some utility classes for use in the demangler(s). -// -//===----------------------------------------------------------------------===// - -#ifndef DEMANGLE_UTILITY_H -#define DEMANGLE_UTILITY_H - -#include "StringView.h" -#include <cstdint> -#include <cstdlib> -#include <cstring> -#include <iterator> -#include <limits> - -DEMANGLE_NAMESPACE_BEGIN - -// Stream that AST nodes write their string representation into after the AST -// has been parsed. +//===--- Utility.h ----------------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// Provide some utility classes for use in the demangler(s). +// +//===----------------------------------------------------------------------===// + +#ifndef DEMANGLE_UTILITY_H +#define DEMANGLE_UTILITY_H + +#include "StringView.h" +#include <cstdint> +#include <cstdlib> +#include <cstring> +#include <iterator> +#include <limits> + +DEMANGLE_NAMESPACE_BEGIN + +// Stream that AST nodes write their string representation into after the AST +// has been parsed. class OutputBuffer { - char *Buffer = nullptr; - size_t CurrentPosition = 0; - size_t BufferCapacity = 0; - - // Ensure there is at least n more positions in buffer. - void grow(size_t N) { - if (N + CurrentPosition >= BufferCapacity) { - BufferCapacity *= 2; - if (BufferCapacity < N + CurrentPosition) - BufferCapacity = N + CurrentPosition; - Buffer = static_cast<char *>(std::realloc(Buffer, BufferCapacity)); - if (Buffer == nullptr) - std::terminate(); - } - } - - void writeUnsigned(uint64_t N, bool isNeg = false) { - // Handle special case... - if (N == 0) { - *this << '0'; - return; - } - - char Temp[21]; - char *TempPtr = std::end(Temp); - - while (N) { - *--TempPtr = char('0' + N % 10); - N /= 10; - } - - // Add negative sign... - if (isNeg) - *--TempPtr = '-'; - this->operator<<(StringView(TempPtr, std::end(Temp))); - } - -public: + char *Buffer = nullptr; + size_t CurrentPosition = 0; + size_t BufferCapacity = 0; + + // Ensure there is at least n more positions in buffer. + void grow(size_t N) { + if (N + CurrentPosition >= BufferCapacity) { + BufferCapacity *= 2; + if (BufferCapacity < N + CurrentPosition) + BufferCapacity = N + CurrentPosition; + Buffer = static_cast<char *>(std::realloc(Buffer, BufferCapacity)); + if (Buffer == nullptr) + std::terminate(); + } + } + + void writeUnsigned(uint64_t N, bool isNeg = false) { + // Handle special case... + if (N == 0) { + *this << '0'; + return; + } + + char Temp[21]; + char *TempPtr = std::end(Temp); + + while (N) { + *--TempPtr = char('0' + N % 10); + N /= 10; + } + + // Add negative sign... + if (isNeg) + *--TempPtr = '-'; + this->operator<<(StringView(TempPtr, std::end(Temp))); + } + +public: OutputBuffer(char *StartBuf, size_t Size) - : Buffer(StartBuf), CurrentPosition(0), BufferCapacity(Size) {} + : Buffer(StartBuf), CurrentPosition(0), BufferCapacity(Size) {} OutputBuffer() = default; - void reset(char *Buffer_, size_t BufferCapacity_) { - CurrentPosition = 0; - Buffer = Buffer_; - BufferCapacity = BufferCapacity_; - } - - /// If a ParameterPackExpansion (or similar type) is encountered, the offset - /// into the pack that we're currently printing. - unsigned CurrentPackIndex = std::numeric_limits<unsigned>::max(); - unsigned CurrentPackMax = std::numeric_limits<unsigned>::max(); - + void reset(char *Buffer_, size_t BufferCapacity_) { + CurrentPosition = 0; + Buffer = Buffer_; + BufferCapacity = BufferCapacity_; + } + + /// If a ParameterPackExpansion (or similar type) is encountered, the offset + /// into the pack that we're currently printing. + unsigned CurrentPackIndex = std::numeric_limits<unsigned>::max(); + unsigned CurrentPackMax = std::numeric_limits<unsigned>::max(); + OutputBuffer &operator+=(StringView R) { - size_t Size = R.size(); - if (Size == 0) - return *this; - grow(Size); - std::memmove(Buffer + CurrentPosition, R.begin(), Size); - CurrentPosition += Size; - return *this; - } - + size_t Size = R.size(); + if (Size == 0) + return *this; + grow(Size); + std::memmove(Buffer + CurrentPosition, R.begin(), Size); + CurrentPosition += Size; + return *this; + } + OutputBuffer &operator+=(char C) { - grow(1); - Buffer[CurrentPosition++] = C; - return *this; - } - + grow(1); + Buffer[CurrentPosition++] = C; + return *this; + } + OutputBuffer &operator<<(StringView R) { return (*this += R); } - + OutputBuffer prepend(StringView R) { size_t Size = R.size(); - + grow(Size); std::memmove(Buffer + Size, Buffer, CurrentPosition); std::memcpy(Buffer, R.begin(), Size); @@ -109,34 +109,34 @@ public: OutputBuffer &operator<<(char C) { return (*this += C); } OutputBuffer &operator<<(long long N) { - if (N < 0) - writeUnsigned(static_cast<unsigned long long>(-N), true); - else - writeUnsigned(static_cast<unsigned long long>(N)); - return *this; - } - + if (N < 0) + writeUnsigned(static_cast<unsigned long long>(-N), true); + else + writeUnsigned(static_cast<unsigned long long>(N)); + return *this; + } + OutputBuffer &operator<<(unsigned long long N) { - writeUnsigned(N, false); - return *this; - } - + writeUnsigned(N, false); + return *this; + } + OutputBuffer &operator<<(long N) { - return this->operator<<(static_cast<long long>(N)); - } - + return this->operator<<(static_cast<long long>(N)); + } + OutputBuffer &operator<<(unsigned long N) { - return this->operator<<(static_cast<unsigned long long>(N)); - } - + return this->operator<<(static_cast<unsigned long long>(N)); + } + OutputBuffer &operator<<(int N) { - return this->operator<<(static_cast<long long>(N)); - } - + return this->operator<<(static_cast<long long>(N)); + } + OutputBuffer &operator<<(unsigned int N) { - return this->operator<<(static_cast<unsigned long long>(N)); - } - + return this->operator<<(static_cast<unsigned long long>(N)); + } + void insert(size_t Pos, const char *S, size_t N) { assert(Pos <= CurrentPosition); if (N == 0) @@ -147,66 +147,66 @@ public: CurrentPosition += N; } - size_t getCurrentPosition() const { return CurrentPosition; } - void setCurrentPosition(size_t NewPos) { CurrentPosition = NewPos; } - - char back() const { - return CurrentPosition ? Buffer[CurrentPosition - 1] : '\0'; - } - - bool empty() const { return CurrentPosition == 0; } - - char *getBuffer() { return Buffer; } - char *getBufferEnd() { return Buffer + CurrentPosition - 1; } - size_t getBufferCapacity() const { return BufferCapacity; } -}; - -template <class T> class SwapAndRestore { - T &Restore; - T OriginalValue; - bool ShouldRestore = true; - -public: - SwapAndRestore(T &Restore_) : SwapAndRestore(Restore_, Restore_) {} - - SwapAndRestore(T &Restore_, T NewVal) - : Restore(Restore_), OriginalValue(Restore) { - Restore = std::move(NewVal); - } - ~SwapAndRestore() { - if (ShouldRestore) - Restore = std::move(OriginalValue); - } - - void shouldRestore(bool ShouldRestore_) { ShouldRestore = ShouldRestore_; } - - void restoreNow(bool Force) { - if (!Force && !ShouldRestore) - return; - - Restore = std::move(OriginalValue); - ShouldRestore = false; - } - - SwapAndRestore(const SwapAndRestore &) = delete; - SwapAndRestore &operator=(const SwapAndRestore &) = delete; -}; - + size_t getCurrentPosition() const { return CurrentPosition; } + void setCurrentPosition(size_t NewPos) { CurrentPosition = NewPos; } + + char back() const { + return CurrentPosition ? Buffer[CurrentPosition - 1] : '\0'; + } + + bool empty() const { return CurrentPosition == 0; } + + char *getBuffer() { return Buffer; } + char *getBufferEnd() { return Buffer + CurrentPosition - 1; } + size_t getBufferCapacity() const { return BufferCapacity; } +}; + +template <class T> class SwapAndRestore { + T &Restore; + T OriginalValue; + bool ShouldRestore = true; + +public: + SwapAndRestore(T &Restore_) : SwapAndRestore(Restore_, Restore_) {} + + SwapAndRestore(T &Restore_, T NewVal) + : Restore(Restore_), OriginalValue(Restore) { + Restore = std::move(NewVal); + } + ~SwapAndRestore() { + if (ShouldRestore) + Restore = std::move(OriginalValue); + } + + void shouldRestore(bool ShouldRestore_) { ShouldRestore = ShouldRestore_; } + + void restoreNow(bool Force) { + if (!Force && !ShouldRestore) + return; + + Restore = std::move(OriginalValue); + ShouldRestore = false; + } + + SwapAndRestore(const SwapAndRestore &) = delete; + SwapAndRestore &operator=(const SwapAndRestore &) = delete; +}; + inline bool initializeOutputBuffer(char *Buf, size_t *N, OutputBuffer &OB, - size_t InitSize) { - size_t BufferSize; - if (Buf == nullptr) { - Buf = static_cast<char *>(std::malloc(InitSize)); - if (Buf == nullptr) - return false; - BufferSize = InitSize; - } else - BufferSize = *N; - + size_t InitSize) { + size_t BufferSize; + if (Buf == nullptr) { + Buf = static_cast<char *>(std::malloc(InitSize)); + if (Buf == nullptr) + return false; + BufferSize = InitSize; + } else + BufferSize = *N; + OB.reset(Buf, BufferSize); - return true; -} - -DEMANGLE_NAMESPACE_END - -#endif + return true; +} + +DEMANGLE_NAMESPACE_END + +#endif diff --git a/contrib/libs/cxxsupp/libcxxabi/src/fallback_malloc.cpp b/contrib/libs/cxxsupp/libcxxabi/src/fallback_malloc.cpp index 7e356d9fe4..f890338c58 100644 --- a/contrib/libs/cxxsupp/libcxxabi/src/fallback_malloc.cpp +++ b/contrib/libs/cxxsupp/libcxxabi/src/fallback_malloc.cpp @@ -1,252 +1,252 @@ //===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#include "fallback_malloc.h" - -#include <__threading_support> -#ifndef _LIBCXXABI_HAS_NO_THREADS -#if defined(__ELF__) && defined(_LIBCXXABI_LINK_PTHREAD_LIB) -#pragma comment(lib, "pthread") -#endif -#endif - -#include <stdlib.h> // for malloc, calloc, free -#include <string.h> // for memset -#include <new> // for std::__libcpp_aligned_{alloc,free} - -// A small, simple heap manager based (loosely) on -// the startup heap manager from FreeBSD, optimized for space. -// -// Manages a fixed-size memory pool, supports malloc and free only. -// No support for realloc. -// -// Allocates chunks in multiples of four bytes, with a four byte header -// for each chunk. The overhead of each chunk is kept low by keeping pointers -// as two byte offsets within the heap, rather than (4 or 8 byte) pointers. - -namespace { - -// When POSIX threads are not available, make the mutex operations a nop -#ifndef _LIBCXXABI_HAS_NO_THREADS -_LIBCPP_SAFE_STATIC -static std::__libcpp_mutex_t heap_mutex = _LIBCPP_MUTEX_INITIALIZER; -#else -static void* heap_mutex = 0; -#endif - -class mutexor { -public: -#ifndef _LIBCXXABI_HAS_NO_THREADS - mutexor(std::__libcpp_mutex_t* m) : mtx_(m) { - std::__libcpp_mutex_lock(mtx_); - } - ~mutexor() { std::__libcpp_mutex_unlock(mtx_); } -#else - mutexor(void*) {} - ~mutexor() {} -#endif -private: - mutexor(const mutexor& rhs); - mutexor& operator=(const mutexor& rhs); -#ifndef _LIBCXXABI_HAS_NO_THREADS - std::__libcpp_mutex_t* mtx_; -#endif -}; - -static const size_t HEAP_SIZE = 512; -char heap[HEAP_SIZE] __attribute__((aligned)); - -typedef unsigned short heap_offset; -typedef unsigned short heap_size; - -struct heap_node { - heap_offset next_node; // offset into heap - heap_size len; // size in units of "sizeof(heap_node)" -}; - -static const heap_node* list_end = - (heap_node*)(&heap[HEAP_SIZE]); // one past the end of the heap -static heap_node* freelist = NULL; - -heap_node* node_from_offset(const heap_offset offset) { - return (heap_node*)(heap + (offset * sizeof(heap_node))); -} - -heap_offset offset_from_node(const heap_node* ptr) { - return static_cast<heap_offset>( - static_cast<size_t>(reinterpret_cast<const char*>(ptr) - heap) / - sizeof(heap_node)); -} - -void init_heap() { - freelist = (heap_node*)heap; - freelist->next_node = offset_from_node(list_end); - freelist->len = HEAP_SIZE / sizeof(heap_node); -} - -// How big a chunk we allocate -size_t alloc_size(size_t len) { - return (len + sizeof(heap_node) - 1) / sizeof(heap_node) + 1; -} - -bool is_fallback_ptr(void* ptr) { - return ptr >= heap && ptr < (heap + HEAP_SIZE); -} - -void* fallback_malloc(size_t len) { - heap_node *p, *prev; - const size_t nelems = alloc_size(len); - mutexor mtx(&heap_mutex); - - if (NULL == freelist) - init_heap(); - - // Walk the free list, looking for a "big enough" chunk - for (p = freelist, prev = 0; p && p != list_end; - prev = p, p = node_from_offset(p->next_node)) { - - if (p->len > nelems) { // chunk is larger, shorten, and return the tail - heap_node* q; - - p->len = static_cast<heap_size>(p->len - nelems); - q = p + p->len; - q->next_node = 0; - q->len = static_cast<heap_size>(nelems); - return (void*)(q + 1); - } - - if (p->len == nelems) { // exact size match - if (prev == 0) - freelist = node_from_offset(p->next_node); - else - prev->next_node = p->next_node; - p->next_node = 0; - return (void*)(p + 1); - } - } - return NULL; // couldn't find a spot big enough -} - -// Return the start of the next block -heap_node* after(struct heap_node* p) { return p + p->len; } - -void fallback_free(void* ptr) { - struct heap_node* cp = ((struct heap_node*)ptr) - 1; // retrieve the chunk - struct heap_node *p, *prev; - - mutexor mtx(&heap_mutex); - -#ifdef DEBUG_FALLBACK_MALLOC - std::printf("Freeing item at %d of size %d\n", offset_from_node(cp), cp->len); -#endif - - for (p = freelist, prev = 0; p && p != list_end; - prev = p, p = node_from_offset(p->next_node)) { -#ifdef DEBUG_FALLBACK_MALLOC - std::printf(" p=%d, cp=%d, after(p)=%d, after(cp)=%d\n", - offset_from_node(p), offset_from_node(cp), - offset_from_node(after(p)), offset_from_node(after(cp))); -#endif - if (after(p) == cp) { -#ifdef DEBUG_FALLBACK_MALLOC - std::printf(" Appending onto chunk at %d\n", offset_from_node(p)); -#endif - p->len = static_cast<heap_size>( - p->len + cp->len); // make the free heap_node larger - return; - } else if (after(cp) == p) { // there's a free heap_node right after -#ifdef DEBUG_FALLBACK_MALLOC - std::printf(" Appending free chunk at %d\n", offset_from_node(p)); -#endif - cp->len = static_cast<heap_size>(cp->len + p->len); - if (prev == 0) { - freelist = cp; - cp->next_node = p->next_node; - } else - prev->next_node = offset_from_node(cp); - return; - } - } -// Nothing to merge with, add it to the start of the free list -#ifdef DEBUG_FALLBACK_MALLOC - std::printf(" Making new free list entry %d\n", offset_from_node(cp)); -#endif - cp->next_node = offset_from_node(freelist); - freelist = cp; -} - -#ifdef INSTRUMENT_FALLBACK_MALLOC -size_t print_free_list() { - struct heap_node *p, *prev; - heap_size total_free = 0; - if (NULL == freelist) - init_heap(); - - for (p = freelist, prev = 0; p && p != list_end; - prev = p, p = node_from_offset(p->next_node)) { - std::printf("%sOffset: %d\tsize: %d Next: %d\n", - (prev == 0 ? "" : " "), offset_from_node(p), p->len, p->next_node); - total_free += p->len; - } - std::printf("Total Free space: %d\n", total_free); - return total_free; -} -#endif -} // end unnamed namespace - -namespace __cxxabiv1 { - -struct __attribute__((aligned)) __aligned_type {}; - -void* __aligned_malloc_with_fallback(size_t size) { -#if defined(_WIN32) - if (void* dest = std::__libcpp_aligned_alloc(alignof(__aligned_type), size)) - return dest; -#elif defined(_LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION) - if (void* dest = ::malloc(size)) - return dest; -#else - if (size == 0) - size = 1; - if (void* dest = std::__libcpp_aligned_alloc(__alignof(__aligned_type), size)) - return dest; -#endif - return fallback_malloc(size); -} - -void* __calloc_with_fallback(size_t count, size_t size) { - void* ptr = ::calloc(count, size); - if (NULL != ptr) - return ptr; - // if calloc fails, fall back to emergency stash - ptr = fallback_malloc(size * count); - if (NULL != ptr) - ::memset(ptr, 0, size * count); - return ptr; -} - -void __aligned_free_with_fallback(void* ptr) { - if (is_fallback_ptr(ptr)) - fallback_free(ptr); - else { -#if defined(_LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION) - ::free(ptr); -#else - std::__libcpp_aligned_free(ptr); -#endif - } -} - -void __free_with_fallback(void* ptr) { - if (is_fallback_ptr(ptr)) - fallback_free(ptr); - else - ::free(ptr); -} - -} // namespace __cxxabiv1 +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "fallback_malloc.h" + +#include <__threading_support> +#ifndef _LIBCXXABI_HAS_NO_THREADS +#if defined(__ELF__) && defined(_LIBCXXABI_LINK_PTHREAD_LIB) +#pragma comment(lib, "pthread") +#endif +#endif + +#include <stdlib.h> // for malloc, calloc, free +#include <string.h> // for memset +#include <new> // for std::__libcpp_aligned_{alloc,free} + +// A small, simple heap manager based (loosely) on +// the startup heap manager from FreeBSD, optimized for space. +// +// Manages a fixed-size memory pool, supports malloc and free only. +// No support for realloc. +// +// Allocates chunks in multiples of four bytes, with a four byte header +// for each chunk. The overhead of each chunk is kept low by keeping pointers +// as two byte offsets within the heap, rather than (4 or 8 byte) pointers. + +namespace { + +// When POSIX threads are not available, make the mutex operations a nop +#ifndef _LIBCXXABI_HAS_NO_THREADS +_LIBCPP_SAFE_STATIC +static std::__libcpp_mutex_t heap_mutex = _LIBCPP_MUTEX_INITIALIZER; +#else +static void* heap_mutex = 0; +#endif + +class mutexor { +public: +#ifndef _LIBCXXABI_HAS_NO_THREADS + mutexor(std::__libcpp_mutex_t* m) : mtx_(m) { + std::__libcpp_mutex_lock(mtx_); + } + ~mutexor() { std::__libcpp_mutex_unlock(mtx_); } +#else + mutexor(void*) {} + ~mutexor() {} +#endif +private: + mutexor(const mutexor& rhs); + mutexor& operator=(const mutexor& rhs); +#ifndef _LIBCXXABI_HAS_NO_THREADS + std::__libcpp_mutex_t* mtx_; +#endif +}; + +static const size_t HEAP_SIZE = 512; +char heap[HEAP_SIZE] __attribute__((aligned)); + +typedef unsigned short heap_offset; +typedef unsigned short heap_size; + +struct heap_node { + heap_offset next_node; // offset into heap + heap_size len; // size in units of "sizeof(heap_node)" +}; + +static const heap_node* list_end = + (heap_node*)(&heap[HEAP_SIZE]); // one past the end of the heap +static heap_node* freelist = NULL; + +heap_node* node_from_offset(const heap_offset offset) { + return (heap_node*)(heap + (offset * sizeof(heap_node))); +} + +heap_offset offset_from_node(const heap_node* ptr) { + return static_cast<heap_offset>( + static_cast<size_t>(reinterpret_cast<const char*>(ptr) - heap) / + sizeof(heap_node)); +} + +void init_heap() { + freelist = (heap_node*)heap; + freelist->next_node = offset_from_node(list_end); + freelist->len = HEAP_SIZE / sizeof(heap_node); +} + +// How big a chunk we allocate +size_t alloc_size(size_t len) { + return (len + sizeof(heap_node) - 1) / sizeof(heap_node) + 1; +} + +bool is_fallback_ptr(void* ptr) { + return ptr >= heap && ptr < (heap + HEAP_SIZE); +} + +void* fallback_malloc(size_t len) { + heap_node *p, *prev; + const size_t nelems = alloc_size(len); + mutexor mtx(&heap_mutex); + + if (NULL == freelist) + init_heap(); + + // Walk the free list, looking for a "big enough" chunk + for (p = freelist, prev = 0; p && p != list_end; + prev = p, p = node_from_offset(p->next_node)) { + + if (p->len > nelems) { // chunk is larger, shorten, and return the tail + heap_node* q; + + p->len = static_cast<heap_size>(p->len - nelems); + q = p + p->len; + q->next_node = 0; + q->len = static_cast<heap_size>(nelems); + return (void*)(q + 1); + } + + if (p->len == nelems) { // exact size match + if (prev == 0) + freelist = node_from_offset(p->next_node); + else + prev->next_node = p->next_node; + p->next_node = 0; + return (void*)(p + 1); + } + } + return NULL; // couldn't find a spot big enough +} + +// Return the start of the next block +heap_node* after(struct heap_node* p) { return p + p->len; } + +void fallback_free(void* ptr) { + struct heap_node* cp = ((struct heap_node*)ptr) - 1; // retrieve the chunk + struct heap_node *p, *prev; + + mutexor mtx(&heap_mutex); + +#ifdef DEBUG_FALLBACK_MALLOC + std::printf("Freeing item at %d of size %d\n", offset_from_node(cp), cp->len); +#endif + + for (p = freelist, prev = 0; p && p != list_end; + prev = p, p = node_from_offset(p->next_node)) { +#ifdef DEBUG_FALLBACK_MALLOC + std::printf(" p=%d, cp=%d, after(p)=%d, after(cp)=%d\n", + offset_from_node(p), offset_from_node(cp), + offset_from_node(after(p)), offset_from_node(after(cp))); +#endif + if (after(p) == cp) { +#ifdef DEBUG_FALLBACK_MALLOC + std::printf(" Appending onto chunk at %d\n", offset_from_node(p)); +#endif + p->len = static_cast<heap_size>( + p->len + cp->len); // make the free heap_node larger + return; + } else if (after(cp) == p) { // there's a free heap_node right after +#ifdef DEBUG_FALLBACK_MALLOC + std::printf(" Appending free chunk at %d\n", offset_from_node(p)); +#endif + cp->len = static_cast<heap_size>(cp->len + p->len); + if (prev == 0) { + freelist = cp; + cp->next_node = p->next_node; + } else + prev->next_node = offset_from_node(cp); + return; + } + } +// Nothing to merge with, add it to the start of the free list +#ifdef DEBUG_FALLBACK_MALLOC + std::printf(" Making new free list entry %d\n", offset_from_node(cp)); +#endif + cp->next_node = offset_from_node(freelist); + freelist = cp; +} + +#ifdef INSTRUMENT_FALLBACK_MALLOC +size_t print_free_list() { + struct heap_node *p, *prev; + heap_size total_free = 0; + if (NULL == freelist) + init_heap(); + + for (p = freelist, prev = 0; p && p != list_end; + prev = p, p = node_from_offset(p->next_node)) { + std::printf("%sOffset: %d\tsize: %d Next: %d\n", + (prev == 0 ? "" : " "), offset_from_node(p), p->len, p->next_node); + total_free += p->len; + } + std::printf("Total Free space: %d\n", total_free); + return total_free; +} +#endif +} // end unnamed namespace + +namespace __cxxabiv1 { + +struct __attribute__((aligned)) __aligned_type {}; + +void* __aligned_malloc_with_fallback(size_t size) { +#if defined(_WIN32) + if (void* dest = std::__libcpp_aligned_alloc(alignof(__aligned_type), size)) + return dest; +#elif defined(_LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION) + if (void* dest = ::malloc(size)) + return dest; +#else + if (size == 0) + size = 1; + if (void* dest = std::__libcpp_aligned_alloc(__alignof(__aligned_type), size)) + return dest; +#endif + return fallback_malloc(size); +} + +void* __calloc_with_fallback(size_t count, size_t size) { + void* ptr = ::calloc(count, size); + if (NULL != ptr) + return ptr; + // if calloc fails, fall back to emergency stash + ptr = fallback_malloc(size * count); + if (NULL != ptr) + ::memset(ptr, 0, size * count); + return ptr; +} + +void __aligned_free_with_fallback(void* ptr) { + if (is_fallback_ptr(ptr)) + fallback_free(ptr); + else { +#if defined(_LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION) + ::free(ptr); +#else + std::__libcpp_aligned_free(ptr); +#endif + } +} + +void __free_with_fallback(void* ptr) { + if (is_fallback_ptr(ptr)) + fallback_free(ptr); + else + ::free(ptr); +} + +} // namespace __cxxabiv1 diff --git a/contrib/libs/cxxsupp/libcxxabi/src/fallback_malloc.h b/contrib/libs/cxxsupp/libcxxabi/src/fallback_malloc.h index 816e691ed2..04396040c0 100644 --- a/contrib/libs/cxxsupp/libcxxabi/src/fallback_malloc.h +++ b/contrib/libs/cxxsupp/libcxxabi/src/fallback_malloc.h @@ -1,28 +1,28 @@ //===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#ifndef _FALLBACK_MALLOC_H -#define _FALLBACK_MALLOC_H - -#include "__cxxabi_config.h" -#include <stddef.h> // for size_t - -namespace __cxxabiv1 { - -// Allocate some memory from _somewhere_ -_LIBCXXABI_HIDDEN void * __aligned_malloc_with_fallback(size_t size); - -// Allocate and zero-initialize memory from _somewhere_ -_LIBCXXABI_HIDDEN void * __calloc_with_fallback(size_t count, size_t size); - -_LIBCXXABI_HIDDEN void __aligned_free_with_fallback(void *ptr); -_LIBCXXABI_HIDDEN void __free_with_fallback(void *ptr); - -} // namespace __cxxabiv1 - -#endif +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _FALLBACK_MALLOC_H +#define _FALLBACK_MALLOC_H + +#include "__cxxabi_config.h" +#include <stddef.h> // for size_t + +namespace __cxxabiv1 { + +// Allocate some memory from _somewhere_ +_LIBCXXABI_HIDDEN void * __aligned_malloc_with_fallback(size_t size); + +// Allocate and zero-initialize memory from _somewhere_ +_LIBCXXABI_HIDDEN void * __calloc_with_fallback(size_t count, size_t size); + +_LIBCXXABI_HIDDEN void __aligned_free_with_fallback(void *ptr); +_LIBCXXABI_HIDDEN void __free_with_fallback(void *ptr); + +} // namespace __cxxabiv1 + +#endif diff --git a/contrib/libs/cxxsupp/libcxxabi/src/private_typeinfo.cpp b/contrib/libs/cxxsupp/libcxxabi/src/private_typeinfo.cpp index e1086661c0..d2b8f854ce 100644 --- a/contrib/libs/cxxsupp/libcxxabi/src/private_typeinfo.cpp +++ b/contrib/libs/cxxsupp/libcxxabi/src/private_typeinfo.cpp @@ -1,1326 +1,1326 @@ //===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#include "private_typeinfo.h" - -// The flag _LIBCXXABI_FORGIVING_DYNAMIC_CAST is used to make dynamic_cast -// more forgiving when type_info's mistakenly have hidden visibility and -// thus multiple type_infos can exist for a single type. -// -// When _LIBCXXABI_FORGIVING_DYNAMIC_CAST is defined, and only in the case where -// there is a detected inconsistency in the type_info hierarchy during a -// dynamic_cast, then the equality operation will fall back to using strcmp -// on type_info names to determine type_info equality. -// -// This change happens *only* under dynamic_cast, and only when -// dynamic_cast is faced with the choice: abort, or possibly give back the -// wrong answer. If when the dynamic_cast is done with this fallback -// algorithm and an inconsistency is still detected, dynamic_cast will call -// abort with an appropriate message. -// -// The current implementation of _LIBCXXABI_FORGIVING_DYNAMIC_CAST requires a -// printf-like function called syslog: -// -// void syslog(int facility_priority, const char* format, ...); -// -// If you want this functionality but your platform doesn't have syslog, -// just implement it in terms of fprintf(stderr, ...). -// -// _LIBCXXABI_FORGIVING_DYNAMIC_CAST is currently off by default. - -// On Windows, typeids are different between DLLs and EXEs, so comparing -// type_info* will work for typeids from the same compiled file but fail -// for typeids from a DLL and an executable. Among other things, exceptions -// are not caught by handlers since can_catch() returns false. -// -// Defining _LIBCXXABI_FORGIVING_DYNAMIC_CAST does not help since can_catch() calls -// is_equal() with use_strcmp=false so the string names are not compared. - -#include <string.h> - -#ifdef _LIBCXXABI_FORGIVING_DYNAMIC_CAST -#include "abort_message.h" -#include <sys/syslog.h> -#include <atomic> -#endif - -static inline -bool -is_equal(const std::type_info* x, const std::type_info* y, bool use_strcmp) -{ - // Use std::type_info's default comparison unless we've explicitly asked - // for strcmp. - if (!use_strcmp) - return *x == *y; - // Still allow pointer equality to short circut. - return x == y || strcmp(x->name(), y->name()) == 0; -} - -static inline ptrdiff_t update_offset_to_base(const char* vtable, - ptrdiff_t offset_to_base) { -#if __has_feature(cxx_abi_relative_vtable) - // VTable components are 32 bits in the relative vtables ABI. - return *reinterpret_cast<const int32_t*>(vtable + offset_to_base); -#else - return *reinterpret_cast<const ptrdiff_t*>(vtable + offset_to_base); -#endif -} - -namespace __cxxabiv1 -{ - -// __shim_type_info - -__shim_type_info::~__shim_type_info() -{ -} - -void __shim_type_info::noop1() const {} -void __shim_type_info::noop2() const {} - -// __fundamental_type_info - -// This miraculously (compiler magic) emits the type_info's for: -// 1. all of the fundamental types -// 2. pointers to all of the fundamental types -// 3. pointers to all of the const fundamental types -__fundamental_type_info::~__fundamental_type_info() -{ -} - -// __array_type_info - -__array_type_info::~__array_type_info() -{ -} - -// __function_type_info - -__function_type_info::~__function_type_info() -{ -} - -// __enum_type_info - -__enum_type_info::~__enum_type_info() -{ -} - -// __class_type_info - -__class_type_info::~__class_type_info() -{ -} - -// __si_class_type_info - -__si_class_type_info::~__si_class_type_info() -{ -} - -// __vmi_class_type_info - -__vmi_class_type_info::~__vmi_class_type_info() -{ -} - -// __pbase_type_info - -__pbase_type_info::~__pbase_type_info() -{ -} - -// __pointer_type_info - -__pointer_type_info::~__pointer_type_info() -{ -} - -// __pointer_to_member_type_info - -__pointer_to_member_type_info::~__pointer_to_member_type_info() -{ -} - -// can_catch - -// A handler is a match for an exception object of type E if -// 1. The handler is of type cv T or cv T& and E and T are the same type -// (ignoring the top-level cv-qualifiers), or -// 2. the handler is of type cv T or cv T& and T is an unambiguous public -// base class of E, or -// 3. the handler is of type cv1 T* cv2 and E is a pointer type that can be -// converted to the type of the handler by either or both of -// A. a standard pointer conversion (4.10) not involving conversions to -// pointers to private or protected or ambiguous classes -// B. a qualification conversion -// 4. the handler is a pointer or pointer to member type and E is -// std::nullptr_t. - -// adjustedPtr: -// -// catch (A& a) : adjustedPtr == &a -// catch (A* a) : adjustedPtr == a -// catch (A** a) : adjustedPtr == a -// -// catch (D2& d2) : adjustedPtr == &d2 (d2 is base class of thrown object) -// catch (D2* d2) : adjustedPtr == d2 -// catch (D2*& d2) : adjustedPtr == d2 -// -// catch (...) : adjustedPtr == & of the exception -// -// If the thrown type is nullptr_t and the caught type is a pointer to -// member type, adjustedPtr points to a statically-allocated null pointer -// representation of that type. - -// Handles bullet 1 -bool -__fundamental_type_info::can_catch(const __shim_type_info* thrown_type, - void*&) const -{ - return is_equal(this, thrown_type, false); -} - -bool -__array_type_info::can_catch(const __shim_type_info*, void*&) const -{ - // We can get here if someone tries to catch an array by reference. - // However if someone tries to throw an array, it immediately gets - // converted to a pointer, which will not convert back to an array - // at the catch clause. So this can never catch anything. - return false; -} - -bool -__function_type_info::can_catch(const __shim_type_info*, void*&) const -{ - // We can get here if someone tries to catch a function by reference. - // However if someone tries to throw a function, it immediately gets - // converted to a pointer, which will not convert back to a function - // at the catch clause. So this can never catch anything. - return false; -} - -// Handles bullet 1 -bool -__enum_type_info::can_catch(const __shim_type_info* thrown_type, - void*&) const -{ - return is_equal(this, thrown_type, false); -} - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wmissing-field-initializers" -#endif - -// Handles bullets 1 and 2 -bool -__class_type_info::can_catch(const __shim_type_info* thrown_type, - void*& adjustedPtr) const -{ - // bullet 1 - if (is_equal(this, thrown_type, false)) - return true; - const __class_type_info* thrown_class_type = - dynamic_cast<const __class_type_info*>(thrown_type); - if (thrown_class_type == 0) - return false; - // bullet 2 - __dynamic_cast_info info = {thrown_class_type, 0, this, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,}; - info.number_of_dst_type = 1; - thrown_class_type->has_unambiguous_public_base(&info, adjustedPtr, public_path); - if (info.path_dst_ptr_to_static_ptr == public_path) - { - adjustedPtr = const_cast<void*>(info.dst_ptr_leading_to_static_ptr); - return true; - } - return false; -} - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - -void -__class_type_info::process_found_base_class(__dynamic_cast_info* info, - void* adjustedPtr, - int path_below) const -{ - if (info->dst_ptr_leading_to_static_ptr == 0) - { - // First time here - info->dst_ptr_leading_to_static_ptr = adjustedPtr; - info->path_dst_ptr_to_static_ptr = path_below; - info->number_to_static_ptr = 1; - } - else if (info->dst_ptr_leading_to_static_ptr == adjustedPtr) - { - // We've been here before. Update path to "most public" - if (info->path_dst_ptr_to_static_ptr == not_public_path) - info->path_dst_ptr_to_static_ptr = path_below; - } - else - { - // We've detected an ambiguous cast from (thrown_class_type, adjustedPtr) - // to a static_type - info->number_to_static_ptr += 1; - info->path_dst_ptr_to_static_ptr = not_public_path; - info->search_done = true; - } -} - -void -__class_type_info::has_unambiguous_public_base(__dynamic_cast_info* info, - void* adjustedPtr, - int path_below) const -{ - if (is_equal(this, info->static_type, false)) - process_found_base_class(info, adjustedPtr, path_below); -} - -void -__si_class_type_info::has_unambiguous_public_base(__dynamic_cast_info* info, - void* adjustedPtr, - int path_below) const -{ - if (is_equal(this, info->static_type, false)) - process_found_base_class(info, adjustedPtr, path_below); - else - __base_type->has_unambiguous_public_base(info, adjustedPtr, path_below); -} - -void -__base_class_type_info::has_unambiguous_public_base(__dynamic_cast_info* info, - void* adjustedPtr, - int path_below) const -{ - ptrdiff_t offset_to_base = 0; - if (adjustedPtr != nullptr) - { - offset_to_base = __offset_flags >> __offset_shift; - if (__offset_flags & __virtual_mask) - { - const char* vtable = *static_cast<const char*const*>(adjustedPtr); - offset_to_base = update_offset_to_base(vtable, offset_to_base); - } - } - __base_type->has_unambiguous_public_base( - info, - static_cast<char*>(adjustedPtr) + offset_to_base, - (__offset_flags & __public_mask) ? path_below : not_public_path); -} - -void -__vmi_class_type_info::has_unambiguous_public_base(__dynamic_cast_info* info, - void* adjustedPtr, - int path_below) const -{ - if (is_equal(this, info->static_type, false)) - process_found_base_class(info, adjustedPtr, path_below); - else - { - typedef const __base_class_type_info* Iter; - const Iter e = __base_info + __base_count; - Iter p = __base_info; - p->has_unambiguous_public_base(info, adjustedPtr, path_below); - if (++p < e) - { - do - { - p->has_unambiguous_public_base(info, adjustedPtr, path_below); - if (info->search_done) - break; - } while (++p < e); - } - } -} - -// Handles bullet 1 for both pointers and member pointers -bool -__pbase_type_info::can_catch(const __shim_type_info* thrown_type, - void*&) const -{ - bool use_strcmp = this->__flags & (__incomplete_class_mask | - __incomplete_mask); - if (!use_strcmp) { - const __pbase_type_info* thrown_pbase = dynamic_cast<const __pbase_type_info*>( - thrown_type); - if (!thrown_pbase) return false; - use_strcmp = thrown_pbase->__flags & (__incomplete_class_mask | - __incomplete_mask); - } - return is_equal(this, thrown_type, use_strcmp); -} - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wmissing-field-initializers" -#endif - -// Handles bullets 1, 3 and 4 -// NOTE: It might not be safe to adjust the pointer if it is not not a pointer -// type. Only adjust the pointer after we know it is safe to do so. -bool -__pointer_type_info::can_catch(const __shim_type_info* thrown_type, - void*& adjustedPtr) const -{ - // bullet 4 - if (is_equal(thrown_type, &typeid(std::nullptr_t), false)) { - adjustedPtr = nullptr; - return true; - } - - // bullet 1 - if (__pbase_type_info::can_catch(thrown_type, adjustedPtr)) { - if (adjustedPtr != NULL) - adjustedPtr = *static_cast<void**>(adjustedPtr); - return true; - } - // bullet 3 - const __pointer_type_info* thrown_pointer_type = - dynamic_cast<const __pointer_type_info*>(thrown_type); - if (thrown_pointer_type == 0) - return false; - // Do the dereference adjustment - if (adjustedPtr != NULL) - adjustedPtr = *static_cast<void**>(adjustedPtr); - // bullet 3B and 3C - if (thrown_pointer_type->__flags & ~__flags & __no_remove_flags_mask) - return false; - if (__flags & ~thrown_pointer_type->__flags & __no_add_flags_mask) - return false; - if (is_equal(__pointee, thrown_pointer_type->__pointee, false)) - return true; - // bullet 3A - if (is_equal(__pointee, &typeid(void), false)) { - // pointers to functions cannot be converted to void*. - // pointers to member functions are not handled here. - const __function_type_info* thrown_function = - dynamic_cast<const __function_type_info*>(thrown_pointer_type->__pointee); - return (thrown_function == nullptr); - } - // Handle pointer to pointer - const __pointer_type_info* nested_pointer_type = - dynamic_cast<const __pointer_type_info*>(__pointee); - if (nested_pointer_type) { - if (~__flags & __const_mask) return false; - return nested_pointer_type->can_catch_nested(thrown_pointer_type->__pointee); - } - - // Handle pointer to pointer to member - const __pointer_to_member_type_info* member_ptr_type = - dynamic_cast<const __pointer_to_member_type_info*>(__pointee); - if (member_ptr_type) { - if (~__flags & __const_mask) return false; - return member_ptr_type->can_catch_nested(thrown_pointer_type->__pointee); - } - - // Handle pointer to class type - const __class_type_info* catch_class_type = - dynamic_cast<const __class_type_info*>(__pointee); - if (catch_class_type == 0) - return false; - const __class_type_info* thrown_class_type = - dynamic_cast<const __class_type_info*>(thrown_pointer_type->__pointee); - if (thrown_class_type == 0) - return false; - __dynamic_cast_info info = {thrown_class_type, 0, catch_class_type, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,}; - info.number_of_dst_type = 1; - thrown_class_type->has_unambiguous_public_base(&info, adjustedPtr, public_path); - if (info.path_dst_ptr_to_static_ptr == public_path) - { - if (adjustedPtr != NULL) - adjustedPtr = const_cast<void*>(info.dst_ptr_leading_to_static_ptr); - return true; - } - return false; -} - -bool __pointer_type_info::can_catch_nested( - const __shim_type_info* thrown_type) const -{ - const __pointer_type_info* thrown_pointer_type = - dynamic_cast<const __pointer_type_info*>(thrown_type); - if (thrown_pointer_type == 0) - return false; - // bullet 3B - if (thrown_pointer_type->__flags & ~__flags) - return false; - if (is_equal(__pointee, thrown_pointer_type->__pointee, false)) - return true; - // If the pointed to types differ then the catch type must be const - // qualified. - if (~__flags & __const_mask) - return false; - - // Handle pointer to pointer - const __pointer_type_info* nested_pointer_type = - dynamic_cast<const __pointer_type_info*>(__pointee); - if (nested_pointer_type) { - return nested_pointer_type->can_catch_nested( - thrown_pointer_type->__pointee); - } - - // Handle pointer to pointer to member - const __pointer_to_member_type_info* member_ptr_type = - dynamic_cast<const __pointer_to_member_type_info*>(__pointee); - if (member_ptr_type) { - return member_ptr_type->can_catch_nested(thrown_pointer_type->__pointee); - } - - return false; -} - -bool __pointer_to_member_type_info::can_catch( - const __shim_type_info* thrown_type, void*& adjustedPtr) const { - // bullet 4 - if (is_equal(thrown_type, &typeid(std::nullptr_t), false)) { - // We assume that the pointer to member representation is the same for - // all pointers to data members and for all pointers to member functions. - struct X {}; - if (dynamic_cast<const __function_type_info*>(__pointee)) { - static int (X::*const null_ptr_rep)() = nullptr; - adjustedPtr = const_cast<int (X::**)()>(&null_ptr_rep); - } else { - static int X::*const null_ptr_rep = nullptr; - adjustedPtr = const_cast<int X::**>(&null_ptr_rep); - } - return true; - } - - // bullet 1 - if (__pbase_type_info::can_catch(thrown_type, adjustedPtr)) - return true; - - const __pointer_to_member_type_info* thrown_pointer_type = - dynamic_cast<const __pointer_to_member_type_info*>(thrown_type); - if (thrown_pointer_type == 0) - return false; - if (thrown_pointer_type->__flags & ~__flags & __no_remove_flags_mask) - return false; - if (__flags & ~thrown_pointer_type->__flags & __no_add_flags_mask) - return false; - if (!is_equal(__pointee, thrown_pointer_type->__pointee, false)) - return false; - if (is_equal(__context, thrown_pointer_type->__context, false)) - return true; - - // [except.handle] does not allow the pointer-to-member conversions mentioned - // in [mem.conv] to take place. For this reason we don't check Derived->Base - // for Derived->Base conversions. - - return false; -} - -bool __pointer_to_member_type_info::can_catch_nested( - const __shim_type_info* thrown_type) const -{ - const __pointer_to_member_type_info* thrown_member_ptr_type = - dynamic_cast<const __pointer_to_member_type_info*>(thrown_type); - if (thrown_member_ptr_type == 0) - return false; - if (~__flags & thrown_member_ptr_type->__flags) - return false; - if (!is_equal(__pointee, thrown_member_ptr_type->__pointee, false)) - return false; - if (!is_equal(__context, thrown_member_ptr_type->__context, false)) - return false; - return true; -} - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wmissing-field-initializers" -#endif - -// __dynamic_cast - -// static_ptr: pointer to an object of type static_type; nonnull, and since the -// object is polymorphic, *(void**)static_ptr is a virtual table pointer. -// static_ptr is &v in the expression dynamic_cast<T>(v). -// static_type: static type of the object pointed to by static_ptr. -// dst_type: destination type of the cast (the "T" in "dynamic_cast<T>(v)"). -// src2dst_offset: a static hint about the location of the -// source subobject with respect to the complete object; -// special negative values are: -// -1: no hint -// -2: static_type is not a public base of dst_type -// -3: static_type is a multiple public base type but never a -// virtual base type -// otherwise, the static_type type is a unique public nonvirtual -// base type of dst_type at offset src2dst_offset from the -// origin of dst_type. -// -// (dynamic_ptr, dynamic_type) are the run time type of the complete object -// referred to by static_ptr and a pointer to it. These can be found from -// static_ptr for polymorphic types. -// static_type is guaranteed to be a polymorphic type. -// -// (dynamic_ptr, dynamic_type) is the root of a DAG that grows upward. Each -// node of the tree represents a base class/object of its parent (or parents) below. -// Each node is uniquely represented by a pointer to the object, and a pointer -// to a type_info - its type. Different nodes may have the same pointer and -// different nodes may have the same type. But only one node has a specific -// (pointer-value, type) pair. In C++ two objects of the same type can not -// share the same address. -// -// There are two flavors of nodes which have the type dst_type: -// 1. Those that are derived from (below) (static_ptr, static_type). -// 2. Those that are not derived from (below) (static_ptr, static_type). -// -// Invariants of the DAG: -// -// There is at least one path from the root (dynamic_ptr, dynamic_type) to -// the node (static_ptr, static_type). This path may or may not be public. -// There may be more than one such path (some public some not). Such a path may -// or may not go through a node having type dst_type. -// -// No node of type T appears above a node of the same type. That means that -// there is only one node with dynamic_type. And if dynamic_type == dst_type, -// then there is only one dst_type in the DAG. -// -// No node of type dst_type appears above a node of type static_type. Such -// DAG's are possible in C++, but the compiler computes those dynamic_casts at -// compile time, and only calls __dynamic_cast when dst_type lies below -// static_type in the DAG. -// -// dst_type != static_type: The compiler computes the dynamic_cast in this case too. -// dynamic_type != static_type: The compiler computes the dynamic_cast in this case too. -// -// Returns: -// -// If there is exactly one dst_type of flavor 1, and -// If there is a public path from that dst_type to (static_ptr, static_type), or -// If there are 0 dst_types of flavor 2, and there is a public path from -// (dynamic_ptr, dynamic_type) to (static_ptr, static_type) and a public -// path from (dynamic_ptr, dynamic_type) to the one dst_type, then return -// a pointer to that dst_type. -// Else if there are 0 dst_types of flavor 1 and exactly 1 dst_type of flavor 2, and -// if there is a public path from (dynamic_ptr, dynamic_type) to -// (static_ptr, static_type) and a public path from (dynamic_ptr, dynamic_type) -// to the one dst_type, then return a pointer to that one dst_type. -// Else return nullptr. -// -// If dynamic_type == dst_type, then the above algorithm collapses to the -// following cheaper algorithm: -// -// If there is a public path from (dynamic_ptr, dynamic_type) to -// (static_ptr, static_type), then return dynamic_ptr. -// Else return nullptr. - -extern "C" _LIBCXXABI_FUNC_VIS void * -__dynamic_cast(const void *static_ptr, const __class_type_info *static_type, - const __class_type_info *dst_type, - std::ptrdiff_t src2dst_offset) { - // Possible future optimization: Take advantage of src2dst_offset - - // Get (dynamic_ptr, dynamic_type) from static_ptr -#if __has_feature(cxx_abi_relative_vtable) - // The vtable address will point to the first virtual function, which is 8 - // bytes after the start of the vtable (4 for the offset from top + 4 for the typeinfo component). - const int32_t* vtable = - *reinterpret_cast<const int32_t* const*>(static_ptr); - int32_t offset_to_derived = vtable[-2]; - const void* dynamic_ptr = static_cast<const char*>(static_ptr) + offset_to_derived; - - // The typeinfo component is now a relative offset to a proxy. - int32_t offset_to_ti_proxy = vtable[-1]; - const uint8_t* ptr_to_ti_proxy = - reinterpret_cast<const uint8_t*>(vtable) + offset_to_ti_proxy; - const __class_type_info* dynamic_type = - *(reinterpret_cast<const __class_type_info* const*>(ptr_to_ti_proxy)); -#else - void **vtable = *static_cast<void ** const *>(static_ptr); - ptrdiff_t offset_to_derived = reinterpret_cast<ptrdiff_t>(vtable[-2]); - const void* dynamic_ptr = static_cast<const char*>(static_ptr) + offset_to_derived; - const __class_type_info* dynamic_type = static_cast<const __class_type_info*>(vtable[-1]); -#endif - - // Initialize answer to nullptr. This will be changed from the search - // results if a non-null answer is found. Regardless, this is what will - // be returned. - const void* dst_ptr = 0; - // Initialize info struct for this search. - __dynamic_cast_info info = {dst_type, static_ptr, static_type, src2dst_offset, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,}; - - // Find out if we can use a giant short cut in the search - if (is_equal(dynamic_type, dst_type, false)) - { - // Using giant short cut. Add that information to info. - info.number_of_dst_type = 1; - // Do the search - dynamic_type->search_above_dst(&info, dynamic_ptr, dynamic_ptr, public_path, false); -#ifdef _LIBCXXABI_FORGIVING_DYNAMIC_CAST - // The following if should always be false because we should definitely - // find (static_ptr, static_type), either on a public or private path - if (info.path_dst_ptr_to_static_ptr == unknown) - { - // We get here only if there is some kind of visibility problem - // in client code. - static_assert(std::atomic<size_t>::is_always_lock_free, ""); - static std::atomic<size_t> error_count(0); - size_t error_count_snapshot = error_count.fetch_add(1, std::memory_order_relaxed); - if ((error_count_snapshot & (error_count_snapshot-1)) == 0) - syslog(LOG_ERR, "dynamic_cast error 1: Both of the following type_info's " - "should have public visibility. At least one of them is hidden. %s" - ", %s.\n", static_type->name(), dynamic_type->name()); - // Redo the search comparing type_info's using strcmp - info = {dst_type, static_ptr, static_type, src2dst_offset, 0}; - info.number_of_dst_type = 1; - dynamic_type->search_above_dst(&info, dynamic_ptr, dynamic_ptr, public_path, true); - } +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "private_typeinfo.h" + +// The flag _LIBCXXABI_FORGIVING_DYNAMIC_CAST is used to make dynamic_cast +// more forgiving when type_info's mistakenly have hidden visibility and +// thus multiple type_infos can exist for a single type. +// +// When _LIBCXXABI_FORGIVING_DYNAMIC_CAST is defined, and only in the case where +// there is a detected inconsistency in the type_info hierarchy during a +// dynamic_cast, then the equality operation will fall back to using strcmp +// on type_info names to determine type_info equality. +// +// This change happens *only* under dynamic_cast, and only when +// dynamic_cast is faced with the choice: abort, or possibly give back the +// wrong answer. If when the dynamic_cast is done with this fallback +// algorithm and an inconsistency is still detected, dynamic_cast will call +// abort with an appropriate message. +// +// The current implementation of _LIBCXXABI_FORGIVING_DYNAMIC_CAST requires a +// printf-like function called syslog: +// +// void syslog(int facility_priority, const char* format, ...); +// +// If you want this functionality but your platform doesn't have syslog, +// just implement it in terms of fprintf(stderr, ...). +// +// _LIBCXXABI_FORGIVING_DYNAMIC_CAST is currently off by default. + +// On Windows, typeids are different between DLLs and EXEs, so comparing +// type_info* will work for typeids from the same compiled file but fail +// for typeids from a DLL and an executable. Among other things, exceptions +// are not caught by handlers since can_catch() returns false. +// +// Defining _LIBCXXABI_FORGIVING_DYNAMIC_CAST does not help since can_catch() calls +// is_equal() with use_strcmp=false so the string names are not compared. + +#include <string.h> + +#ifdef _LIBCXXABI_FORGIVING_DYNAMIC_CAST +#include "abort_message.h" +#include <sys/syslog.h> +#include <atomic> +#endif + +static inline +bool +is_equal(const std::type_info* x, const std::type_info* y, bool use_strcmp) +{ + // Use std::type_info's default comparison unless we've explicitly asked + // for strcmp. + if (!use_strcmp) + return *x == *y; + // Still allow pointer equality to short circut. + return x == y || strcmp(x->name(), y->name()) == 0; +} + +static inline ptrdiff_t update_offset_to_base(const char* vtable, + ptrdiff_t offset_to_base) { +#if __has_feature(cxx_abi_relative_vtable) + // VTable components are 32 bits in the relative vtables ABI. + return *reinterpret_cast<const int32_t*>(vtable + offset_to_base); +#else + return *reinterpret_cast<const ptrdiff_t*>(vtable + offset_to_base); +#endif +} + +namespace __cxxabiv1 +{ + +// __shim_type_info + +__shim_type_info::~__shim_type_info() +{ +} + +void __shim_type_info::noop1() const {} +void __shim_type_info::noop2() const {} + +// __fundamental_type_info + +// This miraculously (compiler magic) emits the type_info's for: +// 1. all of the fundamental types +// 2. pointers to all of the fundamental types +// 3. pointers to all of the const fundamental types +__fundamental_type_info::~__fundamental_type_info() +{ +} + +// __array_type_info + +__array_type_info::~__array_type_info() +{ +} + +// __function_type_info + +__function_type_info::~__function_type_info() +{ +} + +// __enum_type_info + +__enum_type_info::~__enum_type_info() +{ +} + +// __class_type_info + +__class_type_info::~__class_type_info() +{ +} + +// __si_class_type_info + +__si_class_type_info::~__si_class_type_info() +{ +} + +// __vmi_class_type_info + +__vmi_class_type_info::~__vmi_class_type_info() +{ +} + +// __pbase_type_info + +__pbase_type_info::~__pbase_type_info() +{ +} + +// __pointer_type_info + +__pointer_type_info::~__pointer_type_info() +{ +} + +// __pointer_to_member_type_info + +__pointer_to_member_type_info::~__pointer_to_member_type_info() +{ +} + +// can_catch + +// A handler is a match for an exception object of type E if +// 1. The handler is of type cv T or cv T& and E and T are the same type +// (ignoring the top-level cv-qualifiers), or +// 2. the handler is of type cv T or cv T& and T is an unambiguous public +// base class of E, or +// 3. the handler is of type cv1 T* cv2 and E is a pointer type that can be +// converted to the type of the handler by either or both of +// A. a standard pointer conversion (4.10) not involving conversions to +// pointers to private or protected or ambiguous classes +// B. a qualification conversion +// 4. the handler is a pointer or pointer to member type and E is +// std::nullptr_t. + +// adjustedPtr: +// +// catch (A& a) : adjustedPtr == &a +// catch (A* a) : adjustedPtr == a +// catch (A** a) : adjustedPtr == a +// +// catch (D2& d2) : adjustedPtr == &d2 (d2 is base class of thrown object) +// catch (D2* d2) : adjustedPtr == d2 +// catch (D2*& d2) : adjustedPtr == d2 +// +// catch (...) : adjustedPtr == & of the exception +// +// If the thrown type is nullptr_t and the caught type is a pointer to +// member type, adjustedPtr points to a statically-allocated null pointer +// representation of that type. + +// Handles bullet 1 +bool +__fundamental_type_info::can_catch(const __shim_type_info* thrown_type, + void*&) const +{ + return is_equal(this, thrown_type, false); +} + +bool +__array_type_info::can_catch(const __shim_type_info*, void*&) const +{ + // We can get here if someone tries to catch an array by reference. + // However if someone tries to throw an array, it immediately gets + // converted to a pointer, which will not convert back to an array + // at the catch clause. So this can never catch anything. + return false; +} + +bool +__function_type_info::can_catch(const __shim_type_info*, void*&) const +{ + // We can get here if someone tries to catch a function by reference. + // However if someone tries to throw a function, it immediately gets + // converted to a pointer, which will not convert back to a function + // at the catch clause. So this can never catch anything. + return false; +} + +// Handles bullet 1 +bool +__enum_type_info::can_catch(const __shim_type_info* thrown_type, + void*&) const +{ + return is_equal(this, thrown_type, false); +} + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wmissing-field-initializers" +#endif + +// Handles bullets 1 and 2 +bool +__class_type_info::can_catch(const __shim_type_info* thrown_type, + void*& adjustedPtr) const +{ + // bullet 1 + if (is_equal(this, thrown_type, false)) + return true; + const __class_type_info* thrown_class_type = + dynamic_cast<const __class_type_info*>(thrown_type); + if (thrown_class_type == 0) + return false; + // bullet 2 + __dynamic_cast_info info = {thrown_class_type, 0, this, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,}; + info.number_of_dst_type = 1; + thrown_class_type->has_unambiguous_public_base(&info, adjustedPtr, public_path); + if (info.path_dst_ptr_to_static_ptr == public_path) + { + adjustedPtr = const_cast<void*>(info.dst_ptr_leading_to_static_ptr); + return true; + } + return false; +} + +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + +void +__class_type_info::process_found_base_class(__dynamic_cast_info* info, + void* adjustedPtr, + int path_below) const +{ + if (info->dst_ptr_leading_to_static_ptr == 0) + { + // First time here + info->dst_ptr_leading_to_static_ptr = adjustedPtr; + info->path_dst_ptr_to_static_ptr = path_below; + info->number_to_static_ptr = 1; + } + else if (info->dst_ptr_leading_to_static_ptr == adjustedPtr) + { + // We've been here before. Update path to "most public" + if (info->path_dst_ptr_to_static_ptr == not_public_path) + info->path_dst_ptr_to_static_ptr = path_below; + } + else + { + // We've detected an ambiguous cast from (thrown_class_type, adjustedPtr) + // to a static_type + info->number_to_static_ptr += 1; + info->path_dst_ptr_to_static_ptr = not_public_path; + info->search_done = true; + } +} + +void +__class_type_info::has_unambiguous_public_base(__dynamic_cast_info* info, + void* adjustedPtr, + int path_below) const +{ + if (is_equal(this, info->static_type, false)) + process_found_base_class(info, adjustedPtr, path_below); +} + +void +__si_class_type_info::has_unambiguous_public_base(__dynamic_cast_info* info, + void* adjustedPtr, + int path_below) const +{ + if (is_equal(this, info->static_type, false)) + process_found_base_class(info, adjustedPtr, path_below); + else + __base_type->has_unambiguous_public_base(info, adjustedPtr, path_below); +} + +void +__base_class_type_info::has_unambiguous_public_base(__dynamic_cast_info* info, + void* adjustedPtr, + int path_below) const +{ + ptrdiff_t offset_to_base = 0; + if (adjustedPtr != nullptr) + { + offset_to_base = __offset_flags >> __offset_shift; + if (__offset_flags & __virtual_mask) + { + const char* vtable = *static_cast<const char*const*>(adjustedPtr); + offset_to_base = update_offset_to_base(vtable, offset_to_base); + } + } + __base_type->has_unambiguous_public_base( + info, + static_cast<char*>(adjustedPtr) + offset_to_base, + (__offset_flags & __public_mask) ? path_below : not_public_path); +} + +void +__vmi_class_type_info::has_unambiguous_public_base(__dynamic_cast_info* info, + void* adjustedPtr, + int path_below) const +{ + if (is_equal(this, info->static_type, false)) + process_found_base_class(info, adjustedPtr, path_below); + else + { + typedef const __base_class_type_info* Iter; + const Iter e = __base_info + __base_count; + Iter p = __base_info; + p->has_unambiguous_public_base(info, adjustedPtr, path_below); + if (++p < e) + { + do + { + p->has_unambiguous_public_base(info, adjustedPtr, path_below); + if (info->search_done) + break; + } while (++p < e); + } + } +} + +// Handles bullet 1 for both pointers and member pointers +bool +__pbase_type_info::can_catch(const __shim_type_info* thrown_type, + void*&) const +{ + bool use_strcmp = this->__flags & (__incomplete_class_mask | + __incomplete_mask); + if (!use_strcmp) { + const __pbase_type_info* thrown_pbase = dynamic_cast<const __pbase_type_info*>( + thrown_type); + if (!thrown_pbase) return false; + use_strcmp = thrown_pbase->__flags & (__incomplete_class_mask | + __incomplete_mask); + } + return is_equal(this, thrown_type, use_strcmp); +} + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wmissing-field-initializers" +#endif + +// Handles bullets 1, 3 and 4 +// NOTE: It might not be safe to adjust the pointer if it is not not a pointer +// type. Only adjust the pointer after we know it is safe to do so. +bool +__pointer_type_info::can_catch(const __shim_type_info* thrown_type, + void*& adjustedPtr) const +{ + // bullet 4 + if (is_equal(thrown_type, &typeid(std::nullptr_t), false)) { + adjustedPtr = nullptr; + return true; + } + + // bullet 1 + if (__pbase_type_info::can_catch(thrown_type, adjustedPtr)) { + if (adjustedPtr != NULL) + adjustedPtr = *static_cast<void**>(adjustedPtr); + return true; + } + // bullet 3 + const __pointer_type_info* thrown_pointer_type = + dynamic_cast<const __pointer_type_info*>(thrown_type); + if (thrown_pointer_type == 0) + return false; + // Do the dereference adjustment + if (adjustedPtr != NULL) + adjustedPtr = *static_cast<void**>(adjustedPtr); + // bullet 3B and 3C + if (thrown_pointer_type->__flags & ~__flags & __no_remove_flags_mask) + return false; + if (__flags & ~thrown_pointer_type->__flags & __no_add_flags_mask) + return false; + if (is_equal(__pointee, thrown_pointer_type->__pointee, false)) + return true; + // bullet 3A + if (is_equal(__pointee, &typeid(void), false)) { + // pointers to functions cannot be converted to void*. + // pointers to member functions are not handled here. + const __function_type_info* thrown_function = + dynamic_cast<const __function_type_info*>(thrown_pointer_type->__pointee); + return (thrown_function == nullptr); + } + // Handle pointer to pointer + const __pointer_type_info* nested_pointer_type = + dynamic_cast<const __pointer_type_info*>(__pointee); + if (nested_pointer_type) { + if (~__flags & __const_mask) return false; + return nested_pointer_type->can_catch_nested(thrown_pointer_type->__pointee); + } + + // Handle pointer to pointer to member + const __pointer_to_member_type_info* member_ptr_type = + dynamic_cast<const __pointer_to_member_type_info*>(__pointee); + if (member_ptr_type) { + if (~__flags & __const_mask) return false; + return member_ptr_type->can_catch_nested(thrown_pointer_type->__pointee); + } + + // Handle pointer to class type + const __class_type_info* catch_class_type = + dynamic_cast<const __class_type_info*>(__pointee); + if (catch_class_type == 0) + return false; + const __class_type_info* thrown_class_type = + dynamic_cast<const __class_type_info*>(thrown_pointer_type->__pointee); + if (thrown_class_type == 0) + return false; + __dynamic_cast_info info = {thrown_class_type, 0, catch_class_type, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,}; + info.number_of_dst_type = 1; + thrown_class_type->has_unambiguous_public_base(&info, adjustedPtr, public_path); + if (info.path_dst_ptr_to_static_ptr == public_path) + { + if (adjustedPtr != NULL) + adjustedPtr = const_cast<void*>(info.dst_ptr_leading_to_static_ptr); + return true; + } + return false; +} + +bool __pointer_type_info::can_catch_nested( + const __shim_type_info* thrown_type) const +{ + const __pointer_type_info* thrown_pointer_type = + dynamic_cast<const __pointer_type_info*>(thrown_type); + if (thrown_pointer_type == 0) + return false; + // bullet 3B + if (thrown_pointer_type->__flags & ~__flags) + return false; + if (is_equal(__pointee, thrown_pointer_type->__pointee, false)) + return true; + // If the pointed to types differ then the catch type must be const + // qualified. + if (~__flags & __const_mask) + return false; + + // Handle pointer to pointer + const __pointer_type_info* nested_pointer_type = + dynamic_cast<const __pointer_type_info*>(__pointee); + if (nested_pointer_type) { + return nested_pointer_type->can_catch_nested( + thrown_pointer_type->__pointee); + } + + // Handle pointer to pointer to member + const __pointer_to_member_type_info* member_ptr_type = + dynamic_cast<const __pointer_to_member_type_info*>(__pointee); + if (member_ptr_type) { + return member_ptr_type->can_catch_nested(thrown_pointer_type->__pointee); + } + + return false; +} + +bool __pointer_to_member_type_info::can_catch( + const __shim_type_info* thrown_type, void*& adjustedPtr) const { + // bullet 4 + if (is_equal(thrown_type, &typeid(std::nullptr_t), false)) { + // We assume that the pointer to member representation is the same for + // all pointers to data members and for all pointers to member functions. + struct X {}; + if (dynamic_cast<const __function_type_info*>(__pointee)) { + static int (X::*const null_ptr_rep)() = nullptr; + adjustedPtr = const_cast<int (X::**)()>(&null_ptr_rep); + } else { + static int X::*const null_ptr_rep = nullptr; + adjustedPtr = const_cast<int X::**>(&null_ptr_rep); + } + return true; + } + + // bullet 1 + if (__pbase_type_info::can_catch(thrown_type, adjustedPtr)) + return true; + + const __pointer_to_member_type_info* thrown_pointer_type = + dynamic_cast<const __pointer_to_member_type_info*>(thrown_type); + if (thrown_pointer_type == 0) + return false; + if (thrown_pointer_type->__flags & ~__flags & __no_remove_flags_mask) + return false; + if (__flags & ~thrown_pointer_type->__flags & __no_add_flags_mask) + return false; + if (!is_equal(__pointee, thrown_pointer_type->__pointee, false)) + return false; + if (is_equal(__context, thrown_pointer_type->__context, false)) + return true; + + // [except.handle] does not allow the pointer-to-member conversions mentioned + // in [mem.conv] to take place. For this reason we don't check Derived->Base + // for Derived->Base conversions. + + return false; +} + +bool __pointer_to_member_type_info::can_catch_nested( + const __shim_type_info* thrown_type) const +{ + const __pointer_to_member_type_info* thrown_member_ptr_type = + dynamic_cast<const __pointer_to_member_type_info*>(thrown_type); + if (thrown_member_ptr_type == 0) + return false; + if (~__flags & thrown_member_ptr_type->__flags) + return false; + if (!is_equal(__pointee, thrown_member_ptr_type->__pointee, false)) + return false; + if (!is_equal(__context, thrown_member_ptr_type->__context, false)) + return false; + return true; +} + +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wmissing-field-initializers" +#endif + +// __dynamic_cast + +// static_ptr: pointer to an object of type static_type; nonnull, and since the +// object is polymorphic, *(void**)static_ptr is a virtual table pointer. +// static_ptr is &v in the expression dynamic_cast<T>(v). +// static_type: static type of the object pointed to by static_ptr. +// dst_type: destination type of the cast (the "T" in "dynamic_cast<T>(v)"). +// src2dst_offset: a static hint about the location of the +// source subobject with respect to the complete object; +// special negative values are: +// -1: no hint +// -2: static_type is not a public base of dst_type +// -3: static_type is a multiple public base type but never a +// virtual base type +// otherwise, the static_type type is a unique public nonvirtual +// base type of dst_type at offset src2dst_offset from the +// origin of dst_type. +// +// (dynamic_ptr, dynamic_type) are the run time type of the complete object +// referred to by static_ptr and a pointer to it. These can be found from +// static_ptr for polymorphic types. +// static_type is guaranteed to be a polymorphic type. +// +// (dynamic_ptr, dynamic_type) is the root of a DAG that grows upward. Each +// node of the tree represents a base class/object of its parent (or parents) below. +// Each node is uniquely represented by a pointer to the object, and a pointer +// to a type_info - its type. Different nodes may have the same pointer and +// different nodes may have the same type. But only one node has a specific +// (pointer-value, type) pair. In C++ two objects of the same type can not +// share the same address. +// +// There are two flavors of nodes which have the type dst_type: +// 1. Those that are derived from (below) (static_ptr, static_type). +// 2. Those that are not derived from (below) (static_ptr, static_type). +// +// Invariants of the DAG: +// +// There is at least one path from the root (dynamic_ptr, dynamic_type) to +// the node (static_ptr, static_type). This path may or may not be public. +// There may be more than one such path (some public some not). Such a path may +// or may not go through a node having type dst_type. +// +// No node of type T appears above a node of the same type. That means that +// there is only one node with dynamic_type. And if dynamic_type == dst_type, +// then there is only one dst_type in the DAG. +// +// No node of type dst_type appears above a node of type static_type. Such +// DAG's are possible in C++, but the compiler computes those dynamic_casts at +// compile time, and only calls __dynamic_cast when dst_type lies below +// static_type in the DAG. +// +// dst_type != static_type: The compiler computes the dynamic_cast in this case too. +// dynamic_type != static_type: The compiler computes the dynamic_cast in this case too. +// +// Returns: +// +// If there is exactly one dst_type of flavor 1, and +// If there is a public path from that dst_type to (static_ptr, static_type), or +// If there are 0 dst_types of flavor 2, and there is a public path from +// (dynamic_ptr, dynamic_type) to (static_ptr, static_type) and a public +// path from (dynamic_ptr, dynamic_type) to the one dst_type, then return +// a pointer to that dst_type. +// Else if there are 0 dst_types of flavor 1 and exactly 1 dst_type of flavor 2, and +// if there is a public path from (dynamic_ptr, dynamic_type) to +// (static_ptr, static_type) and a public path from (dynamic_ptr, dynamic_type) +// to the one dst_type, then return a pointer to that one dst_type. +// Else return nullptr. +// +// If dynamic_type == dst_type, then the above algorithm collapses to the +// following cheaper algorithm: +// +// If there is a public path from (dynamic_ptr, dynamic_type) to +// (static_ptr, static_type), then return dynamic_ptr. +// Else return nullptr. + +extern "C" _LIBCXXABI_FUNC_VIS void * +__dynamic_cast(const void *static_ptr, const __class_type_info *static_type, + const __class_type_info *dst_type, + std::ptrdiff_t src2dst_offset) { + // Possible future optimization: Take advantage of src2dst_offset + + // Get (dynamic_ptr, dynamic_type) from static_ptr +#if __has_feature(cxx_abi_relative_vtable) + // The vtable address will point to the first virtual function, which is 8 + // bytes after the start of the vtable (4 for the offset from top + 4 for the typeinfo component). + const int32_t* vtable = + *reinterpret_cast<const int32_t* const*>(static_ptr); + int32_t offset_to_derived = vtable[-2]; + const void* dynamic_ptr = static_cast<const char*>(static_ptr) + offset_to_derived; + + // The typeinfo component is now a relative offset to a proxy. + int32_t offset_to_ti_proxy = vtable[-1]; + const uint8_t* ptr_to_ti_proxy = + reinterpret_cast<const uint8_t*>(vtable) + offset_to_ti_proxy; + const __class_type_info* dynamic_type = + *(reinterpret_cast<const __class_type_info* const*>(ptr_to_ti_proxy)); +#else + void **vtable = *static_cast<void ** const *>(static_ptr); + ptrdiff_t offset_to_derived = reinterpret_cast<ptrdiff_t>(vtable[-2]); + const void* dynamic_ptr = static_cast<const char*>(static_ptr) + offset_to_derived; + const __class_type_info* dynamic_type = static_cast<const __class_type_info*>(vtable[-1]); +#endif + + // Initialize answer to nullptr. This will be changed from the search + // results if a non-null answer is found. Regardless, this is what will + // be returned. + const void* dst_ptr = 0; + // Initialize info struct for this search. + __dynamic_cast_info info = {dst_type, static_ptr, static_type, src2dst_offset, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,}; + + // Find out if we can use a giant short cut in the search + if (is_equal(dynamic_type, dst_type, false)) + { + // Using giant short cut. Add that information to info. + info.number_of_dst_type = 1; + // Do the search + dynamic_type->search_above_dst(&info, dynamic_ptr, dynamic_ptr, public_path, false); +#ifdef _LIBCXXABI_FORGIVING_DYNAMIC_CAST + // The following if should always be false because we should definitely + // find (static_ptr, static_type), either on a public or private path + if (info.path_dst_ptr_to_static_ptr == unknown) + { + // We get here only if there is some kind of visibility problem + // in client code. + static_assert(std::atomic<size_t>::is_always_lock_free, ""); + static std::atomic<size_t> error_count(0); + size_t error_count_snapshot = error_count.fetch_add(1, std::memory_order_relaxed); + if ((error_count_snapshot & (error_count_snapshot-1)) == 0) + syslog(LOG_ERR, "dynamic_cast error 1: Both of the following type_info's " + "should have public visibility. At least one of them is hidden. %s" + ", %s.\n", static_type->name(), dynamic_type->name()); + // Redo the search comparing type_info's using strcmp + info = {dst_type, static_ptr, static_type, src2dst_offset, 0}; + info.number_of_dst_type = 1; + dynamic_type->search_above_dst(&info, dynamic_ptr, dynamic_ptr, public_path, true); + } #endif // _LIBCXXABI_FORGIVING_DYNAMIC_CAST - // Query the search. - if (info.path_dst_ptr_to_static_ptr == public_path) - dst_ptr = dynamic_ptr; - } - else - { - // Not using giant short cut. Do the search - dynamic_type->search_below_dst(&info, dynamic_ptr, public_path, false); - #ifdef _LIBCXXABI_FORGIVING_DYNAMIC_CAST - // The following if should always be false because we should definitely - // find (static_ptr, static_type), either on a public or private path - if (info.path_dst_ptr_to_static_ptr == unknown && - info.path_dynamic_ptr_to_static_ptr == unknown) - { - static_assert(std::atomic<size_t>::is_always_lock_free, ""); - static std::atomic<size_t> error_count(0); - size_t error_count_snapshot = error_count.fetch_add(1, std::memory_order_relaxed); - if ((error_count_snapshot & (error_count_snapshot-1)) == 0) - syslog(LOG_ERR, "dynamic_cast error 2: One or more of the following type_info's " - "has hidden visibility or is defined in more than one translation " - "unit. They should all have public visibility. " - "%s, %s, %s.\n", static_type->name(), dynamic_type->name(), - dst_type->name()); - // Redo the search comparing type_info's using strcmp - info = {dst_type, static_ptr, static_type, src2dst_offset, 0}; - dynamic_type->search_below_dst(&info, dynamic_ptr, public_path, true); - } + // Query the search. + if (info.path_dst_ptr_to_static_ptr == public_path) + dst_ptr = dynamic_ptr; + } + else + { + // Not using giant short cut. Do the search + dynamic_type->search_below_dst(&info, dynamic_ptr, public_path, false); + #ifdef _LIBCXXABI_FORGIVING_DYNAMIC_CAST + // The following if should always be false because we should definitely + // find (static_ptr, static_type), either on a public or private path + if (info.path_dst_ptr_to_static_ptr == unknown && + info.path_dynamic_ptr_to_static_ptr == unknown) + { + static_assert(std::atomic<size_t>::is_always_lock_free, ""); + static std::atomic<size_t> error_count(0); + size_t error_count_snapshot = error_count.fetch_add(1, std::memory_order_relaxed); + if ((error_count_snapshot & (error_count_snapshot-1)) == 0) + syslog(LOG_ERR, "dynamic_cast error 2: One or more of the following type_info's " + "has hidden visibility or is defined in more than one translation " + "unit. They should all have public visibility. " + "%s, %s, %s.\n", static_type->name(), dynamic_type->name(), + dst_type->name()); + // Redo the search comparing type_info's using strcmp + info = {dst_type, static_ptr, static_type, src2dst_offset, 0}; + dynamic_type->search_below_dst(&info, dynamic_ptr, public_path, true); + } #endif // _LIBCXXABI_FORGIVING_DYNAMIC_CAST - // Query the search. - switch (info.number_to_static_ptr) - { - case 0: - if (info.number_to_dst_ptr == 1 && - info.path_dynamic_ptr_to_static_ptr == public_path && - info.path_dynamic_ptr_to_dst_ptr == public_path) - dst_ptr = info.dst_ptr_not_leading_to_static_ptr; - break; - case 1: - if (info.path_dst_ptr_to_static_ptr == public_path || - ( - info.number_to_dst_ptr == 0 && - info.path_dynamic_ptr_to_static_ptr == public_path && - info.path_dynamic_ptr_to_dst_ptr == public_path - ) - ) - dst_ptr = info.dst_ptr_leading_to_static_ptr; - break; - } - } - return const_cast<void*>(dst_ptr); -} - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - -// Call this function when you hit a static_type which is a base (above) a dst_type. -// Let caller know you hit a static_type. But only start recording details if -// this is (static_ptr, static_type) -- the node we are casting from. -// If this is (static_ptr, static_type) -// Record the path (public or not) from the dst_type to here. There may be -// multiple paths from the same dst_type to here, record the "most public" one. -// Record the dst_ptr as pointing to (static_ptr, static_type). -// If more than one (dst_ptr, dst_type) points to (static_ptr, static_type), -// then mark this dyanmic_cast as ambiguous and stop the search. -void -__class_type_info::process_static_type_above_dst(__dynamic_cast_info* info, - const void* dst_ptr, - const void* current_ptr, - int path_below) const -{ - // Record that we found a static_type - info->found_any_static_type = true; - if (current_ptr == info->static_ptr) - { - // Record that we found (static_ptr, static_type) - info->found_our_static_ptr = true; - if (info->dst_ptr_leading_to_static_ptr == 0) - { - // First time here - info->dst_ptr_leading_to_static_ptr = dst_ptr; - info->path_dst_ptr_to_static_ptr = path_below; - info->number_to_static_ptr = 1; - // If there is only one dst_type in the entire tree and the path from - // there to here is public then we are done! - if (info->number_of_dst_type == 1 && info->path_dst_ptr_to_static_ptr == public_path) - info->search_done = true; - } - else if (info->dst_ptr_leading_to_static_ptr == dst_ptr) - { - // We've been here before. Update path to "most public" - if (info->path_dst_ptr_to_static_ptr == not_public_path) - info->path_dst_ptr_to_static_ptr = path_below; - // If there is only one dst_type in the entire tree and the path from - // there to here is public then we are done! - if (info->number_of_dst_type == 1 && info->path_dst_ptr_to_static_ptr == public_path) - info->search_done = true; - } - else - { - // We've detected an ambiguous cast from (static_ptr, static_type) - // to a dst_type - info->number_to_static_ptr += 1; - info->search_done = true; - } - } -} - -// Call this function when you hit a static_type which is not a base (above) a dst_type. -// If this is (static_ptr, static_type) -// Record the path (public or not) from (dynamic_ptr, dynamic_type) to here. There may be -// multiple paths from (dynamic_ptr, dynamic_type) to here, record the "most public" one. -void -__class_type_info::process_static_type_below_dst(__dynamic_cast_info* info, - const void* current_ptr, - int path_below) const -{ - if (current_ptr == info->static_ptr) - { - // Record the most public path from (dynamic_ptr, dynamic_type) to - // (static_ptr, static_type) - if (info->path_dynamic_ptr_to_static_ptr != public_path) - info->path_dynamic_ptr_to_static_ptr = path_below; - } -} - -// Call this function when searching below a dst_type node. This function searches -// for a path to (static_ptr, static_type) and for paths to one or more dst_type nodes. -// If it finds a static_type node, there is no need to further search base classes -// above. -// If it finds a dst_type node it should search base classes using search_above_dst -// to find out if this dst_type points to (static_ptr, static_type) or not. -// Either way, the dst_type is recorded as one of two "flavors": one that does -// or does not point to (static_ptr, static_type). -// If this is neither a static_type nor a dst_type node, continue searching -// base classes above. -// All the hoopla surrounding the search code is doing nothing but looking for -// excuses to stop the search prematurely (break out of the for-loop). That is, -// the algorithm below is simply an optimization of this: -// void -// __vmi_class_type_info::search_below_dst(__dynamic_cast_info* info, -// const void* current_ptr, -// int path_below) const -// { -// typedef const __base_class_type_info* Iter; -// if (this == info->static_type) -// process_static_type_below_dst(info, current_ptr, path_below); -// else if (this == info->dst_type) -// { -// // Record the most public access path that got us here -// if (info->path_dynamic_ptr_to_dst_ptr != public_path) -// info->path_dynamic_ptr_to_dst_ptr = path_below; -// bool does_dst_type_point_to_our_static_type = false; -// for (Iter p = __base_info, e= __base_info + __base_count; p < e; ++p) -// { -// p->search_above_dst(info, current_ptr, current_ptr, public_path); -// if (info->found_our_static_ptr) -// does_dst_type_point_to_our_static_type = true; -// // break out early here if you can detect it doesn't matter if you do -// } -// if (!does_dst_type_point_to_our_static_type) -// { -// // We found a dst_type that doesn't point to (static_ptr, static_type) -// // So record the address of this dst_ptr and increment the -// // count of the number of such dst_types found in the tree. -// info->dst_ptr_not_leading_to_static_ptr = current_ptr; -// info->number_to_dst_ptr += 1; -// } -// } -// else -// { -// // This is not a static_type and not a dst_type. -// for (Iter p = __base_info, e = __base_info + __base_count; p < e; ++p) -// { -// p->search_below_dst(info, current_ptr, public_path); -// // break out early here if you can detect it doesn't matter if you do -// } -// } -// } -void -__vmi_class_type_info::search_below_dst(__dynamic_cast_info* info, - const void* current_ptr, - int path_below, - bool use_strcmp) const -{ - typedef const __base_class_type_info* Iter; - if (is_equal(this, info->static_type, use_strcmp)) - process_static_type_below_dst(info, current_ptr, path_below); - else if (is_equal(this, info->dst_type, use_strcmp)) - { - // We've been here before if we've recorded current_ptr in one of these - // two places: - if (current_ptr == info->dst_ptr_leading_to_static_ptr || - current_ptr == info->dst_ptr_not_leading_to_static_ptr) - { - // We've seen this node before, and therefore have already searched - // its base classes above. - // Update path to here that is "most public". - if (path_below == public_path) - info->path_dynamic_ptr_to_dst_ptr = public_path; - } - else // We have haven't been here before - { - // Record the access path that got us here - // If there is more than one dst_type this path doesn't matter. - info->path_dynamic_ptr_to_dst_ptr = path_below; - bool does_dst_type_point_to_our_static_type = false; - // Only search above here if dst_type derives from static_type, or - // if it is unknown if dst_type derives from static_type. - if (info->is_dst_type_derived_from_static_type != no) - { - // Set up flags to record results from all base classes - bool is_dst_type_derived_from_static_type = false; - - // We've found a dst_type with a potentially public path to here. - // We have to assume the path is public because it may become - // public later (if we get back to here with a public path). - // We can stop looking above if: - // 1. We've found a public path to (static_ptr, static_type). - // 2. We've found an ambiguous cast from (static_ptr, static_type) to a dst_type. - // This is detected at the (static_ptr, static_type). - // 3. We can prove that there is no public path to (static_ptr, static_type) - // above here. - const Iter e = __base_info + __base_count; - for (Iter p = __base_info; p < e; ++p) - { - // Zero out found flags - info->found_our_static_ptr = false; - info->found_any_static_type = false; - p->search_above_dst(info, current_ptr, current_ptr, public_path, use_strcmp); - if (info->search_done) - break; - if (info->found_any_static_type) - { - is_dst_type_derived_from_static_type = true; - if (info->found_our_static_ptr) - { - does_dst_type_point_to_our_static_type = true; - // If we found what we're looking for, stop looking above. - if (info->path_dst_ptr_to_static_ptr == public_path) - break; - // We found a private path to (static_ptr, static_type) - // If there is no diamond then there is only one path - // to (static_ptr, static_type) and we just found it. - if (!(__flags & __diamond_shaped_mask)) - break; - } - else - { - // If we found a static_type that isn't the one we're looking - // for, and if there are no repeated types above here, - // then stop looking. - if (!(__flags & __non_diamond_repeat_mask)) - break; - } - } - } - // If we found no static_type,s then dst_type doesn't derive - // from static_type, else it does. Record this result so that - // next time we hit a dst_type we will know not to search above - // it if it doesn't derive from static_type. - if (is_dst_type_derived_from_static_type) - info->is_dst_type_derived_from_static_type = yes; - else - info->is_dst_type_derived_from_static_type = no; - } - if (!does_dst_type_point_to_our_static_type) - { - // We found a dst_type that doesn't point to (static_ptr, static_type) - // So record the address of this dst_ptr and increment the - // count of the number of such dst_types found in the tree. - info->dst_ptr_not_leading_to_static_ptr = current_ptr; - info->number_to_dst_ptr += 1; - // If there exists another dst with a private path to - // (static_ptr, static_type), then the cast from - // (dynamic_ptr, dynamic_type) to dst_type is now ambiguous, - // so stop search. - if (info->number_to_static_ptr == 1 && - info->path_dst_ptr_to_static_ptr == not_public_path) - info->search_done = true; - } - } - } - else - { - // This is not a static_type and not a dst_type. - const Iter e = __base_info + __base_count; - Iter p = __base_info; - p->search_below_dst(info, current_ptr, path_below, use_strcmp); - if (++p < e) - { - if ((__flags & __diamond_shaped_mask) || info->number_to_static_ptr == 1) - { - // If there are multiple paths to a base above from here, or if - // a dst_type pointing to (static_ptr, static_type) has been found, - // then there is no way to break out of this loop early unless - // something below detects the search is done. - do - { - if (info->search_done) - break; - p->search_below_dst(info, current_ptr, path_below, use_strcmp); - } while (++p < e); - } - else if (__flags & __non_diamond_repeat_mask) - { - // There are not multiple paths to any base class from here and a - // dst_type pointing to (static_ptr, static_type) has not yet been - // found. - do - { - if (info->search_done) - break; - // If we just found a dst_type with a public path to (static_ptr, static_type), - // then the only reason to continue the search is to make sure - // no other dst_type points to (static_ptr, static_type). - // If !diamond, then we don't need to search here. - if (info->number_to_static_ptr == 1 && - info->path_dst_ptr_to_static_ptr == public_path) - break; - p->search_below_dst(info, current_ptr, path_below, use_strcmp); - } while (++p < e); - } - else - { - // There are no repeated types above this node. - // There are no nodes with multiple parents above this node. - // no dst_type has been found to (static_ptr, static_type) - do - { - if (info->search_done) - break; - // If we just found a dst_type with a public path to (static_ptr, static_type), - // then the only reason to continue the search is to make sure sure - // no other dst_type points to (static_ptr, static_type). - // If !diamond, then we don't need to search here. - // if we just found a dst_type with a private path to (static_ptr, static_type), - // then we're only looking for a public path to (static_ptr, static_type) - // and to check for other dst_types. - // If !diamond & !repeat, then there is not a pointer to (static_ptr, static_type) - // and not a dst_type under here. - if (info->number_to_static_ptr == 1) - break; - p->search_below_dst(info, current_ptr, path_below, use_strcmp); - } while (++p < e); - } - } - } -} - -// This is the same algorithm as __vmi_class_type_info::search_below_dst but -// simplified to the case that there is only a single base class. -void -__si_class_type_info::search_below_dst(__dynamic_cast_info* info, - const void* current_ptr, - int path_below, - bool use_strcmp) const -{ - if (is_equal(this, info->static_type, use_strcmp)) - process_static_type_below_dst(info, current_ptr, path_below); - else if (is_equal(this, info->dst_type, use_strcmp)) - { - // We've been here before if we've recorded current_ptr in one of these - // two places: - if (current_ptr == info->dst_ptr_leading_to_static_ptr || - current_ptr == info->dst_ptr_not_leading_to_static_ptr) - { - // We've seen this node before, and therefore have already searched - // its base classes above. - // Update path to here that is "most public". - if (path_below == public_path) - info->path_dynamic_ptr_to_dst_ptr = public_path; - } - else // We have haven't been here before - { - // Record the access path that got us here - // If there is more than one dst_type this path doesn't matter. - info->path_dynamic_ptr_to_dst_ptr = path_below; - bool does_dst_type_point_to_our_static_type = false; - // Only search above here if dst_type derives from static_type, or - // if it is unknown if dst_type derives from static_type. - if (info->is_dst_type_derived_from_static_type != no) - { - // Set up flags to record results from all base classes - bool is_dst_type_derived_from_static_type = false; - // Zero out found flags - info->found_our_static_ptr = false; - info->found_any_static_type = false; - __base_type->search_above_dst(info, current_ptr, current_ptr, public_path, use_strcmp); - if (info->found_any_static_type) - { - is_dst_type_derived_from_static_type = true; - if (info->found_our_static_ptr) - does_dst_type_point_to_our_static_type = true; - } - // If we found no static_type,s then dst_type doesn't derive - // from static_type, else it does. Record this result so that - // next time we hit a dst_type we will know not to search above - // it if it doesn't derive from static_type. - if (is_dst_type_derived_from_static_type) - info->is_dst_type_derived_from_static_type = yes; - else - info->is_dst_type_derived_from_static_type = no; - } - if (!does_dst_type_point_to_our_static_type) - { - // We found a dst_type that doesn't point to (static_ptr, static_type) - // So record the address of this dst_ptr and increment the - // count of the number of such dst_types found in the tree. - info->dst_ptr_not_leading_to_static_ptr = current_ptr; - info->number_to_dst_ptr += 1; - // If there exists another dst with a private path to - // (static_ptr, static_type), then the cast from - // (dynamic_ptr, dynamic_type) to dst_type is now ambiguous. - if (info->number_to_static_ptr == 1 && - info->path_dst_ptr_to_static_ptr == not_public_path) - info->search_done = true; - } - } - } - else - { - // This is not a static_type and not a dst_type - __base_type->search_below_dst(info, current_ptr, path_below, use_strcmp); - } -} - -// This is the same algorithm as __vmi_class_type_info::search_below_dst but -// simplified to the case that there is no base class. -void -__class_type_info::search_below_dst(__dynamic_cast_info* info, - const void* current_ptr, - int path_below, - bool use_strcmp) const -{ - if (is_equal(this, info->static_type, use_strcmp)) - process_static_type_below_dst(info, current_ptr, path_below); - else if (is_equal(this, info->dst_type, use_strcmp)) - { - // We've been here before if we've recorded current_ptr in one of these - // two places: - if (current_ptr == info->dst_ptr_leading_to_static_ptr || - current_ptr == info->dst_ptr_not_leading_to_static_ptr) - { - // We've seen this node before, and therefore have already searched - // its base classes above. - // Update path to here that is "most public". - if (path_below == public_path) - info->path_dynamic_ptr_to_dst_ptr = public_path; - } - else // We have haven't been here before - { - // Record the access path that got us here - // If there is more than one dst_type this path doesn't matter. - info->path_dynamic_ptr_to_dst_ptr = path_below; - // We found a dst_type that doesn't point to (static_ptr, static_type) - // So record the address of this dst_ptr and increment the - // count of the number of such dst_types found in the tree. - info->dst_ptr_not_leading_to_static_ptr = current_ptr; - info->number_to_dst_ptr += 1; - // If there exists another dst with a private path to - // (static_ptr, static_type), then the cast from - // (dynamic_ptr, dynamic_type) to dst_type is now ambiguous. - if (info->number_to_static_ptr == 1 && - info->path_dst_ptr_to_static_ptr == not_public_path) - info->search_done = true; - // We found that dst_type does not derive from static_type - info->is_dst_type_derived_from_static_type = no; - } - } -} - -// Call this function when searching above a dst_type node. This function searches -// for a public path to (static_ptr, static_type). -// This function is guaranteed not to find a node of type dst_type. -// Theoretically this is a very simple function which just stops if it finds a -// static_type node: All the hoopla surrounding the search code is doing -// nothing but looking for excuses to stop the search prematurely (break out of -// the for-loop). That is, the algorithm below is simply an optimization of this: -// void -// __vmi_class_type_info::search_above_dst(__dynamic_cast_info* info, -// const void* dst_ptr, -// const void* current_ptr, -// int path_below) const -// { -// if (this == info->static_type) -// process_static_type_above_dst(info, dst_ptr, current_ptr, path_below); -// else -// { -// typedef const __base_class_type_info* Iter; -// // This is not a static_type and not a dst_type -// for (Iter p = __base_info, e = __base_info + __base_count; p < e; ++p) -// { -// p->search_above_dst(info, dst_ptr, current_ptr, public_path); -// // break out early here if you can detect it doesn't matter if you do -// } -// } -// } -void -__vmi_class_type_info::search_above_dst(__dynamic_cast_info* info, - const void* dst_ptr, - const void* current_ptr, - int path_below, - bool use_strcmp) const -{ - if (is_equal(this, info->static_type, use_strcmp)) - process_static_type_above_dst(info, dst_ptr, current_ptr, path_below); - else - { - typedef const __base_class_type_info* Iter; - // This is not a static_type and not a dst_type - // Save flags so they can be restored when returning to nodes below. - bool found_our_static_ptr = info->found_our_static_ptr; - bool found_any_static_type = info->found_any_static_type; - // We've found a dst_type below with a path to here. If the path - // to here is not public, there may be another path to here that - // is public. So we have to assume that the path to here is public. - // We can stop looking above if: - // 1. We've found a public path to (static_ptr, static_type). - // 2. We've found an ambiguous cast from (static_ptr, static_type) to a dst_type. - // This is detected at the (static_ptr, static_type). - // 3. We can prove that there is no public path to (static_ptr, static_type) - // above here. - const Iter e = __base_info + __base_count; - Iter p = __base_info; - // Zero out found flags - info->found_our_static_ptr = false; - info->found_any_static_type = false; - p->search_above_dst(info, dst_ptr, current_ptr, path_below, use_strcmp); - found_our_static_ptr |= info->found_our_static_ptr; - found_any_static_type |= info->found_any_static_type; - if (++p < e) - { - do - { - if (info->search_done) - break; - if (info->found_our_static_ptr) - { - // If we found what we're looking for, stop looking above. - if (info->path_dst_ptr_to_static_ptr == public_path) - break; - // We found a private path to (static_ptr, static_type) - // If there is no diamond then there is only one path - // to (static_ptr, static_type) from here and we just found it. - if (!(__flags & __diamond_shaped_mask)) - break; - } - else if (info->found_any_static_type) - { - // If we found a static_type that isn't the one we're looking - // for, and if there are no repeated types above here, - // then stop looking. - if (!(__flags & __non_diamond_repeat_mask)) - break; - } - // Zero out found flags - info->found_our_static_ptr = false; - info->found_any_static_type = false; - p->search_above_dst(info, dst_ptr, current_ptr, path_below, use_strcmp); - found_our_static_ptr |= info->found_our_static_ptr; - found_any_static_type |= info->found_any_static_type; - } while (++p < e); - } - // Restore flags - info->found_our_static_ptr = found_our_static_ptr; - info->found_any_static_type = found_any_static_type; - } -} - -// This is the same algorithm as __vmi_class_type_info::search_above_dst but -// simplified to the case that there is only a single base class. -void -__si_class_type_info::search_above_dst(__dynamic_cast_info* info, - const void* dst_ptr, - const void* current_ptr, - int path_below, - bool use_strcmp) const -{ - if (is_equal(this, info->static_type, use_strcmp)) - process_static_type_above_dst(info, dst_ptr, current_ptr, path_below); - else - __base_type->search_above_dst(info, dst_ptr, current_ptr, path_below, use_strcmp); -} - -// This is the same algorithm as __vmi_class_type_info::search_above_dst but -// simplified to the case that there is no base class. -void -__class_type_info::search_above_dst(__dynamic_cast_info* info, - const void* dst_ptr, - const void* current_ptr, - int path_below, - bool use_strcmp) const -{ - if (is_equal(this, info->static_type, use_strcmp)) - process_static_type_above_dst(info, dst_ptr, current_ptr, path_below); -} - -// The search functions for __base_class_type_info are simply convenience -// functions for adjusting the current_ptr and path_below as the search is -// passed up to the base class node. - -void -__base_class_type_info::search_above_dst(__dynamic_cast_info* info, - const void* dst_ptr, - const void* current_ptr, - int path_below, - bool use_strcmp) const -{ - ptrdiff_t offset_to_base = __offset_flags >> __offset_shift; - if (__offset_flags & __virtual_mask) - { - const char* vtable = *static_cast<const char*const*>(current_ptr); - offset_to_base = update_offset_to_base(vtable, offset_to_base); - } - __base_type->search_above_dst(info, dst_ptr, - static_cast<const char*>(current_ptr) + offset_to_base, - (__offset_flags & __public_mask) ? - path_below : - not_public_path, - use_strcmp); -} - -void -__base_class_type_info::search_below_dst(__dynamic_cast_info* info, - const void* current_ptr, - int path_below, - bool use_strcmp) const -{ - ptrdiff_t offset_to_base = __offset_flags >> __offset_shift; - if (__offset_flags & __virtual_mask) - { - const char* vtable = *static_cast<const char*const*>(current_ptr); - offset_to_base = update_offset_to_base(vtable, offset_to_base); - } - __base_type->search_below_dst(info, - static_cast<const char*>(current_ptr) + offset_to_base, - (__offset_flags & __public_mask) ? - path_below : - not_public_path, - use_strcmp); -} - -} // __cxxabiv1 + // Query the search. + switch (info.number_to_static_ptr) + { + case 0: + if (info.number_to_dst_ptr == 1 && + info.path_dynamic_ptr_to_static_ptr == public_path && + info.path_dynamic_ptr_to_dst_ptr == public_path) + dst_ptr = info.dst_ptr_not_leading_to_static_ptr; + break; + case 1: + if (info.path_dst_ptr_to_static_ptr == public_path || + ( + info.number_to_dst_ptr == 0 && + info.path_dynamic_ptr_to_static_ptr == public_path && + info.path_dynamic_ptr_to_dst_ptr == public_path + ) + ) + dst_ptr = info.dst_ptr_leading_to_static_ptr; + break; + } + } + return const_cast<void*>(dst_ptr); +} + +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + +// Call this function when you hit a static_type which is a base (above) a dst_type. +// Let caller know you hit a static_type. But only start recording details if +// this is (static_ptr, static_type) -- the node we are casting from. +// If this is (static_ptr, static_type) +// Record the path (public or not) from the dst_type to here. There may be +// multiple paths from the same dst_type to here, record the "most public" one. +// Record the dst_ptr as pointing to (static_ptr, static_type). +// If more than one (dst_ptr, dst_type) points to (static_ptr, static_type), +// then mark this dyanmic_cast as ambiguous and stop the search. +void +__class_type_info::process_static_type_above_dst(__dynamic_cast_info* info, + const void* dst_ptr, + const void* current_ptr, + int path_below) const +{ + // Record that we found a static_type + info->found_any_static_type = true; + if (current_ptr == info->static_ptr) + { + // Record that we found (static_ptr, static_type) + info->found_our_static_ptr = true; + if (info->dst_ptr_leading_to_static_ptr == 0) + { + // First time here + info->dst_ptr_leading_to_static_ptr = dst_ptr; + info->path_dst_ptr_to_static_ptr = path_below; + info->number_to_static_ptr = 1; + // If there is only one dst_type in the entire tree and the path from + // there to here is public then we are done! + if (info->number_of_dst_type == 1 && info->path_dst_ptr_to_static_ptr == public_path) + info->search_done = true; + } + else if (info->dst_ptr_leading_to_static_ptr == dst_ptr) + { + // We've been here before. Update path to "most public" + if (info->path_dst_ptr_to_static_ptr == not_public_path) + info->path_dst_ptr_to_static_ptr = path_below; + // If there is only one dst_type in the entire tree and the path from + // there to here is public then we are done! + if (info->number_of_dst_type == 1 && info->path_dst_ptr_to_static_ptr == public_path) + info->search_done = true; + } + else + { + // We've detected an ambiguous cast from (static_ptr, static_type) + // to a dst_type + info->number_to_static_ptr += 1; + info->search_done = true; + } + } +} + +// Call this function when you hit a static_type which is not a base (above) a dst_type. +// If this is (static_ptr, static_type) +// Record the path (public or not) from (dynamic_ptr, dynamic_type) to here. There may be +// multiple paths from (dynamic_ptr, dynamic_type) to here, record the "most public" one. +void +__class_type_info::process_static_type_below_dst(__dynamic_cast_info* info, + const void* current_ptr, + int path_below) const +{ + if (current_ptr == info->static_ptr) + { + // Record the most public path from (dynamic_ptr, dynamic_type) to + // (static_ptr, static_type) + if (info->path_dynamic_ptr_to_static_ptr != public_path) + info->path_dynamic_ptr_to_static_ptr = path_below; + } +} + +// Call this function when searching below a dst_type node. This function searches +// for a path to (static_ptr, static_type) and for paths to one or more dst_type nodes. +// If it finds a static_type node, there is no need to further search base classes +// above. +// If it finds a dst_type node it should search base classes using search_above_dst +// to find out if this dst_type points to (static_ptr, static_type) or not. +// Either way, the dst_type is recorded as one of two "flavors": one that does +// or does not point to (static_ptr, static_type). +// If this is neither a static_type nor a dst_type node, continue searching +// base classes above. +// All the hoopla surrounding the search code is doing nothing but looking for +// excuses to stop the search prematurely (break out of the for-loop). That is, +// the algorithm below is simply an optimization of this: +// void +// __vmi_class_type_info::search_below_dst(__dynamic_cast_info* info, +// const void* current_ptr, +// int path_below) const +// { +// typedef const __base_class_type_info* Iter; +// if (this == info->static_type) +// process_static_type_below_dst(info, current_ptr, path_below); +// else if (this == info->dst_type) +// { +// // Record the most public access path that got us here +// if (info->path_dynamic_ptr_to_dst_ptr != public_path) +// info->path_dynamic_ptr_to_dst_ptr = path_below; +// bool does_dst_type_point_to_our_static_type = false; +// for (Iter p = __base_info, e= __base_info + __base_count; p < e; ++p) +// { +// p->search_above_dst(info, current_ptr, current_ptr, public_path); +// if (info->found_our_static_ptr) +// does_dst_type_point_to_our_static_type = true; +// // break out early here if you can detect it doesn't matter if you do +// } +// if (!does_dst_type_point_to_our_static_type) +// { +// // We found a dst_type that doesn't point to (static_ptr, static_type) +// // So record the address of this dst_ptr and increment the +// // count of the number of such dst_types found in the tree. +// info->dst_ptr_not_leading_to_static_ptr = current_ptr; +// info->number_to_dst_ptr += 1; +// } +// } +// else +// { +// // This is not a static_type and not a dst_type. +// for (Iter p = __base_info, e = __base_info + __base_count; p < e; ++p) +// { +// p->search_below_dst(info, current_ptr, public_path); +// // break out early here if you can detect it doesn't matter if you do +// } +// } +// } +void +__vmi_class_type_info::search_below_dst(__dynamic_cast_info* info, + const void* current_ptr, + int path_below, + bool use_strcmp) const +{ + typedef const __base_class_type_info* Iter; + if (is_equal(this, info->static_type, use_strcmp)) + process_static_type_below_dst(info, current_ptr, path_below); + else if (is_equal(this, info->dst_type, use_strcmp)) + { + // We've been here before if we've recorded current_ptr in one of these + // two places: + if (current_ptr == info->dst_ptr_leading_to_static_ptr || + current_ptr == info->dst_ptr_not_leading_to_static_ptr) + { + // We've seen this node before, and therefore have already searched + // its base classes above. + // Update path to here that is "most public". + if (path_below == public_path) + info->path_dynamic_ptr_to_dst_ptr = public_path; + } + else // We have haven't been here before + { + // Record the access path that got us here + // If there is more than one dst_type this path doesn't matter. + info->path_dynamic_ptr_to_dst_ptr = path_below; + bool does_dst_type_point_to_our_static_type = false; + // Only search above here if dst_type derives from static_type, or + // if it is unknown if dst_type derives from static_type. + if (info->is_dst_type_derived_from_static_type != no) + { + // Set up flags to record results from all base classes + bool is_dst_type_derived_from_static_type = false; + + // We've found a dst_type with a potentially public path to here. + // We have to assume the path is public because it may become + // public later (if we get back to here with a public path). + // We can stop looking above if: + // 1. We've found a public path to (static_ptr, static_type). + // 2. We've found an ambiguous cast from (static_ptr, static_type) to a dst_type. + // This is detected at the (static_ptr, static_type). + // 3. We can prove that there is no public path to (static_ptr, static_type) + // above here. + const Iter e = __base_info + __base_count; + for (Iter p = __base_info; p < e; ++p) + { + // Zero out found flags + info->found_our_static_ptr = false; + info->found_any_static_type = false; + p->search_above_dst(info, current_ptr, current_ptr, public_path, use_strcmp); + if (info->search_done) + break; + if (info->found_any_static_type) + { + is_dst_type_derived_from_static_type = true; + if (info->found_our_static_ptr) + { + does_dst_type_point_to_our_static_type = true; + // If we found what we're looking for, stop looking above. + if (info->path_dst_ptr_to_static_ptr == public_path) + break; + // We found a private path to (static_ptr, static_type) + // If there is no diamond then there is only one path + // to (static_ptr, static_type) and we just found it. + if (!(__flags & __diamond_shaped_mask)) + break; + } + else + { + // If we found a static_type that isn't the one we're looking + // for, and if there are no repeated types above here, + // then stop looking. + if (!(__flags & __non_diamond_repeat_mask)) + break; + } + } + } + // If we found no static_type,s then dst_type doesn't derive + // from static_type, else it does. Record this result so that + // next time we hit a dst_type we will know not to search above + // it if it doesn't derive from static_type. + if (is_dst_type_derived_from_static_type) + info->is_dst_type_derived_from_static_type = yes; + else + info->is_dst_type_derived_from_static_type = no; + } + if (!does_dst_type_point_to_our_static_type) + { + // We found a dst_type that doesn't point to (static_ptr, static_type) + // So record the address of this dst_ptr and increment the + // count of the number of such dst_types found in the tree. + info->dst_ptr_not_leading_to_static_ptr = current_ptr; + info->number_to_dst_ptr += 1; + // If there exists another dst with a private path to + // (static_ptr, static_type), then the cast from + // (dynamic_ptr, dynamic_type) to dst_type is now ambiguous, + // so stop search. + if (info->number_to_static_ptr == 1 && + info->path_dst_ptr_to_static_ptr == not_public_path) + info->search_done = true; + } + } + } + else + { + // This is not a static_type and not a dst_type. + const Iter e = __base_info + __base_count; + Iter p = __base_info; + p->search_below_dst(info, current_ptr, path_below, use_strcmp); + if (++p < e) + { + if ((__flags & __diamond_shaped_mask) || info->number_to_static_ptr == 1) + { + // If there are multiple paths to a base above from here, or if + // a dst_type pointing to (static_ptr, static_type) has been found, + // then there is no way to break out of this loop early unless + // something below detects the search is done. + do + { + if (info->search_done) + break; + p->search_below_dst(info, current_ptr, path_below, use_strcmp); + } while (++p < e); + } + else if (__flags & __non_diamond_repeat_mask) + { + // There are not multiple paths to any base class from here and a + // dst_type pointing to (static_ptr, static_type) has not yet been + // found. + do + { + if (info->search_done) + break; + // If we just found a dst_type with a public path to (static_ptr, static_type), + // then the only reason to continue the search is to make sure + // no other dst_type points to (static_ptr, static_type). + // If !diamond, then we don't need to search here. + if (info->number_to_static_ptr == 1 && + info->path_dst_ptr_to_static_ptr == public_path) + break; + p->search_below_dst(info, current_ptr, path_below, use_strcmp); + } while (++p < e); + } + else + { + // There are no repeated types above this node. + // There are no nodes with multiple parents above this node. + // no dst_type has been found to (static_ptr, static_type) + do + { + if (info->search_done) + break; + // If we just found a dst_type with a public path to (static_ptr, static_type), + // then the only reason to continue the search is to make sure sure + // no other dst_type points to (static_ptr, static_type). + // If !diamond, then we don't need to search here. + // if we just found a dst_type with a private path to (static_ptr, static_type), + // then we're only looking for a public path to (static_ptr, static_type) + // and to check for other dst_types. + // If !diamond & !repeat, then there is not a pointer to (static_ptr, static_type) + // and not a dst_type under here. + if (info->number_to_static_ptr == 1) + break; + p->search_below_dst(info, current_ptr, path_below, use_strcmp); + } while (++p < e); + } + } + } +} + +// This is the same algorithm as __vmi_class_type_info::search_below_dst but +// simplified to the case that there is only a single base class. +void +__si_class_type_info::search_below_dst(__dynamic_cast_info* info, + const void* current_ptr, + int path_below, + bool use_strcmp) const +{ + if (is_equal(this, info->static_type, use_strcmp)) + process_static_type_below_dst(info, current_ptr, path_below); + else if (is_equal(this, info->dst_type, use_strcmp)) + { + // We've been here before if we've recorded current_ptr in one of these + // two places: + if (current_ptr == info->dst_ptr_leading_to_static_ptr || + current_ptr == info->dst_ptr_not_leading_to_static_ptr) + { + // We've seen this node before, and therefore have already searched + // its base classes above. + // Update path to here that is "most public". + if (path_below == public_path) + info->path_dynamic_ptr_to_dst_ptr = public_path; + } + else // We have haven't been here before + { + // Record the access path that got us here + // If there is more than one dst_type this path doesn't matter. + info->path_dynamic_ptr_to_dst_ptr = path_below; + bool does_dst_type_point_to_our_static_type = false; + // Only search above here if dst_type derives from static_type, or + // if it is unknown if dst_type derives from static_type. + if (info->is_dst_type_derived_from_static_type != no) + { + // Set up flags to record results from all base classes + bool is_dst_type_derived_from_static_type = false; + // Zero out found flags + info->found_our_static_ptr = false; + info->found_any_static_type = false; + __base_type->search_above_dst(info, current_ptr, current_ptr, public_path, use_strcmp); + if (info->found_any_static_type) + { + is_dst_type_derived_from_static_type = true; + if (info->found_our_static_ptr) + does_dst_type_point_to_our_static_type = true; + } + // If we found no static_type,s then dst_type doesn't derive + // from static_type, else it does. Record this result so that + // next time we hit a dst_type we will know not to search above + // it if it doesn't derive from static_type. + if (is_dst_type_derived_from_static_type) + info->is_dst_type_derived_from_static_type = yes; + else + info->is_dst_type_derived_from_static_type = no; + } + if (!does_dst_type_point_to_our_static_type) + { + // We found a dst_type that doesn't point to (static_ptr, static_type) + // So record the address of this dst_ptr and increment the + // count of the number of such dst_types found in the tree. + info->dst_ptr_not_leading_to_static_ptr = current_ptr; + info->number_to_dst_ptr += 1; + // If there exists another dst with a private path to + // (static_ptr, static_type), then the cast from + // (dynamic_ptr, dynamic_type) to dst_type is now ambiguous. + if (info->number_to_static_ptr == 1 && + info->path_dst_ptr_to_static_ptr == not_public_path) + info->search_done = true; + } + } + } + else + { + // This is not a static_type and not a dst_type + __base_type->search_below_dst(info, current_ptr, path_below, use_strcmp); + } +} + +// This is the same algorithm as __vmi_class_type_info::search_below_dst but +// simplified to the case that there is no base class. +void +__class_type_info::search_below_dst(__dynamic_cast_info* info, + const void* current_ptr, + int path_below, + bool use_strcmp) const +{ + if (is_equal(this, info->static_type, use_strcmp)) + process_static_type_below_dst(info, current_ptr, path_below); + else if (is_equal(this, info->dst_type, use_strcmp)) + { + // We've been here before if we've recorded current_ptr in one of these + // two places: + if (current_ptr == info->dst_ptr_leading_to_static_ptr || + current_ptr == info->dst_ptr_not_leading_to_static_ptr) + { + // We've seen this node before, and therefore have already searched + // its base classes above. + // Update path to here that is "most public". + if (path_below == public_path) + info->path_dynamic_ptr_to_dst_ptr = public_path; + } + else // We have haven't been here before + { + // Record the access path that got us here + // If there is more than one dst_type this path doesn't matter. + info->path_dynamic_ptr_to_dst_ptr = path_below; + // We found a dst_type that doesn't point to (static_ptr, static_type) + // So record the address of this dst_ptr and increment the + // count of the number of such dst_types found in the tree. + info->dst_ptr_not_leading_to_static_ptr = current_ptr; + info->number_to_dst_ptr += 1; + // If there exists another dst with a private path to + // (static_ptr, static_type), then the cast from + // (dynamic_ptr, dynamic_type) to dst_type is now ambiguous. + if (info->number_to_static_ptr == 1 && + info->path_dst_ptr_to_static_ptr == not_public_path) + info->search_done = true; + // We found that dst_type does not derive from static_type + info->is_dst_type_derived_from_static_type = no; + } + } +} + +// Call this function when searching above a dst_type node. This function searches +// for a public path to (static_ptr, static_type). +// This function is guaranteed not to find a node of type dst_type. +// Theoretically this is a very simple function which just stops if it finds a +// static_type node: All the hoopla surrounding the search code is doing +// nothing but looking for excuses to stop the search prematurely (break out of +// the for-loop). That is, the algorithm below is simply an optimization of this: +// void +// __vmi_class_type_info::search_above_dst(__dynamic_cast_info* info, +// const void* dst_ptr, +// const void* current_ptr, +// int path_below) const +// { +// if (this == info->static_type) +// process_static_type_above_dst(info, dst_ptr, current_ptr, path_below); +// else +// { +// typedef const __base_class_type_info* Iter; +// // This is not a static_type and not a dst_type +// for (Iter p = __base_info, e = __base_info + __base_count; p < e; ++p) +// { +// p->search_above_dst(info, dst_ptr, current_ptr, public_path); +// // break out early here if you can detect it doesn't matter if you do +// } +// } +// } +void +__vmi_class_type_info::search_above_dst(__dynamic_cast_info* info, + const void* dst_ptr, + const void* current_ptr, + int path_below, + bool use_strcmp) const +{ + if (is_equal(this, info->static_type, use_strcmp)) + process_static_type_above_dst(info, dst_ptr, current_ptr, path_below); + else + { + typedef const __base_class_type_info* Iter; + // This is not a static_type and not a dst_type + // Save flags so they can be restored when returning to nodes below. + bool found_our_static_ptr = info->found_our_static_ptr; + bool found_any_static_type = info->found_any_static_type; + // We've found a dst_type below with a path to here. If the path + // to here is not public, there may be another path to here that + // is public. So we have to assume that the path to here is public. + // We can stop looking above if: + // 1. We've found a public path to (static_ptr, static_type). + // 2. We've found an ambiguous cast from (static_ptr, static_type) to a dst_type. + // This is detected at the (static_ptr, static_type). + // 3. We can prove that there is no public path to (static_ptr, static_type) + // above here. + const Iter e = __base_info + __base_count; + Iter p = __base_info; + // Zero out found flags + info->found_our_static_ptr = false; + info->found_any_static_type = false; + p->search_above_dst(info, dst_ptr, current_ptr, path_below, use_strcmp); + found_our_static_ptr |= info->found_our_static_ptr; + found_any_static_type |= info->found_any_static_type; + if (++p < e) + { + do + { + if (info->search_done) + break; + if (info->found_our_static_ptr) + { + // If we found what we're looking for, stop looking above. + if (info->path_dst_ptr_to_static_ptr == public_path) + break; + // We found a private path to (static_ptr, static_type) + // If there is no diamond then there is only one path + // to (static_ptr, static_type) from here and we just found it. + if (!(__flags & __diamond_shaped_mask)) + break; + } + else if (info->found_any_static_type) + { + // If we found a static_type that isn't the one we're looking + // for, and if there are no repeated types above here, + // then stop looking. + if (!(__flags & __non_diamond_repeat_mask)) + break; + } + // Zero out found flags + info->found_our_static_ptr = false; + info->found_any_static_type = false; + p->search_above_dst(info, dst_ptr, current_ptr, path_below, use_strcmp); + found_our_static_ptr |= info->found_our_static_ptr; + found_any_static_type |= info->found_any_static_type; + } while (++p < e); + } + // Restore flags + info->found_our_static_ptr = found_our_static_ptr; + info->found_any_static_type = found_any_static_type; + } +} + +// This is the same algorithm as __vmi_class_type_info::search_above_dst but +// simplified to the case that there is only a single base class. +void +__si_class_type_info::search_above_dst(__dynamic_cast_info* info, + const void* dst_ptr, + const void* current_ptr, + int path_below, + bool use_strcmp) const +{ + if (is_equal(this, info->static_type, use_strcmp)) + process_static_type_above_dst(info, dst_ptr, current_ptr, path_below); + else + __base_type->search_above_dst(info, dst_ptr, current_ptr, path_below, use_strcmp); +} + +// This is the same algorithm as __vmi_class_type_info::search_above_dst but +// simplified to the case that there is no base class. +void +__class_type_info::search_above_dst(__dynamic_cast_info* info, + const void* dst_ptr, + const void* current_ptr, + int path_below, + bool use_strcmp) const +{ + if (is_equal(this, info->static_type, use_strcmp)) + process_static_type_above_dst(info, dst_ptr, current_ptr, path_below); +} + +// The search functions for __base_class_type_info are simply convenience +// functions for adjusting the current_ptr and path_below as the search is +// passed up to the base class node. + +void +__base_class_type_info::search_above_dst(__dynamic_cast_info* info, + const void* dst_ptr, + const void* current_ptr, + int path_below, + bool use_strcmp) const +{ + ptrdiff_t offset_to_base = __offset_flags >> __offset_shift; + if (__offset_flags & __virtual_mask) + { + const char* vtable = *static_cast<const char*const*>(current_ptr); + offset_to_base = update_offset_to_base(vtable, offset_to_base); + } + __base_type->search_above_dst(info, dst_ptr, + static_cast<const char*>(current_ptr) + offset_to_base, + (__offset_flags & __public_mask) ? + path_below : + not_public_path, + use_strcmp); +} + +void +__base_class_type_info::search_below_dst(__dynamic_cast_info* info, + const void* current_ptr, + int path_below, + bool use_strcmp) const +{ + ptrdiff_t offset_to_base = __offset_flags >> __offset_shift; + if (__offset_flags & __virtual_mask) + { + const char* vtable = *static_cast<const char*const*>(current_ptr); + offset_to_base = update_offset_to_base(vtable, offset_to_base); + } + __base_type->search_below_dst(info, + static_cast<const char*>(current_ptr) + offset_to_base, + (__offset_flags & __public_mask) ? + path_below : + not_public_path, + use_strcmp); +} + +} // __cxxabiv1 diff --git a/contrib/libs/cxxsupp/libcxxabi/src/private_typeinfo.h b/contrib/libs/cxxsupp/libcxxabi/src/private_typeinfo.h index 622e09cc24..f2ad902876 100644 --- a/contrib/libs/cxxsupp/libcxxabi/src/private_typeinfo.h +++ b/contrib/libs/cxxsupp/libcxxabi/src/private_typeinfo.h @@ -1,251 +1,251 @@ //===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#ifndef __PRIVATE_TYPEINFO_H_ -#define __PRIVATE_TYPEINFO_H_ - -#include "__cxxabi_config.h" - -#include <typeinfo> -#include <stddef.h> - -namespace __cxxabiv1 { - -class _LIBCXXABI_TYPE_VIS __shim_type_info : public std::type_info { -public: - _LIBCXXABI_HIDDEN virtual ~__shim_type_info(); - - _LIBCXXABI_HIDDEN virtual void noop1() const; - _LIBCXXABI_HIDDEN virtual void noop2() const; - _LIBCXXABI_HIDDEN virtual bool can_catch(const __shim_type_info *thrown_type, - void *&adjustedPtr) const = 0; -}; - -class _LIBCXXABI_TYPE_VIS __fundamental_type_info : public __shim_type_info { -public: - _LIBCXXABI_HIDDEN virtual ~__fundamental_type_info(); - _LIBCXXABI_HIDDEN virtual bool can_catch(const __shim_type_info *, - void *&) const; -}; - -class _LIBCXXABI_TYPE_VIS __array_type_info : public __shim_type_info { -public: - _LIBCXXABI_HIDDEN virtual ~__array_type_info(); - _LIBCXXABI_HIDDEN virtual bool can_catch(const __shim_type_info *, - void *&) const; -}; - -class _LIBCXXABI_TYPE_VIS __function_type_info : public __shim_type_info { -public: - _LIBCXXABI_HIDDEN virtual ~__function_type_info(); - _LIBCXXABI_HIDDEN virtual bool can_catch(const __shim_type_info *, - void *&) const; -}; - -class _LIBCXXABI_TYPE_VIS __enum_type_info : public __shim_type_info { -public: - _LIBCXXABI_HIDDEN virtual ~__enum_type_info(); - _LIBCXXABI_HIDDEN virtual bool can_catch(const __shim_type_info *, - void *&) const; -}; - -enum -{ - unknown = 0, - public_path, - not_public_path, - yes, - no -}; - -class _LIBCXXABI_TYPE_VIS __class_type_info; - -struct _LIBCXXABI_HIDDEN __dynamic_cast_info -{ -// const data supplied to the search: - - const __class_type_info* dst_type; - const void* static_ptr; - const __class_type_info* static_type; - ptrdiff_t src2dst_offset; - -// Data that represents the answer: - - // pointer to a dst_type which has (static_ptr, static_type) above it - const void* dst_ptr_leading_to_static_ptr; - // pointer to a dst_type which does not have (static_ptr, static_type) above it - const void* dst_ptr_not_leading_to_static_ptr; - - // The following three paths are either unknown, public_path or not_public_path. - // access of path from dst_ptr_leading_to_static_ptr to (static_ptr, static_type) - int path_dst_ptr_to_static_ptr; - // access of path from (dynamic_ptr, dynamic_type) to (static_ptr, static_type) - // when there is no dst_type along the path - int path_dynamic_ptr_to_static_ptr; - // access of path from (dynamic_ptr, dynamic_type) to dst_type - // (not used if there is a (static_ptr, static_type) above a dst_type). - int path_dynamic_ptr_to_dst_ptr; - - // Number of dst_types below (static_ptr, static_type) - int number_to_static_ptr; - // Number of dst_types not below (static_ptr, static_type) - int number_to_dst_ptr; - -// Data that helps stop the search before the entire tree is searched: - - // is_dst_type_derived_from_static_type is either unknown, yes or no. - int is_dst_type_derived_from_static_type; - // Number of dst_type in tree. If 0, then that means unknown. - int number_of_dst_type; - // communicates to a dst_type node that (static_ptr, static_type) was found - // above it. - bool found_our_static_ptr; - // communicates to a dst_type node that a static_type was found - // above it, but it wasn't (static_ptr, static_type) - bool found_any_static_type; - // Set whenever a search can be stopped - bool search_done; -}; - -// Has no base class -class _LIBCXXABI_TYPE_VIS __class_type_info : public __shim_type_info { -public: - _LIBCXXABI_HIDDEN virtual ~__class_type_info(); - - _LIBCXXABI_HIDDEN void process_static_type_above_dst(__dynamic_cast_info *, - const void *, - const void *, int) const; - _LIBCXXABI_HIDDEN void process_static_type_below_dst(__dynamic_cast_info *, - const void *, int) const; - _LIBCXXABI_HIDDEN void process_found_base_class(__dynamic_cast_info *, void *, - int) const; - _LIBCXXABI_HIDDEN virtual void search_above_dst(__dynamic_cast_info *, - const void *, const void *, - int, bool) const; - _LIBCXXABI_HIDDEN virtual void - search_below_dst(__dynamic_cast_info *, const void *, int, bool) const; - _LIBCXXABI_HIDDEN virtual bool can_catch(const __shim_type_info *, - void *&) const; - _LIBCXXABI_HIDDEN virtual void - has_unambiguous_public_base(__dynamic_cast_info *, void *, int) const; -}; - -// Has one non-virtual public base class at offset zero -class _LIBCXXABI_TYPE_VIS __si_class_type_info : public __class_type_info { -public: - const __class_type_info *__base_type; - - _LIBCXXABI_HIDDEN virtual ~__si_class_type_info(); - - _LIBCXXABI_HIDDEN virtual void search_above_dst(__dynamic_cast_info *, - const void *, const void *, - int, bool) const; - _LIBCXXABI_HIDDEN virtual void - search_below_dst(__dynamic_cast_info *, const void *, int, bool) const; - _LIBCXXABI_HIDDEN virtual void - has_unambiguous_public_base(__dynamic_cast_info *, void *, int) const; -}; - -struct _LIBCXXABI_HIDDEN __base_class_type_info -{ -public: - const __class_type_info* __base_type; - long __offset_flags; - - enum __offset_flags_masks - { - __virtual_mask = 0x1, - __public_mask = 0x2, // base is public - __offset_shift = 8 - }; - - void search_above_dst(__dynamic_cast_info*, const void*, const void*, int, bool) const; - void search_below_dst(__dynamic_cast_info*, const void*, int, bool) const; - void has_unambiguous_public_base(__dynamic_cast_info*, void*, int) const; -}; - -// Has one or more base classes -class _LIBCXXABI_TYPE_VIS __vmi_class_type_info : public __class_type_info { -public: - unsigned int __flags; - unsigned int __base_count; - __base_class_type_info __base_info[1]; - - enum __flags_masks { - __non_diamond_repeat_mask = 0x1, // has two or more distinct base class - // objects of the same type - __diamond_shaped_mask = 0x2 // has base class object with two or - // more derived objects - }; - - _LIBCXXABI_HIDDEN virtual ~__vmi_class_type_info(); - - _LIBCXXABI_HIDDEN virtual void search_above_dst(__dynamic_cast_info *, - const void *, const void *, - int, bool) const; - _LIBCXXABI_HIDDEN virtual void - search_below_dst(__dynamic_cast_info *, const void *, int, bool) const; - _LIBCXXABI_HIDDEN virtual void - has_unambiguous_public_base(__dynamic_cast_info *, void *, int) const; -}; - -class _LIBCXXABI_TYPE_VIS __pbase_type_info : public __shim_type_info { -public: - unsigned int __flags; - const __shim_type_info *__pointee; - - enum __masks { - __const_mask = 0x1, - __volatile_mask = 0x2, - __restrict_mask = 0x4, - __incomplete_mask = 0x8, - __incomplete_class_mask = 0x10, - __transaction_safe_mask = 0x20, - // This implements the following proposal from cxx-abi-dev (not yet part of - // the ABI document): - // - // http://sourcerytools.com/pipermail/cxx-abi-dev/2016-October/002986.html - // - // This is necessary for support of http://wg21.link/p0012, which permits - // throwing noexcept function and member function pointers and catching - // them as non-noexcept pointers. - __noexcept_mask = 0x40, - - // Flags that cannot be removed by a standard conversion. - __no_remove_flags_mask = __const_mask | __volatile_mask | __restrict_mask, - // Flags that cannot be added by a standard conversion. - __no_add_flags_mask = __transaction_safe_mask | __noexcept_mask - }; - - _LIBCXXABI_HIDDEN virtual ~__pbase_type_info(); - _LIBCXXABI_HIDDEN virtual bool can_catch(const __shim_type_info *, - void *&) const; -}; - -class _LIBCXXABI_TYPE_VIS __pointer_type_info : public __pbase_type_info { -public: - _LIBCXXABI_HIDDEN virtual ~__pointer_type_info(); - _LIBCXXABI_HIDDEN virtual bool can_catch(const __shim_type_info *, - void *&) const; - _LIBCXXABI_HIDDEN bool can_catch_nested(const __shim_type_info *) const; -}; - -class _LIBCXXABI_TYPE_VIS __pointer_to_member_type_info - : public __pbase_type_info { -public: - const __class_type_info *__context; - - _LIBCXXABI_HIDDEN virtual ~__pointer_to_member_type_info(); - _LIBCXXABI_HIDDEN virtual bool can_catch(const __shim_type_info *, - void *&) const; - _LIBCXXABI_HIDDEN bool can_catch_nested(const __shim_type_info *) const; -}; - -} // __cxxabiv1 - +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef __PRIVATE_TYPEINFO_H_ +#define __PRIVATE_TYPEINFO_H_ + +#include "__cxxabi_config.h" + +#include <typeinfo> +#include <stddef.h> + +namespace __cxxabiv1 { + +class _LIBCXXABI_TYPE_VIS __shim_type_info : public std::type_info { +public: + _LIBCXXABI_HIDDEN virtual ~__shim_type_info(); + + _LIBCXXABI_HIDDEN virtual void noop1() const; + _LIBCXXABI_HIDDEN virtual void noop2() const; + _LIBCXXABI_HIDDEN virtual bool can_catch(const __shim_type_info *thrown_type, + void *&adjustedPtr) const = 0; +}; + +class _LIBCXXABI_TYPE_VIS __fundamental_type_info : public __shim_type_info { +public: + _LIBCXXABI_HIDDEN virtual ~__fundamental_type_info(); + _LIBCXXABI_HIDDEN virtual bool can_catch(const __shim_type_info *, + void *&) const; +}; + +class _LIBCXXABI_TYPE_VIS __array_type_info : public __shim_type_info { +public: + _LIBCXXABI_HIDDEN virtual ~__array_type_info(); + _LIBCXXABI_HIDDEN virtual bool can_catch(const __shim_type_info *, + void *&) const; +}; + +class _LIBCXXABI_TYPE_VIS __function_type_info : public __shim_type_info { +public: + _LIBCXXABI_HIDDEN virtual ~__function_type_info(); + _LIBCXXABI_HIDDEN virtual bool can_catch(const __shim_type_info *, + void *&) const; +}; + +class _LIBCXXABI_TYPE_VIS __enum_type_info : public __shim_type_info { +public: + _LIBCXXABI_HIDDEN virtual ~__enum_type_info(); + _LIBCXXABI_HIDDEN virtual bool can_catch(const __shim_type_info *, + void *&) const; +}; + +enum +{ + unknown = 0, + public_path, + not_public_path, + yes, + no +}; + +class _LIBCXXABI_TYPE_VIS __class_type_info; + +struct _LIBCXXABI_HIDDEN __dynamic_cast_info +{ +// const data supplied to the search: + + const __class_type_info* dst_type; + const void* static_ptr; + const __class_type_info* static_type; + ptrdiff_t src2dst_offset; + +// Data that represents the answer: + + // pointer to a dst_type which has (static_ptr, static_type) above it + const void* dst_ptr_leading_to_static_ptr; + // pointer to a dst_type which does not have (static_ptr, static_type) above it + const void* dst_ptr_not_leading_to_static_ptr; + + // The following three paths are either unknown, public_path or not_public_path. + // access of path from dst_ptr_leading_to_static_ptr to (static_ptr, static_type) + int path_dst_ptr_to_static_ptr; + // access of path from (dynamic_ptr, dynamic_type) to (static_ptr, static_type) + // when there is no dst_type along the path + int path_dynamic_ptr_to_static_ptr; + // access of path from (dynamic_ptr, dynamic_type) to dst_type + // (not used if there is a (static_ptr, static_type) above a dst_type). + int path_dynamic_ptr_to_dst_ptr; + + // Number of dst_types below (static_ptr, static_type) + int number_to_static_ptr; + // Number of dst_types not below (static_ptr, static_type) + int number_to_dst_ptr; + +// Data that helps stop the search before the entire tree is searched: + + // is_dst_type_derived_from_static_type is either unknown, yes or no. + int is_dst_type_derived_from_static_type; + // Number of dst_type in tree. If 0, then that means unknown. + int number_of_dst_type; + // communicates to a dst_type node that (static_ptr, static_type) was found + // above it. + bool found_our_static_ptr; + // communicates to a dst_type node that a static_type was found + // above it, but it wasn't (static_ptr, static_type) + bool found_any_static_type; + // Set whenever a search can be stopped + bool search_done; +}; + +// Has no base class +class _LIBCXXABI_TYPE_VIS __class_type_info : public __shim_type_info { +public: + _LIBCXXABI_HIDDEN virtual ~__class_type_info(); + + _LIBCXXABI_HIDDEN void process_static_type_above_dst(__dynamic_cast_info *, + const void *, + const void *, int) const; + _LIBCXXABI_HIDDEN void process_static_type_below_dst(__dynamic_cast_info *, + const void *, int) const; + _LIBCXXABI_HIDDEN void process_found_base_class(__dynamic_cast_info *, void *, + int) const; + _LIBCXXABI_HIDDEN virtual void search_above_dst(__dynamic_cast_info *, + const void *, const void *, + int, bool) const; + _LIBCXXABI_HIDDEN virtual void + search_below_dst(__dynamic_cast_info *, const void *, int, bool) const; + _LIBCXXABI_HIDDEN virtual bool can_catch(const __shim_type_info *, + void *&) const; + _LIBCXXABI_HIDDEN virtual void + has_unambiguous_public_base(__dynamic_cast_info *, void *, int) const; +}; + +// Has one non-virtual public base class at offset zero +class _LIBCXXABI_TYPE_VIS __si_class_type_info : public __class_type_info { +public: + const __class_type_info *__base_type; + + _LIBCXXABI_HIDDEN virtual ~__si_class_type_info(); + + _LIBCXXABI_HIDDEN virtual void search_above_dst(__dynamic_cast_info *, + const void *, const void *, + int, bool) const; + _LIBCXXABI_HIDDEN virtual void + search_below_dst(__dynamic_cast_info *, const void *, int, bool) const; + _LIBCXXABI_HIDDEN virtual void + has_unambiguous_public_base(__dynamic_cast_info *, void *, int) const; +}; + +struct _LIBCXXABI_HIDDEN __base_class_type_info +{ +public: + const __class_type_info* __base_type; + long __offset_flags; + + enum __offset_flags_masks + { + __virtual_mask = 0x1, + __public_mask = 0x2, // base is public + __offset_shift = 8 + }; + + void search_above_dst(__dynamic_cast_info*, const void*, const void*, int, bool) const; + void search_below_dst(__dynamic_cast_info*, const void*, int, bool) const; + void has_unambiguous_public_base(__dynamic_cast_info*, void*, int) const; +}; + +// Has one or more base classes +class _LIBCXXABI_TYPE_VIS __vmi_class_type_info : public __class_type_info { +public: + unsigned int __flags; + unsigned int __base_count; + __base_class_type_info __base_info[1]; + + enum __flags_masks { + __non_diamond_repeat_mask = 0x1, // has two or more distinct base class + // objects of the same type + __diamond_shaped_mask = 0x2 // has base class object with two or + // more derived objects + }; + + _LIBCXXABI_HIDDEN virtual ~__vmi_class_type_info(); + + _LIBCXXABI_HIDDEN virtual void search_above_dst(__dynamic_cast_info *, + const void *, const void *, + int, bool) const; + _LIBCXXABI_HIDDEN virtual void + search_below_dst(__dynamic_cast_info *, const void *, int, bool) const; + _LIBCXXABI_HIDDEN virtual void + has_unambiguous_public_base(__dynamic_cast_info *, void *, int) const; +}; + +class _LIBCXXABI_TYPE_VIS __pbase_type_info : public __shim_type_info { +public: + unsigned int __flags; + const __shim_type_info *__pointee; + + enum __masks { + __const_mask = 0x1, + __volatile_mask = 0x2, + __restrict_mask = 0x4, + __incomplete_mask = 0x8, + __incomplete_class_mask = 0x10, + __transaction_safe_mask = 0x20, + // This implements the following proposal from cxx-abi-dev (not yet part of + // the ABI document): + // + // http://sourcerytools.com/pipermail/cxx-abi-dev/2016-October/002986.html + // + // This is necessary for support of http://wg21.link/p0012, which permits + // throwing noexcept function and member function pointers and catching + // them as non-noexcept pointers. + __noexcept_mask = 0x40, + + // Flags that cannot be removed by a standard conversion. + __no_remove_flags_mask = __const_mask | __volatile_mask | __restrict_mask, + // Flags that cannot be added by a standard conversion. + __no_add_flags_mask = __transaction_safe_mask | __noexcept_mask + }; + + _LIBCXXABI_HIDDEN virtual ~__pbase_type_info(); + _LIBCXXABI_HIDDEN virtual bool can_catch(const __shim_type_info *, + void *&) const; +}; + +class _LIBCXXABI_TYPE_VIS __pointer_type_info : public __pbase_type_info { +public: + _LIBCXXABI_HIDDEN virtual ~__pointer_type_info(); + _LIBCXXABI_HIDDEN virtual bool can_catch(const __shim_type_info *, + void *&) const; + _LIBCXXABI_HIDDEN bool can_catch_nested(const __shim_type_info *) const; +}; + +class _LIBCXXABI_TYPE_VIS __pointer_to_member_type_info + : public __pbase_type_info { +public: + const __class_type_info *__context; + + _LIBCXXABI_HIDDEN virtual ~__pointer_to_member_type_info(); + _LIBCXXABI_HIDDEN virtual bool can_catch(const __shim_type_info *, + void *&) const; + _LIBCXXABI_HIDDEN bool can_catch_nested(const __shim_type_info *) const; +}; + +} // __cxxabiv1 + #endif // __PRIVATE_TYPEINFO_H_ diff --git a/contrib/libs/cxxsupp/libcxxabi/src/stdlib_exception.cpp b/contrib/libs/cxxsupp/libcxxabi/src/stdlib_exception.cpp index b1fc21f412..e7a2c9eab9 100644 --- a/contrib/libs/cxxsupp/libcxxabi/src/stdlib_exception.cpp +++ b/contrib/libs/cxxsupp/libcxxabi/src/stdlib_exception.cpp @@ -1,70 +1,70 @@ //===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#include <new> -#include <exception> - -namespace std -{ - -// exception - +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include <new> +#include <exception> + +namespace std +{ + +// exception + exception::~exception() noexcept -{ -} - +{ +} + const char* exception::what() const noexcept -{ - return "std::exception"; -} - -// bad_exception - +{ + return "std::exception"; +} + +// bad_exception + bad_exception::~bad_exception() noexcept -{ -} - +{ +} + const char* bad_exception::what() const noexcept -{ - return "std::bad_exception"; -} - - -// bad_alloc - +{ + return "std::bad_exception"; +} + + +// bad_alloc + bad_alloc::bad_alloc() noexcept -{ -} - +{ +} + bad_alloc::~bad_alloc() noexcept -{ -} - -const char* +{ +} + +const char* bad_alloc::what() const noexcept -{ - return "std::bad_alloc"; -} - -// bad_array_new_length - +{ + return "std::bad_alloc"; +} + +// bad_array_new_length + bad_array_new_length::bad_array_new_length() noexcept -{ -} - +{ +} + bad_array_new_length::~bad_array_new_length() noexcept -{ -} - -const char* +{ +} + +const char* bad_array_new_length::what() const noexcept -{ - return "bad_array_new_length"; -} - -} // std +{ + return "bad_array_new_length"; +} + +} // std diff --git a/contrib/libs/cxxsupp/libcxxabi/src/stdlib_new_delete.cpp b/contrib/libs/cxxsupp/libcxxabi/src/stdlib_new_delete.cpp index 4a664e15a5..344d0cff84 100644 --- a/contrib/libs/cxxsupp/libcxxabi/src/stdlib_new_delete.cpp +++ b/contrib/libs/cxxsupp/libcxxabi/src/stdlib_new_delete.cpp @@ -1,255 +1,255 @@ //===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// -// This file implements the new and delete operators. -//===----------------------------------------------------------------------===// - -#include "__cxxabi_config.h" -#include <new> -#include <cstdlib> - +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// +// This file implements the new and delete operators. +//===----------------------------------------------------------------------===// + +#include "__cxxabi_config.h" +#include <new> +#include <cstdlib> + #if !defined(_THROW_BAD_ALLOC) || !defined(_LIBCXXABI_WEAK) #error The _THROW_BAD_ALLOC and _LIBCXXABI_WEAK libc++ macros must \ - already be defined by libc++. -#endif -// Implement all new and delete operators as weak definitions -// in this shared library, so that they can be overridden by programs -// that define non-weak copies of the functions. - -_LIBCXXABI_WEAK -void * -operator new(std::size_t size) _THROW_BAD_ALLOC -{ - if (size == 0) - size = 1; - void* p; - while ((p = ::malloc(size)) == nullptr) - { - // If malloc fails and there is a new_handler, - // call it to try free up memory. - std::new_handler nh = std::get_new_handler(); - if (nh) - nh(); - else -#ifndef _LIBCXXABI_NO_EXCEPTIONS - throw std::bad_alloc(); -#else - break; -#endif - } - return p; -} - -_LIBCXXABI_WEAK -void* + already be defined by libc++. +#endif +// Implement all new and delete operators as weak definitions +// in this shared library, so that they can be overridden by programs +// that define non-weak copies of the functions. + +_LIBCXXABI_WEAK +void * +operator new(std::size_t size) _THROW_BAD_ALLOC +{ + if (size == 0) + size = 1; + void* p; + while ((p = ::malloc(size)) == nullptr) + { + // If malloc fails and there is a new_handler, + // call it to try free up memory. + std::new_handler nh = std::get_new_handler(); + if (nh) + nh(); + else +#ifndef _LIBCXXABI_NO_EXCEPTIONS + throw std::bad_alloc(); +#else + break; +#endif + } + return p; +} + +_LIBCXXABI_WEAK +void* operator new(size_t size, const std::nothrow_t&) noexcept -{ - void* p = nullptr; -#ifndef _LIBCXXABI_NO_EXCEPTIONS - try - { +{ + void* p = nullptr; +#ifndef _LIBCXXABI_NO_EXCEPTIONS + try + { #endif // _LIBCXXABI_NO_EXCEPTIONS - p = ::operator new(size); -#ifndef _LIBCXXABI_NO_EXCEPTIONS - } - catch (...) - { - } + p = ::operator new(size); +#ifndef _LIBCXXABI_NO_EXCEPTIONS + } + catch (...) + { + } #endif // _LIBCXXABI_NO_EXCEPTIONS - return p; -} - -_LIBCXXABI_WEAK -void* -operator new[](size_t size) _THROW_BAD_ALLOC -{ - return ::operator new(size); -} - -_LIBCXXABI_WEAK -void* + return p; +} + +_LIBCXXABI_WEAK +void* +operator new[](size_t size) _THROW_BAD_ALLOC +{ + return ::operator new(size); +} + +_LIBCXXABI_WEAK +void* operator new[](size_t size, const std::nothrow_t&) noexcept -{ - void* p = nullptr; -#ifndef _LIBCXXABI_NO_EXCEPTIONS - try - { +{ + void* p = nullptr; +#ifndef _LIBCXXABI_NO_EXCEPTIONS + try + { #endif // _LIBCXXABI_NO_EXCEPTIONS - p = ::operator new[](size); -#ifndef _LIBCXXABI_NO_EXCEPTIONS - } - catch (...) - { - } + p = ::operator new[](size); +#ifndef _LIBCXXABI_NO_EXCEPTIONS + } + catch (...) + { + } #endif // _LIBCXXABI_NO_EXCEPTIONS - return p; -} - -_LIBCXXABI_WEAK -void + return p; +} + +_LIBCXXABI_WEAK +void operator delete(void* ptr) noexcept -{ - ::free(ptr); -} - -_LIBCXXABI_WEAK -void +{ + ::free(ptr); +} + +_LIBCXXABI_WEAK +void operator delete(void* ptr, const std::nothrow_t&) noexcept -{ - ::operator delete(ptr); -} - -_LIBCXXABI_WEAK -void +{ + ::operator delete(ptr); +} + +_LIBCXXABI_WEAK +void operator delete(void* ptr, size_t) noexcept -{ - ::operator delete(ptr); -} - -_LIBCXXABI_WEAK -void +{ + ::operator delete(ptr); +} + +_LIBCXXABI_WEAK +void operator delete[] (void* ptr) noexcept -{ - ::operator delete(ptr); -} - -_LIBCXXABI_WEAK -void +{ + ::operator delete(ptr); +} + +_LIBCXXABI_WEAK +void operator delete[] (void* ptr, const std::nothrow_t&) noexcept -{ - ::operator delete[](ptr); -} - -_LIBCXXABI_WEAK -void +{ + ::operator delete[](ptr); +} + +_LIBCXXABI_WEAK +void operator delete[] (void* ptr, size_t) noexcept -{ - ::operator delete[](ptr); -} - -#if !defined(_LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION) - -_LIBCXXABI_WEAK -void * -operator new(std::size_t size, std::align_val_t alignment) _THROW_BAD_ALLOC -{ - if (size == 0) - size = 1; - if (static_cast<size_t>(alignment) < sizeof(void*)) - alignment = std::align_val_t(sizeof(void*)); - - // Try allocating memory. If allocation fails and there is a new_handler, - // call it to try free up memory, and try again until it succeeds, or until - // the new_handler decides to terminate. - // - // If allocation fails and there is no new_handler, we throw bad_alloc - // (or return nullptr if exceptions are disabled). - void* p; - while ((p = std::__libcpp_aligned_alloc(static_cast<std::size_t>(alignment), size)) == nullptr) - { - std::new_handler nh = std::get_new_handler(); - if (nh) - nh(); - else { -#ifndef _LIBCXXABI_NO_EXCEPTIONS - throw std::bad_alloc(); -#else - break; -#endif - } - } - return p; -} - -_LIBCXXABI_WEAK -void* +{ + ::operator delete[](ptr); +} + +#if !defined(_LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION) + +_LIBCXXABI_WEAK +void * +operator new(std::size_t size, std::align_val_t alignment) _THROW_BAD_ALLOC +{ + if (size == 0) + size = 1; + if (static_cast<size_t>(alignment) < sizeof(void*)) + alignment = std::align_val_t(sizeof(void*)); + + // Try allocating memory. If allocation fails and there is a new_handler, + // call it to try free up memory, and try again until it succeeds, or until + // the new_handler decides to terminate. + // + // If allocation fails and there is no new_handler, we throw bad_alloc + // (or return nullptr if exceptions are disabled). + void* p; + while ((p = std::__libcpp_aligned_alloc(static_cast<std::size_t>(alignment), size)) == nullptr) + { + std::new_handler nh = std::get_new_handler(); + if (nh) + nh(); + else { +#ifndef _LIBCXXABI_NO_EXCEPTIONS + throw std::bad_alloc(); +#else + break; +#endif + } + } + return p; +} + +_LIBCXXABI_WEAK +void* operator new(size_t size, std::align_val_t alignment, const std::nothrow_t&) noexcept -{ - void* p = nullptr; -#ifndef _LIBCXXABI_NO_EXCEPTIONS - try - { +{ + void* p = nullptr; +#ifndef _LIBCXXABI_NO_EXCEPTIONS + try + { #endif // _LIBCXXABI_NO_EXCEPTIONS - p = ::operator new(size, alignment); -#ifndef _LIBCXXABI_NO_EXCEPTIONS - } - catch (...) - { - } + p = ::operator new(size, alignment); +#ifndef _LIBCXXABI_NO_EXCEPTIONS + } + catch (...) + { + } #endif // _LIBCXXABI_NO_EXCEPTIONS - return p; -} - -_LIBCXXABI_WEAK -void* -operator new[](size_t size, std::align_val_t alignment) _THROW_BAD_ALLOC -{ - return ::operator new(size, alignment); -} - -_LIBCXXABI_WEAK -void* + return p; +} + +_LIBCXXABI_WEAK +void* +operator new[](size_t size, std::align_val_t alignment) _THROW_BAD_ALLOC +{ + return ::operator new(size, alignment); +} + +_LIBCXXABI_WEAK +void* operator new[](size_t size, std::align_val_t alignment, const std::nothrow_t&) noexcept -{ - void* p = nullptr; -#ifndef _LIBCXXABI_NO_EXCEPTIONS - try - { +{ + void* p = nullptr; +#ifndef _LIBCXXABI_NO_EXCEPTIONS + try + { #endif // _LIBCXXABI_NO_EXCEPTIONS - p = ::operator new[](size, alignment); -#ifndef _LIBCXXABI_NO_EXCEPTIONS - } - catch (...) - { - } + p = ::operator new[](size, alignment); +#ifndef _LIBCXXABI_NO_EXCEPTIONS + } + catch (...) + { + } #endif // _LIBCXXABI_NO_EXCEPTIONS - return p; -} - -_LIBCXXABI_WEAK -void + return p; +} + +_LIBCXXABI_WEAK +void operator delete(void* ptr, std::align_val_t) noexcept -{ - std::__libcpp_aligned_free(ptr); -} - -_LIBCXXABI_WEAK -void +{ + std::__libcpp_aligned_free(ptr); +} + +_LIBCXXABI_WEAK +void operator delete(void* ptr, std::align_val_t alignment, const std::nothrow_t&) noexcept -{ - ::operator delete(ptr, alignment); -} - -_LIBCXXABI_WEAK -void +{ + ::operator delete(ptr, alignment); +} + +_LIBCXXABI_WEAK +void operator delete(void* ptr, size_t, std::align_val_t alignment) noexcept -{ - ::operator delete(ptr, alignment); -} - -_LIBCXXABI_WEAK -void +{ + ::operator delete(ptr, alignment); +} + +_LIBCXXABI_WEAK +void operator delete[] (void* ptr, std::align_val_t alignment) noexcept -{ - ::operator delete(ptr, alignment); -} - -_LIBCXXABI_WEAK -void +{ + ::operator delete(ptr, alignment); +} + +_LIBCXXABI_WEAK +void operator delete[] (void* ptr, std::align_val_t alignment, const std::nothrow_t&) noexcept -{ - ::operator delete[](ptr, alignment); -} - -_LIBCXXABI_WEAK -void +{ + ::operator delete[](ptr, alignment); +} + +_LIBCXXABI_WEAK +void operator delete[] (void* ptr, size_t, std::align_val_t alignment) noexcept -{ - ::operator delete[](ptr, alignment); -} - -#endif // !_LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION +{ + ::operator delete[](ptr, alignment); +} + +#endif // !_LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION diff --git a/contrib/libs/cxxsupp/libcxxabi/src/stdlib_stdexcept.cpp b/contrib/libs/cxxsupp/libcxxabi/src/stdlib_stdexcept.cpp index 92f7a6e076..d5e6647f34 100644 --- a/contrib/libs/cxxsupp/libcxxabi/src/stdlib_stdexcept.cpp +++ b/contrib/libs/cxxsupp/libcxxabi/src/stdlib_stdexcept.cpp @@ -1,47 +1,47 @@ //===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#include "stdexcept" -#include "new" -#include <cstdlib> -#include <cstring> -#include <cstdint> -#include <cstddef> +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "stdexcept" +#include "new" +#include <cstdlib> +#include <cstring> +#include <cstdint> +#include <cstddef> #include "include/refstring.h" // from libc++ - -static_assert(sizeof(std::__libcpp_refstring) == sizeof(const char *), ""); - -namespace std // purposefully not using versioning namespace -{ - + +static_assert(sizeof(std::__libcpp_refstring) == sizeof(const char *), ""); + +namespace std // purposefully not using versioning namespace +{ + logic_error::~logic_error() noexcept {} - -const char* + +const char* logic_error::what() const noexcept -{ - return __imp_.c_str(); -} - +{ + return __imp_.c_str(); +} + runtime_error::~runtime_error() noexcept {} - -const char* + +const char* runtime_error::what() const noexcept -{ - return __imp_.c_str(); -} - +{ + return __imp_.c_str(); +} + domain_error::~domain_error() noexcept {} invalid_argument::~invalid_argument() noexcept {} length_error::~length_error() noexcept {} out_of_range::~out_of_range() noexcept {} - + range_error::~range_error() noexcept {} overflow_error::~overflow_error() noexcept {} underflow_error::~underflow_error() noexcept {} - -} // std + +} // std diff --git a/contrib/libs/cxxsupp/libcxxabi/src/stdlib_typeinfo.cpp b/contrib/libs/cxxsupp/libcxxabi/src/stdlib_typeinfo.cpp index 6e5499628d..a81c091a33 100644 --- a/contrib/libs/cxxsupp/libcxxabi/src/stdlib_typeinfo.cpp +++ b/contrib/libs/cxxsupp/libcxxabi/src/stdlib_typeinfo.cpp @@ -1,52 +1,52 @@ //===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#include <typeinfo> - -namespace std -{ - -// type_info - -type_info::~type_info() -{ -} - -// bad_cast - +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include <typeinfo> + +namespace std +{ + +// type_info + +type_info::~type_info() +{ +} + +// bad_cast + bad_cast::bad_cast() noexcept -{ -} - +{ +} + bad_cast::~bad_cast() noexcept -{ -} - -const char* +{ +} + +const char* bad_cast::what() const noexcept -{ - return "std::bad_cast"; -} - -// bad_typeid - +{ + return "std::bad_cast"; +} + +// bad_typeid + bad_typeid::bad_typeid() noexcept -{ -} - +{ +} + bad_typeid::~bad_typeid() noexcept -{ -} - -const char* +{ +} + +const char* bad_typeid::what() const noexcept -{ - return "std::bad_typeid"; -} - -} // std +{ + return "std::bad_typeid"; +} + +} // std diff --git a/contrib/libs/cxxsupp/libcxxabi/ya.make b/contrib/libs/cxxsupp/libcxxabi/ya.make index 29945e0e6d..23e636e99c 100644 --- a/contrib/libs/cxxsupp/libcxxabi/ya.make +++ b/contrib/libs/cxxsupp/libcxxabi/ya.make @@ -1,65 +1,65 @@ # Generated by devtools/yamaker from nixpkgs 21.11. - -LIBRARY() - -OWNER( - heretic + +LIBRARY() + +OWNER( + heretic g:cpp-committee g:cpp-contrib -) - +) + VERSION(2021-12-08) - + ORIGINAL_SOURCE(https://github.com/llvm/llvm-project/archive/c1a14a5c3e6fef181f920b66ec159b6bfac4d457.tar.gz) -LICENSE( +LICENSE( Apache-2.0 AND - Apache-2.0 WITH LLVM-exception AND - MIT AND - NCSA -) - -LICENSE_TEXTS(.yandex_meta/licenses.list.txt) - -ADDINCL( - contrib/libs/cxxsupp/libcxxabi/include + Apache-2.0 WITH LLVM-exception AND + MIT AND + NCSA +) + +LICENSE_TEXTS(.yandex_meta/licenses.list.txt) + +ADDINCL( + contrib/libs/cxxsupp/libcxxabi/include contrib/libs/cxxsupp/libcxx/include contrib/libs/cxxsupp/libcxx -) - -NO_COMPILER_WARNINGS() - +) + +NO_COMPILER_WARNINGS() + NO_RUNTIME() -NO_UTIL() - -CFLAGS( - -D_LIBCXXABI_BUILDING_LIBRARY -) - -SRCS( - src/abort_message.cpp - src/cxa_aux_runtime.cpp - src/cxa_default_handlers.cpp - src/cxa_demangle.cpp - src/cxa_exception.cpp - src/cxa_exception_storage.cpp - src/cxa_guard.cpp - src/cxa_handlers.cpp - src/cxa_personality.cpp - src/cxa_vector.cpp - src/cxa_virtual.cpp - src/fallback_malloc.cpp - src/private_typeinfo.cpp - src/stdlib_exception.cpp - src/stdlib_new_delete.cpp - src/stdlib_stdexcept.cpp - src/stdlib_typeinfo.cpp -) - +NO_UTIL() + +CFLAGS( + -D_LIBCXXABI_BUILDING_LIBRARY +) + +SRCS( + src/abort_message.cpp + src/cxa_aux_runtime.cpp + src/cxa_default_handlers.cpp + src/cxa_demangle.cpp + src/cxa_exception.cpp + src/cxa_exception_storage.cpp + src/cxa_guard.cpp + src/cxa_handlers.cpp + src/cxa_personality.cpp + src/cxa_vector.cpp + src/cxa_virtual.cpp + src/fallback_malloc.cpp + src/private_typeinfo.cpp + src/stdlib_exception.cpp + src/stdlib_new_delete.cpp + src/stdlib_stdexcept.cpp + src/stdlib_typeinfo.cpp +) + SRC_CPP_PIC( - src/cxa_thread_atexit.cpp - -fno-lto + src/cxa_thread_atexit.cpp + -fno-lto ) -END() +END() diff --git a/contrib/libs/cxxsupp/libcxxrt/.yandex_meta/devtools.licenses.report b/contrib/libs/cxxsupp/libcxxrt/.yandex_meta/devtools.licenses.report index 72889a5c68..d723412b1b 100644 --- a/contrib/libs/cxxsupp/libcxxrt/.yandex_meta/devtools.licenses.report +++ b/contrib/libs/cxxsupp/libcxxrt/.yandex_meta/devtools.licenses.report @@ -1,57 +1,57 @@ -# File format ($ symbol means the beginning of a line): -# -# $ # this message -# $ # ======================= -# $ # comments (all commentaries should starts with some number of spaces and # symbol) -# ${action} {license spdx} {license text hash} -# $BELONGS ./ya/make/file/relative/path/1/ya.make ./ya/make/2/ya.make -# ${all_file_action} filename -# $ # user commentaries (many lines) -# $ generated description - files with this license, license text... (some number of lines that starts with some number of spaces, do not modify) -# ${action} {license spdx} {license text hash} -# $BELONGS ./ya/make/file/relative/path/3/ya.make -# ${all_file_action} filename -# $ # user commentaries -# $ generated description -# $ ... -# -# You can modify action, all_file_action and add commentaries -# Available actions: -# keep - keep license in contrib and use in credits -# skip - skip license -# remove - remove all files with this license -# rename - save license text/links into licenses texts file, but not store SPDX into LINCENSE macro. You should store correct license id into devtools.license.spdx.txt file -# -# {all file action} records will be generated when license text contains filename that exists on filesystem (in contrib directory) -# We suppose that that files can contain some license info -# Available all file actions: -# FILE_IGNORE - ignore file (do nothing) -# FILE_INCLUDE - include all file data into licenses text file -# ======================= - -KEEP BSD-3-Clause 88f80886d9ea21e0b7205bd3730230e4 +# File format ($ symbol means the beginning of a line): +# +# $ # this message +# $ # ======================= +# $ # comments (all commentaries should starts with some number of spaces and # symbol) +# ${action} {license spdx} {license text hash} +# $BELONGS ./ya/make/file/relative/path/1/ya.make ./ya/make/2/ya.make +# ${all_file_action} filename +# $ # user commentaries (many lines) +# $ generated description - files with this license, license text... (some number of lines that starts with some number of spaces, do not modify) +# ${action} {license spdx} {license text hash} +# $BELONGS ./ya/make/file/relative/path/3/ya.make +# ${all_file_action} filename +# $ # user commentaries +# $ generated description +# $ ... +# +# You can modify action, all_file_action and add commentaries +# Available actions: +# keep - keep license in contrib and use in credits +# skip - skip license +# remove - remove all files with this license +# rename - save license text/links into licenses texts file, but not store SPDX into LINCENSE macro. You should store correct license id into devtools.license.spdx.txt file +# +# {all file action} records will be generated when license text contains filename that exists on filesystem (in contrib directory) +# We suppose that that files can contain some license info +# Available all file actions: +# FILE_IGNORE - ignore file (do nothing) +# FILE_INCLUDE - include all file data into licenses text file +# ======================= + +KEEP BSD-3-Clause 88f80886d9ea21e0b7205bd3730230e4 BELONGS ya.make - License text: - The BSD License - Scancode info: - Original SPDX id: BSD-3-Clause - Score : 99.00 - Match type : REFERENCE - Links : http://www.opensource.org/licenses/BSD-3-Clause, https://spdx.org/licenses/BSD-3-Clause - Files with this license: + License text: + The BSD License + Scancode info: + Original SPDX id: BSD-3-Clause + Score : 99.00 + Match type : REFERENCE + Links : http://www.opensource.org/licenses/BSD-3-Clause, https://spdx.org/licenses/BSD-3-Clause + Files with this license: LICENSE [1:1] - -KEEP BSD-2-Clause 8cedb6171c06f89f0e6eefd60e5f79d5 + +KEEP BSD-2-Clause 8cedb6171c06f89f0e6eefd60e5f79d5 BELONGS ya.make FILE_INCLUDE COPYRIGHT found in files: auxhelper.cc at line 14, auxhelper.cc at line 17, dwarf_eh.h at line 14, dwarf_eh.h at line 17, dynamic_cast.cc at line 14, dynamic_cast.cc at line 17, exception.cc at line 14, exception.cc at line 17, guard.cc at line 14, guard.cc at line 17, memory.cc at line 14, memory.cc at line 17, stdexcept.cc at line 14, stdexcept.cc at line 17, stdexcept.h at line 14, stdexcept.h at line 17, typeinfo.cc at line 14, typeinfo.cc at line 17, typeinfo.h at line 14, typeinfo.h at line 17 - # list - just word, not file reference - Note: matched license text is too long. Read it in the source files. - Scancode info: - Original SPDX id: BSD-2-Clause - Score : 100.00 - Match type : TEXT - Links : http://opensource.org/licenses/bsd-license.php, http://www.opensource.org/licenses/BSD-2-Clause, https://spdx.org/licenses/BSD-2-Clause - Files with this license: + # list - just word, not file reference + Note: matched license text is too long. Read it in the source files. + Scancode info: + Original SPDX id: BSD-2-Clause + Score : 100.00 + Match type : TEXT + Links : http://opensource.org/licenses/bsd-license.php, http://www.opensource.org/licenses/BSD-2-Clause, https://spdx.org/licenses/BSD-2-Clause + Files with this license: auxhelper.cc [4:24] dwarf_eh.h [4:24] dynamic_cast.cc [4:24] @@ -62,30 +62,30 @@ FILE_INCLUDE COPYRIGHT found in files: auxhelper.cc at line 14, auxhelper.cc at stdexcept.h [4:24] typeinfo.cc [4:24] typeinfo.h [4:24] - -KEEP MIT 8ee097b6bcb3429ad39c4dbd5cc0e35e + +KEEP MIT 8ee097b6bcb3429ad39c4dbd5cc0e35e BELONGS ya.make FILE_INCLUDE AUTHORS found in files: cxxabi.h at line 17 FILE_INCLUDE COPYRIGHT found in files: cxxabi.h at line 17 - # any - just word, not file reference - Note: matched license text is too long. Read it in the source files. - Scancode info: - Original SPDX id: MIT - Score : 100.00 - Match type : TEXT - Links : http://opensource.org/licenses/mit-license.php, https://spdx.org/licenses/MIT - Files with this license: + # any - just word, not file reference + Note: matched license text is too long. Read it in the source files. + Scancode info: + Original SPDX id: MIT + Score : 100.00 + Match type : TEXT + Links : http://opensource.org/licenses/mit-license.php, https://spdx.org/licenses/MIT + Files with this license: cxxabi.h [4:20] - -KEEP BSD-2-Clause-Views fa822847a0868c8922cbd110b73455fc + +KEEP BSD-2-Clause-Views fa822847a0868c8922cbd110b73455fc BELONGS ya.make FILE_INCLUDE COPYRIGHT found in files: LICENSE at line 12 - # list - just word, not file reference - Note: matched license text is too long. Read it in the source files. - Scancode info: - Original SPDX id: BSD-2-Clause-Views - Score : 98.16 - Match type : TEXT - Links : https://github.com/protegeproject/protege/blob/master/license.txt, https://spdx.org/licenses/BSD-2-Clause-Views, https://www.freebsd.org/copyright/freebsd-license.html - Files with this license: + # list - just word, not file reference + Note: matched license text is too long. Read it in the source files. + Scancode info: + Original SPDX id: BSD-2-Clause-Views + Score : 98.16 + Match type : TEXT + Links : https://github.com/protegeproject/protege/blob/master/license.txt, https://spdx.org/licenses/BSD-2-Clause-Views, https://www.freebsd.org/copyright/freebsd-license.html + Files with this license: LICENSE [5:14] diff --git a/contrib/libs/cxxsupp/libcxxrt/.yandex_meta/licenses.list.txt b/contrib/libs/cxxsupp/libcxxrt/.yandex_meta/licenses.list.txt index a88ae308f8..25fd6b7e3b 100644 --- a/contrib/libs/cxxsupp/libcxxrt/.yandex_meta/licenses.list.txt +++ b/contrib/libs/cxxsupp/libcxxrt/.yandex_meta/licenses.list.txt @@ -1,82 +1,82 @@ -====================BSD-2-Clause==================== - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. +====================BSD-2-Clause==================== + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS - * IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -====================BSD-2-Clause-Views==================== -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - - - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -The views and conclusions contained in the software and documentation are those of the authors and should not be interpreted as representing official policies, either expressed or implied, of - -====================BSD-3-Clause==================== -The BSD License - - -====================COPYRIGHT==================== - * Copyright 2010-2011 PathScale, Inc. All rights reserved. - - -====================COPYRIGHT==================== - * Copyright 2010-2012 PathScale, Inc. All rights reserved. - - -====================COPYRIGHT==================== - * Copyright 2012 David Chisnall. All rights reserved. - - + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS + * IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +====================BSD-2-Clause-Views==================== +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + + + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The views and conclusions contained in the software and documentation are those of the authors and should not be interpreted as representing official policies, either expressed or implied, of + +====================BSD-3-Clause==================== +The BSD License + + +====================COPYRIGHT==================== + * Copyright 2010-2011 PathScale, Inc. All rights reserved. + + +====================COPYRIGHT==================== + * Copyright 2010-2012 PathScale, Inc. All rights reserved. + + +====================COPYRIGHT==================== + * Copyright 2012 David Chisnall. All rights reserved. + + ====================File: AUTHORS==================== -David Chisnall -PathScale engineers - - +David Chisnall +PathScale engineers + + ====================File: COPYRIGHT==================== -PathScale Inc -NetBSD Foundation -FreeBSD Foundation - - -====================MIT==================== - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: +PathScale Inc +NetBSD Foundation +FreeBSD Foundation + + +====================MIT==================== + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/contrib/libs/cxxsupp/libcxxrt/ya.make b/contrib/libs/cxxsupp/libcxxrt/ya.make index 12dccbd505..21aa145b84 100644 --- a/contrib/libs/cxxsupp/libcxxrt/ya.make +++ b/contrib/libs/cxxsupp/libcxxrt/ya.make @@ -2,21 +2,21 @@ LIBRARY() -LICENSE( +LICENSE( BSD-2-Clause AND BSD-2-Clause-Views AND BSD-3-Clause AND - MIT -) - -LICENSE_TEXTS(.yandex_meta/licenses.list.txt) + MIT +) +LICENSE_TEXTS(.yandex_meta/licenses.list.txt) + OWNER( pg setser somov g:cpp-committee - g:cpp-contrib + g:cpp-contrib ) VERSION(2021-09-08-14bf5d5526056ae1cc16f03b7b8e96108a1e38d0) @@ -36,15 +36,15 @@ CXXFLAGS(-nostdinc++) IF (CXX_UNWIND == "glibcxx_dynamic" OR ARCH_PPC64LE) LDFLAGS(-lgcc_s) ELSE() - PEERDIR( - contrib/libs/libunwind - ) + PEERDIR( + contrib/libs/libunwind + ) ENDIF() IF (SANITIZER_TYPE == undefined OR FUZZING) NO_SANITIZE() NO_SANITIZE_COVERAGE() -ENDIF() +ENDIF() SRCS( auxhelper.cc diff --git a/contrib/libs/cxxsupp/libgcc/ya.make b/contrib/libs/cxxsupp/libgcc/ya.make index d748a74846..e907f7df07 100644 --- a/contrib/libs/cxxsupp/libgcc/ya.make +++ b/contrib/libs/cxxsupp/libgcc/ya.make @@ -1,7 +1,7 @@ LIBRARY() -WITHOUT_LICENSE_TEXTS() - +WITHOUT_LICENSE_TEXTS() + LICENSE(YandexOpen) # Placeholders for new GCC 4.9.2 C++ ABI which is not present on older systems diff --git a/contrib/libs/cxxsupp/libsan/ya.make b/contrib/libs/cxxsupp/libsan/ya.make index 2fb16630be..aa93dea41a 100644 --- a/contrib/libs/cxxsupp/libsan/ya.make +++ b/contrib/libs/cxxsupp/libsan/ya.make @@ -1,20 +1,20 @@ LIBRARY() -WITHOUT_LICENSE_TEXTS() - +WITHOUT_LICENSE_TEXTS() + LICENSE(YandexOpen) NO_PLATFORM() - + NO_SANITIZE() - + NO_SANITIZE_COVERAGE() -OWNER(somov) - -PYTHON( - generate_symbolizer.py ${CXX_COMPILER} - STDOUT symbolizer.c +OWNER(somov) + +PYTHON( + generate_symbolizer.py ${CXX_COMPILER} + STDOUT symbolizer.c ) CFLAGS(-fPIC) diff --git a/contrib/libs/cxxsupp/openmp/.yandex_meta/devtools.copyrights.report b/contrib/libs/cxxsupp/openmp/.yandex_meta/devtools.copyrights.report index 9678df6118..9106d45331 100644 --- a/contrib/libs/cxxsupp/openmp/.yandex_meta/devtools.copyrights.report +++ b/contrib/libs/cxxsupp/openmp/.yandex_meta/devtools.copyrights.report @@ -1,30 +1,30 @@ -# File format ($ symbol means the beginning of a line): -# -# $ # this message -# $ # ======================= -# $ # comments (all commentaries should starts with some number of spaces and # symbol) -# ${action} {license id} {license text hash} -# $BELONGS ./ya/make/file/relative/path/1/ya.make ./ya/make/2/ya.make -# ${all_file_action} filename -# $ # user commentaries (many lines) -# $ generated description - files with this license, license text... (some number of lines that starts with some number of spaces, do not modify) -# ${action} {license spdx} {license text hash} -# $BELONGS ./ya/make/file/relative/path/3/ya.make -# ${all_file_action} filename -# $ # user commentaries -# $ generated description -# $ ... -# -# You can modify action, all_file_action and add commentaries -# Available actions: -# keep - keep license in contrib and use in credits -# skip - skip license -# remove - remove all files with this license -# rename - save license text/links into licenses texts file, but not store SPDX into LINCENSE macro. You should store correct license id into devtools.license.spdx.txt file -# -# {all file action} records will be generated when license text contains filename that exists on filesystem (in contrib directory) -# We suppose that that files can contain some license info -# Available all file actions: -# FILE_IGNORE - ignore file (do nothing) -# FILE_INCLUDE - include all file data into licenses text file -# ======================= +# File format ($ symbol means the beginning of a line): +# +# $ # this message +# $ # ======================= +# $ # comments (all commentaries should starts with some number of spaces and # symbol) +# ${action} {license id} {license text hash} +# $BELONGS ./ya/make/file/relative/path/1/ya.make ./ya/make/2/ya.make +# ${all_file_action} filename +# $ # user commentaries (many lines) +# $ generated description - files with this license, license text... (some number of lines that starts with some number of spaces, do not modify) +# ${action} {license spdx} {license text hash} +# $BELONGS ./ya/make/file/relative/path/3/ya.make +# ${all_file_action} filename +# $ # user commentaries +# $ generated description +# $ ... +# +# You can modify action, all_file_action and add commentaries +# Available actions: +# keep - keep license in contrib and use in credits +# skip - skip license +# remove - remove all files with this license +# rename - save license text/links into licenses texts file, but not store SPDX into LINCENSE macro. You should store correct license id into devtools.license.spdx.txt file +# +# {all file action} records will be generated when license text contains filename that exists on filesystem (in contrib directory) +# We suppose that that files can contain some license info +# Available all file actions: +# FILE_IGNORE - ignore file (do nothing) +# FILE_INCLUDE - include all file data into licenses text file +# ======================= diff --git a/contrib/libs/cxxsupp/openmp/.yandex_meta/devtools.licenses.report b/contrib/libs/cxxsupp/openmp/.yandex_meta/devtools.licenses.report index 7643356c03..664803b38b 100644 --- a/contrib/libs/cxxsupp/openmp/.yandex_meta/devtools.licenses.report +++ b/contrib/libs/cxxsupp/openmp/.yandex_meta/devtools.licenses.report @@ -1,45 +1,45 @@ -# File format ($ symbol means the beginning of a line): -# -# $ # this message -# $ # ======================= -# $ # comments (all commentaries should starts with some number of spaces and # symbol) -# ${action} {license spdx} {license text hash} -# $BELONGS ./ya/make/file/relative/path/1/ya.make ./ya/make/2/ya.make -# ${all_file_action} filename -# $ # user commentaries (many lines) -# $ generated description - files with this license, license text... (some number of lines that starts with some number of spaces, do not modify) -# ${action} {license spdx} {license text hash} -# $BELONGS ./ya/make/file/relative/path/3/ya.make -# ${all_file_action} filename -# $ # user commentaries -# $ generated description -# $ ... -# -# You can modify action, all_file_action and add commentaries -# Available actions: -# keep - keep license in contrib and use in credits -# skip - skip license -# remove - remove all files with this license -# rename - save license text/links into licenses texts file, but not store SPDX into LINCENSE macro. You should store correct license id into devtools.license.spdx.txt file -# -# {all file action} records will be generated when license text contains filename that exists on filesystem (in contrib directory) -# We suppose that that files can contain some license info -# Available all file actions: -# FILE_IGNORE - ignore file (do nothing) -# FILE_INCLUDE - include all file data into licenses text file -# ======================= - -KEEP NCSA AND MIT 0791db4b6d90edd44c715bba1e426f74 +# File format ($ symbol means the beginning of a line): +# +# $ # this message +# $ # ======================= +# $ # comments (all commentaries should starts with some number of spaces and # symbol) +# ${action} {license spdx} {license text hash} +# $BELONGS ./ya/make/file/relative/path/1/ya.make ./ya/make/2/ya.make +# ${all_file_action} filename +# $ # user commentaries (many lines) +# $ generated description - files with this license, license text... (some number of lines that starts with some number of spaces, do not modify) +# ${action} {license spdx} {license text hash} +# $BELONGS ./ya/make/file/relative/path/3/ya.make +# ${all_file_action} filename +# $ # user commentaries +# $ generated description +# $ ... +# +# You can modify action, all_file_action and add commentaries +# Available actions: +# keep - keep license in contrib and use in credits +# skip - skip license +# remove - remove all files with this license +# rename - save license text/links into licenses texts file, but not store SPDX into LINCENSE macro. You should store correct license id into devtools.license.spdx.txt file +# +# {all file action} records will be generated when license text contains filename that exists on filesystem (in contrib directory) +# We suppose that that files can contain some license info +# Available all file actions: +# FILE_IGNORE - ignore file (do nothing) +# FILE_INCLUDE - include all file data into licenses text file +# ======================= + +KEEP NCSA AND MIT 0791db4b6d90edd44c715bba1e426f74 BELONGS ya.make - License text: - // This file is dual licensed under the MIT and the University of Illinois Open - // Source Licenses. See LICENSE.txt for details. - Scancode info: - Original SPDX id: NCSA - Score : 100.00 - Match type : NOTICE - Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA - Files with this license: + License text: + // This file is dual licensed under the MIT and the University of Illinois Open + // Source Licenses. See LICENSE.txt for details. + Scancode info: + Original SPDX id: NCSA + Score : 100.00 + Match type : NOTICE + Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA + Files with this license: extractExternal.cpp [10:11] include/30/omp.h.var [10:11] include/40/omp.h.var [10:11] @@ -118,12 +118,12 @@ BELONGS ya.make z_Linux_util.c [10:11] z_Windows_NT-586_util.c [10:11] z_Windows_NT_util.c [10:11] - Scancode info: - Original SPDX id: MIT - Score : 100.00 - Match type : NOTICE - Links : http://opensource.org/licenses/mit-license.php, https://spdx.org/licenses/MIT - Files with this license: + Scancode info: + Original SPDX id: MIT + Score : 100.00 + Match type : NOTICE + Links : http://opensource.org/licenses/mit-license.php, https://spdx.org/licenses/MIT + Files with this license: extractExternal.cpp [10:11] include/30/omp.h.var [10:11] include/40/omp.h.var [10:11] @@ -202,60 +202,60 @@ BELONGS ya.make z_Linux_util.c [10:11] z_Windows_NT-586_util.c [10:11] z_Windows_NT_util.c [10:11] - -KEEP NCSA AND MIT 479de2cae020eacfac58212c03d33ab1 + +KEEP NCSA AND MIT 479de2cae020eacfac58212c03d33ab1 BELONGS ya.make - License text: - // This file is dual licensed under the MIT and the University of Illinois Open - // Source Licenses. See LICENSE.txt for details. - Scancode info: - Original SPDX id: NCSA - Score : 100.00 - Match type : NOTICE - Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA - Files with this license: + License text: + // This file is dual licensed under the MIT and the University of Illinois Open + // Source Licenses. See LICENSE.txt for details. + Scancode info: + Original SPDX id: NCSA + Score : 100.00 + Match type : NOTICE + Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA + Files with this license: thirdparty/ittnotify/ittnotify_static.h [6:7] - Scancode info: - Original SPDX id: MIT - Score : 100.00 - Match type : NOTICE - Links : http://opensource.org/licenses/mit-license.php, https://spdx.org/licenses/MIT - Files with this license: + Scancode info: + Original SPDX id: MIT + Score : 100.00 + Match type : NOTICE + Links : http://opensource.org/licenses/mit-license.php, https://spdx.org/licenses/MIT + Files with this license: thirdparty/ittnotify/ittnotify_static.h [6:7] - -KEEP NCSA AND MIT 61ab203794bd26e0aab2c6b954e30d9a + +KEEP NCSA AND MIT 61ab203794bd26e0aab2c6b954e30d9a BELONGS ya.make - License text: - //// This file is dual licensed under the MIT and the University of Illinois Open - //// Source Licenses. See LICENSE.txt for details. - Scancode info: - Original SPDX id: NCSA - Score : 100.00 - Match type : NOTICE - Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA - Files with this license: + License text: + //// This file is dual licensed under the MIT and the University of Illinois Open + //// Source Licenses. See LICENSE.txt for details. + Scancode info: + Original SPDX id: NCSA + Score : 100.00 + Match type : NOTICE + Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA + Files with this license: libomp.rc.var [8:9] z_Linux_asm.s [9:10] - Scancode info: - Original SPDX id: MIT - Score : 100.00 - Match type : NOTICE - Links : http://opensource.org/licenses/mit-license.php, https://spdx.org/licenses/MIT - Files with this license: + Scancode info: + Original SPDX id: MIT + Score : 100.00 + Match type : NOTICE + Links : http://opensource.org/licenses/mit-license.php, https://spdx.org/licenses/MIT + Files with this license: libomp.rc.var [8:9] z_Linux_asm.s [9:10] - -KEEP NCSA AND MIT 9d5ffd6253d2b406a8bc3bbf3cb4f38b + +KEEP NCSA AND MIT 9d5ffd6253d2b406a8bc3bbf3cb4f38b BELONGS ya.make - License text: - !// This file is dual licensed under the MIT and the University of Illinois Open - !// Source Licenses. See LICENSE.txt for details. - Scancode info: - Original SPDX id: NCSA - Score : 100.00 - Match type : NOTICE - Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA - Files with this license: + License text: + !// This file is dual licensed under the MIT and the University of Illinois Open + !// Source Licenses. See LICENSE.txt for details. + Scancode info: + Original SPDX id: NCSA + Score : 100.00 + Match type : NOTICE + Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA + Files with this license: include/30/omp_lib.f.var [8:9] include/30/omp_lib.f90.var [8:9] include/30/omp_lib.h.var [8:9] @@ -265,12 +265,12 @@ BELONGS ya.make include/41/omp_lib.f.var [8:9] include/41/omp_lib.f90.var [8:9] include/41/omp_lib.h.var [8:9] - Scancode info: - Original SPDX id: MIT - Score : 100.00 - Match type : NOTICE - Links : http://opensource.org/licenses/mit-license.php, https://spdx.org/licenses/MIT - Files with this license: + Scancode info: + Original SPDX id: MIT + Score : 100.00 + Match type : NOTICE + Links : http://opensource.org/licenses/mit-license.php, https://spdx.org/licenses/MIT + Files with this license: include/30/omp_lib.f.var [8:9] include/30/omp_lib.f90.var [8:9] include/30/omp_lib.h.var [8:9] @@ -280,43 +280,43 @@ BELONGS ya.make include/41/omp_lib.f.var [8:9] include/41/omp_lib.f90.var [8:9] include/41/omp_lib.h.var [8:9] - -KEEP NCSA AND MIT d2725783fa0a2f24d855943aac3dbdf9 + +KEEP NCSA AND MIT d2725783fa0a2f24d855943aac3dbdf9 BELONGS ya.make - License text: - ;// This file is dual licensed under the MIT and the University of Illinois Open - ;// Source Licenses. See LICENSE.txt for details. - Scancode info: - Original SPDX id: NCSA - Score : 100.00 - Match type : NOTICE - Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA - Files with this license: + License text: + ;// This file is dual licensed under the MIT and the University of Illinois Open + ;// Source Licenses. See LICENSE.txt for details. + Scancode info: + Original SPDX id: NCSA + Score : 100.00 + Match type : NOTICE + Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA + Files with this license: z_Windows_NT-586_asm.asm [9:10] - Scancode info: - Original SPDX id: MIT - Score : 100.00 - Match type : NOTICE - Links : http://opensource.org/licenses/mit-license.php, https://spdx.org/licenses/MIT - Files with this license: + Scancode info: + Original SPDX id: MIT + Score : 100.00 + Match type : NOTICE + Links : http://opensource.org/licenses/mit-license.php, https://spdx.org/licenses/MIT + Files with this license: z_Windows_NT-586_asm.asm [9:10] - -KEEP NCSA AND MIT e56769dac6aaa0678164025adda8a1da + +KEEP NCSA AND MIT e56769dac6aaa0678164025adda8a1da BELONGS ya.make - License text: - \#// This file is dual licensed under the MIT and the University of Illinois Open - \#// Source Licenses. See LICENSE.txt for details. - Scancode info: - Original SPDX id: NCSA - Score : 100.00 - Match type : NOTICE - Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA - Files with this license: + License text: + \#// This file is dual licensed under the MIT and the University of Illinois Open + \#// Source Licenses. See LICENSE.txt for details. + Scancode info: + Original SPDX id: NCSA + Score : 100.00 + Match type : NOTICE + Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA + Files with this license: i18n/en_US.txt [8:9] - Scancode info: - Original SPDX id: MIT - Score : 100.00 - Match type : NOTICE - Links : http://opensource.org/licenses/mit-license.php, https://spdx.org/licenses/MIT - Files with this license: + Scancode info: + Original SPDX id: MIT + Score : 100.00 + Match type : NOTICE + Links : http://opensource.org/licenses/mit-license.php, https://spdx.org/licenses/MIT + Files with this license: i18n/en_US.txt [8:9] diff --git a/contrib/libs/cxxsupp/openmp/.yandex_meta/licenses.list.txt b/contrib/libs/cxxsupp/openmp/.yandex_meta/licenses.list.txt index 9276ae1ece..cf07c6dad3 100644 --- a/contrib/libs/cxxsupp/openmp/.yandex_meta/licenses.list.txt +++ b/contrib/libs/cxxsupp/openmp/.yandex_meta/licenses.list.txt @@ -1,23 +1,23 @@ -====================NCSA AND MIT==================== -!// This file is dual licensed under the MIT and the University of Illinois Open -!// Source Licenses. See LICENSE.txt for details. - - -====================NCSA AND MIT==================== -#// This file is dual licensed under the MIT and the University of Illinois Open -#// Source Licenses. See LICENSE.txt for details. - - -====================NCSA AND MIT==================== -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.txt for details. - - -====================NCSA AND MIT==================== -//// This file is dual licensed under the MIT and the University of Illinois Open -//// Source Licenses. See LICENSE.txt for details. - - -====================NCSA AND MIT==================== -;// This file is dual licensed under the MIT and the University of Illinois Open -;// Source Licenses. See LICENSE.txt for details. +====================NCSA AND MIT==================== +!// This file is dual licensed under the MIT and the University of Illinois Open +!// Source Licenses. See LICENSE.txt for details. + + +====================NCSA AND MIT==================== +#// This file is dual licensed under the MIT and the University of Illinois Open +#// Source Licenses. See LICENSE.txt for details. + + +====================NCSA AND MIT==================== +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.txt for details. + + +====================NCSA AND MIT==================== +//// This file is dual licensed under the MIT and the University of Illinois Open +//// Source Licenses. See LICENSE.txt for details. + + +====================NCSA AND MIT==================== +;// This file is dual licensed under the MIT and the University of Illinois Open +;// Source Licenses. See LICENSE.txt for details. diff --git a/contrib/libs/cxxsupp/openmp/ya.make b/contrib/libs/cxxsupp/openmp/ya.make index 2c64468375..5901ad9193 100644 --- a/contrib/libs/cxxsupp/openmp/ya.make +++ b/contrib/libs/cxxsupp/openmp/ya.make @@ -1,49 +1,49 @@ LIBRARY() -LICENSE( - MIT AND - NCSA -) - -LICENSE_TEXTS(.yandex_meta/licenses.list.txt) +LICENSE( + MIT AND + NCSA +) +LICENSE_TEXTS(.yandex_meta/licenses.list.txt) + VERSION(5.0) OWNER( - pg - g:contrib - g:cpp-contrib + pg + g:contrib + g:cpp-contrib ) NO_UTIL() - + NO_PLATFORM() - + NO_COMPILER_WARNINGS() IF (SANITIZER_TYPE == thread) NO_SANITIZE() - CFLAGS( - -fPIC - ) -ENDIF() + CFLAGS( + -fPIC + ) +ENDIF() IF (SANITIZER_TYPE == memory) NO_SANITIZE() - CFLAGS( - -fPIC - ) -ENDIF() + CFLAGS( + -fPIC + ) +ENDIF() COMPILE_C_AS_CXX() -CXXFLAGS(-fno-exceptions) +CXXFLAGS(-fno-exceptions) SET_APPEND(CFLAGS -fno-lto) -ADDINCL( - GLOBAL contrib/libs/cxxsupp/openmp -) +ADDINCL( + GLOBAL contrib/libs/cxxsupp/openmp +) ADDINCL( contrib/libs/cxxsupp/openmp/i18n diff --git a/contrib/libs/cxxsupp/system_stl/ya.make b/contrib/libs/cxxsupp/system_stl/ya.make index 75317898ac..4f18a6f10f 100644 --- a/contrib/libs/cxxsupp/system_stl/ya.make +++ b/contrib/libs/cxxsupp/system_stl/ya.make @@ -1,13 +1,13 @@ LIBRARY() -WITHOUT_LICENSE_TEXTS() - +WITHOUT_LICENSE_TEXTS() + LICENSE(YandexOpen) OWNER( - g:contrib - g:cpp-contrib - somov + g:contrib + g:cpp-contrib + somov ) NO_PLATFORM() @@ -15,25 +15,25 @@ NO_PLATFORM() ADDINCL(GLOBAL contrib/libs/cxxsupp/system_stl/include) IF (OS_IOS OR OS_DARWIN) - LDFLAGS(-lc++) + LDFLAGS(-lc++) ELSEIF (OS_ANDROID) IF (STATIC_STL) - LDFLAGS(-l:libc++.a) + LDFLAGS(-l:libc++.a) ELSE() - LDFLAGS(-lc++) + LDFLAGS(-lc++) ENDIF() ELSE() - CFLAGS(GLOBAL -DLIBCXX_BUILDING_LIBGCC) - LDFLAGS(-lgcc_s) + CFLAGS(GLOBAL -DLIBCXX_BUILDING_LIBGCC) + LDFLAGS(-lgcc_s) # libatomic.a is needed in order to make atomic operations work LDFLAGS(-l:libatomic.a) IF (STATIC_STL) - LDFLAGS(-l:libstdc++.a) + LDFLAGS(-l:libstdc++.a) ELSE() - LDFLAGS(-lstdc++) + LDFLAGS(-lstdc++) ENDIF() -ENDIF() +ENDIF() END() diff --git a/contrib/libs/cxxsupp/ya.make b/contrib/libs/cxxsupp/ya.make index 6cd299ac8a..8042e0e372 100644 --- a/contrib/libs/cxxsupp/ya.make +++ b/contrib/libs/cxxsupp/ya.make @@ -1,7 +1,7 @@ LIBRARY() -WITHOUT_LICENSE_TEXTS() - +WITHOUT_LICENSE_TEXTS() + # Proxy library LICENSE(Not-Applicable) @@ -24,9 +24,9 @@ ELSE() ENDIF() END() - -RECURSE( + +RECURSE( libcxx - libcxxabi + libcxxabi libcxxrt -) +) |