Skip to content

Commit db1c858

Browse files
committed
Merge branch 'dev' into jr/abi
2 parents bb826ed + 8b8b7a9 commit db1c858

File tree

5 files changed

+113
-5
lines changed

5 files changed

+113
-5
lines changed

src/utils/io/base_file.hpp

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,13 @@ namespace internal {
1414
virtual string_view path() const = 0;
1515
virtual Result<monostate, internal_error> read_bytes(bspan buffer, off_t offset) const = 0;
1616

17-
template<typename T, typename std::enable_if<std::is_trivial<T>::value && !is_span<T>::value, int>::type = 0>
17+
template<
18+
typename T,
19+
typename std::enable_if<
20+
std::is_standard_layout<T>::value && std::is_trivially_copyable<T>::value && !is_span<T>::value,
21+
int
22+
>::type = 0
23+
>
1824
Result<T, internal_error> read(off_t offset) {
1925
T object{};
2026
auto res = read_bytes(make_bspan(object), offset);
@@ -24,7 +30,13 @@ namespace internal {
2430
return object;
2531
}
2632

27-
template<typename T, typename std::enable_if<std::is_trivial<T>::value, int>::type = 0>
33+
template<
34+
typename T,
35+
typename std::enable_if<
36+
std::is_standard_layout<T>::value && std::is_trivially_copyable<T>::value,
37+
int
38+
>::type = 0
39+
>
2840
Result<monostate, internal_error> read_span(span<T> items, off_t offset) {
2941
return read_bytes(
3042
make_span(reinterpret_cast<char*>(items.data()), reinterpret_cast<char*>(items.data() + items.size())),

src/utils/span.hpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,13 @@ namespace internal {
8282
return {begin, count};
8383
}
8484

85-
template<typename T, typename std::enable_if<std::is_trivial<T>::value && !is_span<T>::value, int>::type = 0>
85+
template<
86+
typename T,
87+
typename std::enable_if<
88+
std::is_standard_layout<T>::value && std::is_trivially_copyable<T>::value && !is_span<T>::value,
89+
int
90+
>::type = 0
91+
>
8692
span<char> make_bspan(T& object) {
8793
return span<char>(reinterpret_cast<char*>(std::addressof(object)), sizeof(object));
8894
}

src/utils/utils.hpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,13 @@ namespace internal {
147147
}
148148

149149
// TODO: Re-evaluate use of off_t
150-
template<typename T, typename std::enable_if<std::is_trivial<T>::value, int>::type = 0>
150+
template<
151+
typename T,
152+
typename std::enable_if<
153+
std::is_standard_layout<T>::value && std::is_trivially_copyable<T>::value,
154+
int
155+
>::type = 0
156+
>
151157
Result<T, internal_error> load_bytes(std::FILE* object_file, off_t offset) {
152158
T object;
153159
if(std::fseek(object_file, offset, SEEK_SET) != 0) {
@@ -210,7 +216,7 @@ namespace internal {
210216
// <= 19.23 msvc also appears to fail (but for a different reason https://godbolt.org/z/6Y5EvdWPK)
211217
// <= 19.39 msvc also has trouble with it for different reasons https://godbolt.org/z/aPPPT7z3z
212218
typename std::enable_if<
213-
std::is_standard_layout<T>::value && std::is_trivial<T>::value,
219+
std::is_standard_layout<T>::value && std::is_trivially_copyable<T>::value,
214220
int
215221
>::type = 0,
216222
typename std::enable_if<

test/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,12 @@ endmacro()
3535
add_executable(integration integration.cpp)
3636
add_executable(demo demo.cpp)
3737
add_executable(c_demo ctrace_demo.c)
38+
add_executable(link_test link_test.cpp)
3839

3940
add_test_dependencies(integration)
4041
add_test_dependencies(demo)
4142
add_test_dependencies(c_demo)
43+
add_test_dependencies(link_test)
4244

4345
if(UNIX)
4446
add_executable(signal_demo signal_demo.cpp)

test/link_test.cpp

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
#include "cpptrace/basic.hpp"
2+
#include "cpptrace/utils.hpp"
3+
#include <cpptrace/cpptrace.hpp>
4+
5+
#include <iostream>
6+
7+
// These are just here to make sure all symbols are found
8+
9+
int main() {
10+
auto r = cpptrace::raw_trace::current();
11+
r = cpptrace::raw_trace::current(0, 100);
12+
r.resolve();
13+
r.clear();
14+
r.empty();
15+
16+
auto o = cpptrace::object_trace::current();
17+
o = cpptrace::object_trace::current(0, 100);
18+
o.resolve();
19+
o.clear();
20+
o.empty();
21+
22+
auto s = cpptrace::stacktrace::current();
23+
s = cpptrace::stacktrace::current(0, 100);
24+
s.print();
25+
s.print(std::cerr);
26+
s.print(std::cerr, true);
27+
s.print_with_snippets();
28+
s.print_with_snippets(std::cerr);
29+
s.print_with_snippets(std::cerr, true);
30+
s.to_string();
31+
std::cerr<<s<<std::endl;
32+
auto f = s.frames[0];
33+
f.get_object_info();
34+
f.to_string();
35+
f.to_string(true);
36+
std::cerr<<f<<std::endl;
37+
s.clear();
38+
s.empty();
39+
40+
cpptrace::generate_raw_trace();
41+
cpptrace::generate_raw_trace(0, 100);
42+
cpptrace::generate_object_trace();
43+
cpptrace::generate_object_trace(0, 100);
44+
cpptrace::generate_trace();
45+
cpptrace::generate_trace(0, 100);
46+
47+
cpptrace::safe_generate_raw_trace(nullptr, 0, 0);
48+
cpptrace::safe_generate_raw_trace(nullptr, 0, 0, 0);
49+
50+
cpptrace::safe_object_frame sf;
51+
cpptrace::get_safe_object_frame(0, &sf);
52+
cpptrace::can_signal_safe_unwind();
53+
cpptrace::can_get_safe_object_frame();
54+
55+
cpptrace::register_jit_object(nullptr, 0);
56+
cpptrace::unregister_jit_object(nullptr);
57+
cpptrace::clear_all_jit_objects();
58+
59+
cpptrace::lazy_exception l;
60+
l.what();
61+
l.message();
62+
l.trace();
63+
64+
cpptrace::demangle("test");
65+
cpptrace::get_snippet(__FILE__, 1, 1);
66+
cpptrace::isatty(cpptrace::stderr_fileno);
67+
68+
cpptrace::register_terminate_handler();
69+
70+
cpptrace::absorb_trace_exceptions(true);
71+
72+
cpptrace::enable_inlined_call_resolution(true);
73+
74+
cpptrace::set_log_level(cpptrace::log_level::debug);
75+
cpptrace::set_log_callback([](cpptrace::log_level, const char*) {});
76+
cpptrace::use_default_stderr_logger();
77+
78+
cpptrace::experimental::set_cache_mode(cpptrace::cache_mode::hybrid);
79+
80+
cpptrace::experimental::set_dwarf_resolver_line_table_cache_size(100);
81+
cpptrace::experimental::set_dwarf_resolver_disable_aranges(true);
82+
}

0 commit comments

Comments
 (0)