Skip to content
Merged
Show file tree
Hide file tree
Changes from 38 commits
Commits
Show all changes
138 commits
Select commit Hold shift + click to select a range
3891724
stacktrace initial implementation
AlexGuteniev Jan 23, 2022
9943152
fix line
AlexGuteniev Jan 23, 2022
1e0b47c
feature, missing (c), pmr
AlexGuteniev Jan 23, 2022
96ade42
x86 build
AlexGuteniev Jan 23, 2022
c480c55
header!
AlexGuteniev Jan 23, 2022
b080877
-copypasta comments
AlexGuteniev Jan 23, 2022
ec9e855
Ugly Al
AlexGuteniev Jan 23, 2022
5575f9b
_STD move
AlexGuteniev Jan 23, 2022
ec470a5
right size
AlexGuteniev Jan 23, 2022
1cb8b79
test pass
AlexGuteniev Jan 23, 2022
df9b1ba
-lines
AlexGuteniev Jan 23, 2022
603e8d7
too few [[nodiscard]]
AlexGuteniev Jan 23, 2022
115229f
hash hash
AlexGuteniev Jan 23, 2022
ab3d65b
no, removed
AlexGuteniev Jan 23, 2022
a475f02
it is overspecified to me!
AlexGuteniev Jan 23, 2022
a7e2edd
size
AlexGuteniev Jan 23, 2022
f58f476
conventions
AlexGuteniev Jan 23, 2022
20364f6
Don't pass nullptr to string ctor
AlexGuteniev Jan 23, 2022
a561b53
strengthen
AlexGuteniev Jan 24, 2022
9ddfb94
typo
AlexGuteniev Jan 24, 2022
59ee7fa
save displacement
AlexGuteniev Jan 24, 2022
8090d3d
cache only the last address and no more
AlexGuteniev Jan 24, 2022
7fb6f85
not using format yet
AlexGuteniev Jan 24, 2022
98a0793
move string conversion to .cpp
AlexGuteniev Jan 24, 2022
bca36f3
file
AlexGuteniev Jan 24, 2022
7562e13
Add module/offset
AlexGuteniev Jan 24, 2022
1de504d
Update stl/src/stacktrace.cpp
AlexGuteniev Jan 24, 2022
dfbf80a
save on locks
AlexGuteniev Jan 24, 2022
0024cbe
MAX_SYM_NAME
AlexGuteniev Jan 26, 2022
b18cb81
Phoenix
AlexGuteniev Jan 26, 2022
8326f74
switch to <DbgEng.h>
AlexGuteniev Feb 3, 2022
1e96c7a
clang format
AlexGuteniev Feb 3, 2022
2256088
fix link
AlexGuteniev Feb 3, 2022
67f96d5
Functional nightmare
AlexGuteniev Feb 5, 2022
7cc3d11
clang format
AlexGuteniev Feb 5, 2022
f098d7f
desatellite
AlexGuteniev Feb 5, 2022
dfb0700
extern C
AlexGuteniev Feb 5, 2022
03c4751
desatellite++
AlexGuteniev Feb 5, 2022
b71b67e
unused
AlexGuteniev Feb 5, 2022
ce6d007
atexit sync
AlexGuteniev Feb 5, 2022
82a6c7c
top level `const`
AlexGuteniev Feb 5, 2022
7aee461
#exclude
AlexGuteniev Feb 5, 2022
8dc8468
unextern C for exception safety
AlexGuteniev Feb 6, 2022
1cfb5c7
still extern "C"
AlexGuteniev Feb 6, 2022
5cdb7bd
build
AlexGuteniev Feb 6, 2022
d760966
Compensate '\0'
AlexGuteniev Feb 6, 2022
a9d72ec
reuse capacity
AlexGuteniev Feb 6, 2022
2186b32
noexcept
AlexGuteniev Feb 6, 2022
b1f637c
consistently exclude the current
AlexGuteniev Feb 6, 2022
49be56a
BE workaround
AlexGuteniev Feb 6, 2022
ab89b14
test
AlexGuteniev Feb 6, 2022
ab5f1e9
we are the std
AlexGuteniev Feb 6, 2022
631f375
-newline
AlexGuteniev Feb 6, 2022
284f96b
_STACKSTRACE_
AlexGuteniev Feb 6, 2022
762f72d
unnecessary void return
AlexGuteniev Feb 6, 2022
b5c7624
error safety on initialization
AlexGuteniev Feb 6, 2022
991fb2a
Load modules from the binaries dir.
AlexGuteniev Feb 6, 2022
fa99f51
clang format
AlexGuteniev Feb 6, 2022
9675d08
add escape hatch to alter interface properties
AlexGuteniev Feb 6, 2022
671993b
move initialization to avoid unnecessary attempts
AlexGuteniev Feb 6, 2022
94c6d1d
move ensure_module_symbols_loaded_from_current_dir to avoid unnecess…
AlexGuteniev Feb 6, 2022
fde7ac3
clang format
AlexGuteniev Feb 6, 2022
93d4f1c
0
AlexGuteniev Feb 6, 2022
0cf831d
fallback testing as suggested by @ben-craig
AlexGuteniev Feb 6, 2022
d97d6dc
clang format
AlexGuteniev Feb 6, 2022
caebf99
nothrowing string alloc; symbol options
AlexGuteniev Feb 7, 2022
cd85152
-white
AlexGuteniev Feb 7, 2022
1493f97
entry number:
AlexGuteniev Feb 8, 2022
9bbe0a9
zer0-based
AlexGuteniev Feb 8, 2022
91a78f0
Merge remote-tracking branch 'upstream/main' into stacktrace
AlexGuteniev Feb 14, 2022
71c68d8
add stacktrace to the new header
AlexGuteniev Feb 14, 2022
8011c27
Merge remote-tracking branch 'upstream/main' into stacktrace
AlexGuteniev Feb 17, 2022
7d5e487
thread coverage
AlexGuteniev Feb 18, 2022
f5392fd
Update tests/std/tests/P0881R7_stacktrace/test.cpp
AlexGuteniev Feb 18, 2022
5a2e9c5
Merge remote-tracking branch 'upstream/main' into stacktrace
AlexGuteniev Feb 18, 2022
a275e2e
Merge branch 'stacktrace' of https://github.com/AlexGuteniev/STL into…
AlexGuteniev Feb 18, 2022
ae83a4e
fix header units test
AlexGuteniev Feb 18, 2022
baff31a
[[maybe_useless]]
AlexGuteniev Feb 18, 2022
f82720e
Update stl/inc/stacktrace
AlexGuteniev Mar 11, 2022
8bb418a
Update stacktrace
AlexGuteniev Mar 11, 2022
d6f43d6
some review comments
AlexGuteniev Mar 11, 2022
3ac35ed
some review comments - missed parts
AlexGuteniev Mar 11, 2022
730fa69
clang format
AlexGuteniev Mar 11, 2022
c151a23
clang format
AlexGuteniev Mar 12, 2022
42d88b6
sort
AlexGuteniev Mar 12, 2022
85c76a1
remove directory populating
AlexGuteniev Mar 12, 2022
f8e0a30
header unit test
AlexGuteniev Mar 12, 2022
be59a61
more const
AlexGuteniev Mar 12, 2022
e5a31b9
_NODISCARD
AlexGuteniev Mar 14, 2022
f0e447c
Some review comments
AlexGuteniev Mar 30, 2022
c64b9b2
_NODISCARD_FRIEND
AlexGuteniev Mar 30, 2022
3a75e2d
Update tests/std/tests/P0881R7_stacktrace/test.cpp
AlexGuteniev Mar 30, 2022
f6c962b
<cstddef>
AlexGuteniev Mar 30, 2022
84ff6cb
allocator template parameter
AlexGuteniev Mar 30, 2022
cad7208
latest
AlexGuteniev Mar 30, 2022
f4534c6
comditional stacktrace
AlexGuteniev Mar 30, 2022
5190527
snprintf
AlexGuteniev Apr 1, 2022
11f38e1
|
AlexGuteniev Apr 1, 2022
5d03019
Merge branch 'main' into stacktrace
StephanTLavavej Apr 21, 2022
f793734
Code review feedback.
StephanTLavavej Apr 22, 2022
a52a4fb
Oops, remove argument_type and result_type.
StephanTLavavej Apr 22, 2022
6e9ad95
catch 'em all
AlexGuteniev May 5, 2022
ef4dbdc
Merge remote-tracking branch 'upstream/main' into stacktrace
AlexGuteniev May 27, 2022
194ff85
dynamic import
AlexGuteniev May 27, 2022
4859f12
format
AlexGuteniev May 27, 2022
c2d9ff6
Code review feedback.
StephanTLavavej May 27, 2022
2a5fbdf
explain functional nightmare
AlexGuteniev Jun 1, 2022
414c942
format
AlexGuteniev Jun 1, 2022
bf0c312
skip that actually
AlexGuteniev Jun 1, 2022
6f939fd
_nolock
AlexGuteniev Jun 1, 2022
9881073
struct
AlexGuteniev Jun 1, 2022
b855123
some review comments
AlexGuteniev Jun 1, 2022
7c1d920
-__std_stacktrace_get_debug_interface
AlexGuteniev Jun 1, 2022
6242345
fix build
AlexGuteniev Jun 1, 2022
933be57
_STL_INTERNAL_STATIC_ASSERT
AlexGuteniev Jun 1, 2022
5d813d6
more noexcept
AlexGuteniev Jun 2, 2022
0aadf48
Adjust integers
AlexGuteniev Jun 2, 2022
72d9839
fix build, exception safety
AlexGuteniev Jun 2, 2022
4e95ce4
Merge branch 'main' into stacktrace
StephanTLavavej Jun 3, 2022
7e543c3
Drop `#pragma comment`s for DbgEng.lib and Shlwapi.lib.
StephanTLavavej Jun 3, 2022
9c5af00
Mark _To_voidptr_array/_Adjust_skip as _NODISCARD/noexcept.
StephanTLavavej Jun 3, 2022
70122e6
Use SRWLOCK_INIT.
StephanTLavavej Jun 3, 2022
d0ca01a
Drop debug_symbols3.
StephanTLavavej Jun 3, 2022
eb9f444
Allow clang-format to fix indentation.
StephanTLavavej Jun 3, 2022
9ac0b65
Fix comment: _Callback is what's tested for null.
StephanTLavavej Jun 3, 2022
581cfe3
Improve comment grammar.
StephanTLavavej Jun 3, 2022
524bb81
Fuse srw_lock_guard into dbg_eng_data and use non-static member funct…
StephanTLavavej Jun 3, 2022
5071c5e
more `noexcept`
AlexGuteniev Jun 3, 2022
b6c7c6e
Call atexit() within `if (!initialize_attempted)`.
StephanTLavavej Jun 4, 2022
9354074
Mark try_initialize() as [[nodiscard]]; its return value is important.
StephanTLavavej Jun 4, 2022
afd9eeb
Update stacktrace.cpp
AlexGuteniev Jun 4, 2022
8399e65
Safer overflow handling for 32-bit platform
AlexGuteniev Jun 9, 2022
42cf248
avoid exra ctor
AlexGuteniev Jun 9, 2022
8235667
Update stl/inc/stacktrace
AlexGuteniev Jun 9, 2022
f63eb4d
Update stl/src/stacktrace.cpp
AlexGuteniev Jun 9, 2022
3547133
TCOnsistent
AlexGuteniev Jun 9, 2022
5f280d6
uniform _To_voidptr_array
AlexGuteniev Jun 9, 2022
6b6a43a
Fix internal test harness.
StephanTLavavej Jun 11, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 7 additions & 5 deletions stl/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,7 @@ set(HEADERS
${CMAKE_CURRENT_LIST_DIR}/inc/spanstream
${CMAKE_CURRENT_LIST_DIR}/inc/sstream
${CMAKE_CURRENT_LIST_DIR}/inc/stack
${CMAKE_CURRENT_LIST_DIR}/inc/stacktrace
${CMAKE_CURRENT_LIST_DIR}/inc/stdatomic.h
${CMAKE_CURRENT_LIST_DIR}/inc/stdexcept
${CMAKE_CURRENT_LIST_DIR}/inc/stop_token
Expand Down Expand Up @@ -256,6 +257,7 @@ set(IMPLIB_SOURCES
${CMAKE_CURRENT_LIST_DIR}/src/locale0_implib.cpp
${CMAKE_CURRENT_LIST_DIR}/src/nothrow.cpp
${CMAKE_CURRENT_LIST_DIR}/src/sharedmutex.cpp
${CMAKE_CURRENT_LIST_DIR}/src/stacktrace.cpp
${CMAKE_CURRENT_LIST_DIR}/src/syserror_import_lib.cpp
${CMAKE_CURRENT_LIST_DIR}/src/vector_algorithms.cpp
${CMAKE_CURRENT_LIST_DIR}/src/xonce2.cpp
Expand Down Expand Up @@ -456,7 +458,7 @@ function(add_stl_dlls D_SUFFIX THIS_CONFIG_DEFINITIONS THIS_CONFIG_COMPILE_OPTIO
target_compile_options(msvcp${D_SUFFIX}_eha_objects PRIVATE "${THIS_CONFIG_COMPILE_OPTIONS};${GL_FLAG};/EHa")

add_library(msvcp${D_SUFFIX} SHARED)
target_link_libraries(msvcp${D_SUFFIX} PRIVATE msvcp${D_SUFFIX}_eha_objects msvcp${D_SUFFIX}_objects msvcp${D_SUFFIX}_init_objects "${TOOLSET_LIB}/vcruntime${D_SUFFIX}.lib" "${TOOLSET_LIB}/msvcrt${D_SUFFIX}.lib" "ucrt${D_SUFFIX}.lib")
target_link_libraries(msvcp${D_SUFFIX} PRIVATE msvcp${D_SUFFIX}_eha_objects msvcp${D_SUFFIX}_objects msvcp${D_SUFFIX}_init_objects "${TOOLSET_LIB}/vcruntime${D_SUFFIX}.lib" "${TOOLSET_LIB}/msvcrt${D_SUFFIX}.lib" "ucrt${D_SUFFIX}.lib" "DbgEng.lib")
set_target_properties(msvcp${D_SUFFIX} PROPERTIES ARCHIVE_OUTPUT_NAME "msvcp140_base${D_SUFFIX}${VCLIBS_SUFFIX}")
set_target_properties(msvcp${D_SUFFIX} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
set_target_properties(msvcp${D_SUFFIX} PROPERTIES OUTPUT_NAME "msvcp140${D_SUFFIX}${VCLIBS_SUFFIX}")
Expand All @@ -477,7 +479,7 @@ function(add_stl_dlls D_SUFFIX THIS_CONFIG_DEFINITIONS THIS_CONFIG_COMPILE_OPTIO
target_compile_options(msvcp_1${D_SUFFIX}_objects PRIVATE "${THIS_CONFIG_COMPILE_OPTIONS};${GL_FLAG};/EHsc")

add_library(msvcp_1${D_SUFFIX} SHARED)
target_link_libraries(msvcp_1${D_SUFFIX} PRIVATE msvcp_1${D_SUFFIX}_objects msvcp${D_SUFFIX}_satellite_objects "msvcp${D_SUFFIX}" "${TOOLSET_LIB}/vcruntime${D_SUFFIX}.lib" "${TOOLSET_LIB}/msvcrt${D_SUFFIX}.lib" "ucrt${D_SUFFIX}.lib")
target_link_libraries(msvcp_1${D_SUFFIX} PRIVATE msvcp_1${D_SUFFIX}_objects msvcp${D_SUFFIX}_satellite_objects "msvcp${D_SUFFIX}" "${TOOLSET_LIB}/vcruntime${D_SUFFIX}.lib" "${TOOLSET_LIB}/msvcrt${D_SUFFIX}.lib" "ucrt${D_SUFFIX}.lib" "DbgEng.lib")
set_target_properties(msvcp_1${D_SUFFIX} PROPERTIES ARCHIVE_OUTPUT_NAME "msvcp140_1${D_SUFFIX}${VCLIBS_SUFFIX}")
set_target_properties(msvcp_1${D_SUFFIX} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
set_target_properties(msvcp_1${D_SUFFIX} PROPERTIES OUTPUT_NAME "msvcp140_1${D_SUFFIX}${VCLIBS_SUFFIX}")
Expand All @@ -490,7 +492,7 @@ function(add_stl_dlls D_SUFFIX THIS_CONFIG_DEFINITIONS THIS_CONFIG_COMPILE_OPTIO
target_link_libraries(msvcp_2${D_SUFFIX}_objects PRIVATE Boost::math)

add_library(msvcp_2${D_SUFFIX} SHARED)
target_link_libraries(msvcp_2${D_SUFFIX} PRIVATE msvcp_2${D_SUFFIX}_objects msvcp${D_SUFFIX}_satellite_objects msvcp${D_SUFFIX}_implib_objects "msvcp${D_SUFFIX}" "${TOOLSET_LIB}/vcruntime${D_SUFFIX}.lib" "${TOOLSET_LIB}/msvcrt${D_SUFFIX}.lib" "ucrt${D_SUFFIX}.lib")
target_link_libraries(msvcp_2${D_SUFFIX} PRIVATE msvcp_2${D_SUFFIX}_objects msvcp${D_SUFFIX}_satellite_objects msvcp${D_SUFFIX}_implib_objects "msvcp${D_SUFFIX}" "${TOOLSET_LIB}/vcruntime${D_SUFFIX}.lib" "${TOOLSET_LIB}/msvcrt${D_SUFFIX}.lib" "ucrt${D_SUFFIX}.lib" "DbgEng.lib")
set_target_properties(msvcp_2${D_SUFFIX} PROPERTIES ARCHIVE_OUTPUT_NAME "msvcp140_2${D_SUFFIX}${VCLIBS_SUFFIX}")
set_target_properties(msvcp_2${D_SUFFIX} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
set_target_properties(msvcp_2${D_SUFFIX} PROPERTIES OUTPUT_NAME "msvcp140_2${D_SUFFIX}${VCLIBS_SUFFIX}")
Expand All @@ -512,7 +514,7 @@ function(add_stl_dlls D_SUFFIX THIS_CONFIG_DEFINITIONS THIS_CONFIG_COMPILE_OPTIO
file(WRITE "${_ATOMIC_WAIT_DEF_NAME}" "${_ATOMIC_WAIT_DEF_CONTENTS}")

add_library(msvcp${D_SUFFIX}_atomic_wait SHARED "${_ATOMIC_WAIT_DEF_NAME}")
target_link_libraries(msvcp${D_SUFFIX}_atomic_wait PRIVATE msvcp${D_SUFFIX}_atomic_wait_objects msvcp${D_SUFFIX}_satellite_objects msvcp${D_SUFFIX}_implib_objects "msvcp${D_SUFFIX}" "${TOOLSET_LIB}/vcruntime${D_SUFFIX}.lib" "${TOOLSET_LIB}/msvcrt${D_SUFFIX}.lib" "ucrt${D_SUFFIX}.lib" "advapi32.lib")
target_link_libraries(msvcp${D_SUFFIX}_atomic_wait PRIVATE msvcp${D_SUFFIX}_atomic_wait_objects msvcp${D_SUFFIX}_satellite_objects msvcp${D_SUFFIX}_implib_objects "msvcp${D_SUFFIX}" "${TOOLSET_LIB}/vcruntime${D_SUFFIX}.lib" "${TOOLSET_LIB}/msvcrt${D_SUFFIX}.lib" "ucrt${D_SUFFIX}.lib" "advapi32.lib" "DbgEng.lib")
set_target_properties(msvcp${D_SUFFIX}_atomic_wait PROPERTIES ARCHIVE_OUTPUT_NAME "msvcp140_atomic_wait${D_SUFFIX}${VCLIBS_SUFFIX}")
set_target_properties(msvcp${D_SUFFIX}_atomic_wait PROPERTIES ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
set_target_properties(msvcp${D_SUFFIX}_atomic_wait PROPERTIES OUTPUT_NAME "${_ATOMIC_WAIT_OUTPUT_NAME}")
Expand All @@ -524,7 +526,7 @@ function(add_stl_dlls D_SUFFIX THIS_CONFIG_DEFINITIONS THIS_CONFIG_COMPILE_OPTIO
target_compile_options(msvcp${D_SUFFIX}_codecvt_ids_objects PRIVATE "${THIS_CONFIG_COMPILE_OPTIONS};${GL_FLAG};/EHsc")

add_library(msvcp${D_SUFFIX}_codecvt_ids SHARED)
target_link_libraries(msvcp${D_SUFFIX}_codecvt_ids PRIVATE msvcp${D_SUFFIX}_codecvt_ids_objects msvcp${D_SUFFIX}_satellite_objects "msvcp${D_SUFFIX}" "${TOOLSET_LIB}/vcruntime${D_SUFFIX}.lib" "${TOOLSET_LIB}/msvcrt${D_SUFFIX}.lib" "ucrt${D_SUFFIX}.lib")
target_link_libraries(msvcp${D_SUFFIX}_codecvt_ids PRIVATE msvcp${D_SUFFIX}_codecvt_ids_objects msvcp${D_SUFFIX}_satellite_objects "msvcp${D_SUFFIX}" "${TOOLSET_LIB}/vcruntime${D_SUFFIX}.lib" "${TOOLSET_LIB}/msvcrt${D_SUFFIX}.lib" "ucrt${D_SUFFIX}.lib" "DbgEng.lib")
set_target_properties(msvcp${D_SUFFIX}_codecvt_ids PROPERTIES ARCHIVE_OUTPUT_NAME "msvcp140_codecvt_ids${D_SUFFIX}${VCLIBS_SUFFIX}")
set_target_properties(msvcp${D_SUFFIX}_codecvt_ids PROPERTIES ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
set_target_properties(msvcp${D_SUFFIX}_codecvt_ids PROPERTIES OUTPUT_NAME "msvcp140${D_SUFFIX}_codecvt_ids${VCLIBS_SUFFIX}")
Expand Down
1 change: 1 addition & 0 deletions stl/inc/__msvc_all_public_headers.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,7 @@
#include <spanstream>
#include <sstream>
#include <stack>
#include <stacktrace>
#include <stdexcept>
#include <streambuf>
#include <string>
Expand Down
1 change: 1 addition & 0 deletions stl/inc/header-units.json
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@
"spanstream",
"sstream",
"stack",
"stacktrace",
"stdatomic.h",
"stdexcept",
"stop_token",
Expand Down
316 changes: 316 additions & 0 deletions stl/inc/stacktrace
Original file line number Diff line number Diff line change
@@ -0,0 +1,316 @@
// stacktrace standard header

// Copyright (c) Microsoft Corporation.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception

#pragma once
#ifndef _STACKSTRACE_
#define _STACKSTRACE_
#include <yvals_core.h>
#if _STL_COMPILER_PREPROCESSOR

#if !_HAS_CXX23
#pragma message("The contents of <stacktrace> are available only with C++23 or later.")
#else // ^^^ !_HAS_CXX23 / _HAS_CXX23 vvv

#include <cstdint>
#include <string>
#include <type_traits>
#include <vector>

#pragma pack(push, _CRT_PACKING)
#pragma warning(push, _STL_WARNING_LEVEL)
#pragma warning(disable : _STL_DISABLED_WARNINGS)
_STL_DISABLE_CLANG_WARNINGS
#pragma push_macro("new")
#undef new

using _Stacktrace_string_fill_callback = size_t (*)(char*, size_t, void* _Context);

using _Stacktrace_string_fill = size_t (*)(size_t, void* _String, void* _Context, _Stacktrace_string_fill_callback);

struct _Stacktrace_string_fill_op {
size_t operator()(char* _Data, size_t _Size) {
return _Callback(_Data, _Size, _Context);
}

_Stacktrace_string_fill_callback _Callback;
void* _Context;
};

inline size_t _Stacktrace_string_fill_impl(
size_t _Size, void* _String, void* _Context, _Stacktrace_string_fill_callback _Callback) {
static_cast<_STD string*>(_String)->resize_and_overwrite(_Size, _Stacktrace_string_fill_op{_Callback, _Context});
return static_cast<_STD string*>(_String)->size();
}

_EXTERN_C
unsigned short __stdcall __std_stacktrace_capture(
unsigned long _FramesToSkip, unsigned long _FramesToCapture, void** _BackTrace, unsigned long* _BackTraceHash);

void __stdcall __std_stacktrace_address_to_string(const void* _Address, void* _Str, _Stacktrace_string_fill _Fill);
void __stdcall __std_stacktrace_description(const void* _Address, void* _Str, _Stacktrace_string_fill _Fill);
void __stdcall __std_stacktrace_source_file(const void* _Address, void* _Str, _Stacktrace_string_fill _Fill);
[[nodiscard]] unsigned __stdcall __std_stacktrace_source_line(const void* _Address);
void __stdcall __std_stacktrace_to_string(
const void* _Addresses, size_t _Size, void* _Str, _Stacktrace_string_fill _Fill);
_END_EXTERN_C

_STD_BEGIN
class stacktrace_entry {
public:
using native_handle_type = void*;

constexpr stacktrace_entry() noexcept = default;
constexpr stacktrace_entry(const stacktrace_entry&) noexcept = default;
constexpr stacktrace_entry& operator=(const stacktrace_entry&) noexcept = default;

~stacktrace_entry() = default;

[[nodiscard]] constexpr native_handle_type native_handle() const noexcept {
return _Address;
}

[[nodiscard]] constexpr explicit operator bool() const noexcept {
return _Address != nullptr;
}

[[nodiscard]] string description() const {
string _Result;
__std_stacktrace_description(_Address, &_Result, _Stacktrace_string_fill_impl);
return _Result;
}

[[nodiscard]] string source_file() const {
string _Result;
__std_stacktrace_source_file(_Address, &_Result, _Stacktrace_string_fill_impl);
return _Result;
}

[[nodiscard]] uint_least32_t source_line() const {
return __std_stacktrace_source_line(_Address);
}

[[nodiscard]] friend constexpr bool operator==(const stacktrace_entry&, const stacktrace_entry&) noexcept = default;

[[nodiscard]] friend constexpr strong_ordering operator<=>(
const stacktrace_entry&, const stacktrace_entry&) noexcept = default;

private:
void* _Address = nullptr;
};

template <class _Al>
class basic_stacktrace {
private:
using _Frames_t = vector<stacktrace_entry, _Al>;

public:
using value_type = stacktrace_entry;
using const_reference = const value_type&;
using reference = value_type&;
using const_iterator = typename _Frames_t::const_iterator;
using iterator = const_iterator;
using reverse_iterator = _STD reverse_iterator<iterator>;
using const_reverse_iterator = _STD reverse_iterator<const_iterator>;
using difference_type = ptrdiff_t;
using size_type = size_t;
using allocator_type = _Al;

[[nodiscard]] static basic_stacktrace current(const allocator_type& _Alloc = allocator_type()) noexcept {
basic_stacktrace _Result(_Internal_t{}, _Max_frames, _Alloc);
_Result._Frames.resize(__std_stacktrace_capture(0, static_cast<unsigned long>(_Max_frames),
reinterpret_cast<void**>(_Result._Frames.data()), &_Result._Hash));
return _Result;
}

[[nodiscard]] static basic_stacktrace current(
size_type _Skip, const allocator_type& _Alloc = allocator_type()) noexcept {
basic_stacktrace _Result(_Internal_t{}, _Max_frames, _Alloc);
_Result._Frames.resize(__std_stacktrace_capture(static_cast<unsigned long>(_Skip),
static_cast<unsigned long>(_Max_frames), reinterpret_cast<void**>(_Result._Frames.data()), &_Result._Hash));
return _Result;
}

[[nodiscard]] static basic_stacktrace current(
size_type _Skip, size_type _Max_depth, const allocator_type& _Alloc = allocator_type()) noexcept {
basic_stacktrace _Result(_Internal_t{}, _Max_depth, _Alloc);
_Result._Frames.resize(__std_stacktrace_capture(static_cast<unsigned long>(_Skip),
static_cast<unsigned long>(_Max_depth), reinterpret_cast<void**>(_Result._Frames.data()), &_Result._Hash));
return _Result;
}

basic_stacktrace() noexcept(is_nothrow_default_constructible_v<allocator_type>) = default;
explicit basic_stacktrace(const allocator_type& _Alloc) noexcept : _Frames(_Alloc) {}

basic_stacktrace(const basic_stacktrace&) = default;
basic_stacktrace(basic_stacktrace&&) noexcept = default;
basic_stacktrace(const basic_stacktrace& _Other, const allocator_type& _Alloc)
: _Frames(_Other._Frames, _Alloc), _Hash(_Other._Hash) {}

basic_stacktrace(basic_stacktrace&& _Other, const allocator_type& _Alloc)
: _Frames(_STD move(_Other._Frames), _Alloc), _Hash(_Other._Hash) {}

basic_stacktrace& operator=(const basic_stacktrace&) = default;
basic_stacktrace& operator=(basic_stacktrace&&) noexcept(_Noex_move) = default;

~basic_stacktrace() = default;

[[nodiscard]] allocator_type get_allocator() const noexcept {
return _Frames.get_allocator();
}

[[nodiscard]] const_iterator begin() const noexcept {
return _Frames.cbegin();
}

[[nodiscard]] const_iterator end() const noexcept {
return _Frames.cend();
}

[[nodiscard]] const_reverse_iterator rbegin() const noexcept {
return _Frames.crbegin();
}

[[nodiscard]] const_reverse_iterator rend() const noexcept {
return _Frames.crend();
}

[[nodiscard]] const_iterator cbegin() const noexcept {
return _Frames.cbegin();
}

[[nodiscard]] const_iterator cend() const noexcept {
return _Frames.cend();
}

[[nodiscard]] const_reverse_iterator crbegin() const noexcept {
return _Frames.crbegin();
}

[[nodiscard]] const_reverse_iterator crend() const noexcept {
return _Frames.crend();
}

[[nodiscard]] bool empty() const noexcept {
return _Frames.empty();
}

[[nodiscard]] size_type size() const noexcept {
return _Frames.size();
}

[[nodiscard]] size_type max_size() const noexcept {
return _Frames.max_size();
}

[[nodiscard]] const_reference operator[](size_type _Sx) const noexcept /* strengthened */ {
return _Frames[_Sx];
}

[[nodiscard]] const_reference at(size_type _Sx) const {
return _Frames.at(_Sx);
}

template <class _Al2>
[[nodiscard]] friend bool operator==(const basic_stacktrace& _Lhs, const basic_stacktrace<_Al2>& _Rhs) noexcept {
return _Lhs._Hash == _Rhs._Hash && _Lhs._Frames == _Rhs._Frames;
}

template <class _Al2>
[[nodiscard]] friend strong_ordering operator<=>(
const basic_stacktrace& _Lhs, const basic_stacktrace<_Al2>& _Rhs) noexcept {
const auto _Result = _Lhs._Frames.size() <=> _Rhs._Frames.size();
if (_Result != strong_ordering::equal) {
return _Result;
}

return _Lhs._Frames <=> _Rhs._Frames;
}

void swap(basic_stacktrace& _Other) noexcept(
allocator_traits<_Al>::propagate_on_container_swap::value || allocator_traits<_Al>::is_always_equal::value) {
_STD swap(_Frames, _Other._Frames);
_STD swap(_Hash, _Other._Hash);
}

[[nodiscard]] unsigned long _Get_hash() const noexcept {
return _Hash;
}

[[nodiscard]] const void* _Data() const noexcept {
return _Frames.data();
}


private:
static constexpr size_t _Max_frames = 0xFFFF;

static constexpr bool _Noex_move = allocator_traits<_Al>::propagate_on_container_move_assignment::value
|| allocator_traits<_Al>::is_always_equal::value;

struct _Internal_t {};

basic_stacktrace(_Internal_t, size_type _Max_depth, const allocator_type& _Alloc) : _Frames(_Max_depth, _Alloc) {}

_Frames_t _Frames;
unsigned long _Hash = 0;
};

using stacktrace = basic_stacktrace<allocator<stacktrace_entry>>;

template <class _Al>
void swap(basic_stacktrace<_Al>& _Ax, basic_stacktrace<_Al>& _Bx) noexcept(noexcept(_Ax.swap(_Bx))) {
return _Ax.swap(_Bx);
}

[[nodiscard]] inline string to_string(const stacktrace_entry& _Fx) {
string _Result;
__std_stacktrace_address_to_string(_Fx.native_handle(), &_Result, _Stacktrace_string_fill_impl);
return _Result;
}

template <class _Al>
[[nodiscard]] string to_string(const basic_stacktrace<_Al>& _St) {
string _Result;
__std_stacktrace_to_string(_St._Data(), _St.size(), &_Result, _Stacktrace_string_fill_impl);
return _Result;
}

template <class charT, class traits>
basic_ostream<charT, traits>& operator<<(basic_ostream<charT, traits>& _Os, const stacktrace_entry& _Fx) {
return _Os << to_string(_Fx);
}

template <class charT, class traits, class _Al>
basic_ostream<charT, traits>& operator<<(basic_ostream<charT, traits>& _Os, const basic_stacktrace<_Al>& _Fx) {
return _Os << to_string(_Fx);
}

namespace pmr {
using stacktrace = basic_stacktrace<polymorphic_allocator<stacktrace_entry>>;
}

template <>
struct hash<stacktrace_entry> {
[[nodiscard]] size_t operator()(const stacktrace_entry& _Val) const noexcept {
return _Hash_representation(_Val.native_handle());
}
};

template <class _Al>
struct hash<basic_stacktrace<_Al>> {
[[nodiscard]] size_t operator()(const basic_stacktrace<_Al>& _Val) const noexcept {
return _Val._Get_hash();
}
};
_STD_END

#pragma pop_macro("new")
_STL_RESTORE_CLANG_WARNINGS
#pragma warning(pop)
#pragma pack(pop)
#endif // ^^^ _HAS_CXX23 ^^^

#endif // _STL_COMPILER_PREPROCESSOR
#endif // _STACK_
Loading