This is needed when running the tests in Freestanding mode, where main() isn't treated specially. In Freestanding, main() doesn't get mangled as extern "C", so whatever runtime we're using fails to find the entry point. One way to solve this problem is to define a symbol alias from __Z4mainiPPc to _main, however this requires all definitions of main() to have the same mangling. Hence this commit.
65 lines
1.0 KiB
C++
65 lines
1.0 KiB
C++
#include <libunwind.h>
|
|
#include <stdlib.h>
|
|
|
|
void backtrace(int lower_bound) {
|
|
unw_context_t context;
|
|
unw_getcontext(&context);
|
|
|
|
unw_cursor_t cursor;
|
|
unw_init_local(&cursor, &context);
|
|
|
|
int n = 0;
|
|
do {
|
|
++n;
|
|
if (n > 100) {
|
|
abort();
|
|
}
|
|
} while (unw_step(&cursor) > 0);
|
|
|
|
if (n < lower_bound) {
|
|
abort();
|
|
}
|
|
}
|
|
|
|
void test1(int i) {
|
|
backtrace(i);
|
|
}
|
|
|
|
void test2(int i, int j) {
|
|
backtrace(i);
|
|
test1(j);
|
|
}
|
|
|
|
void test3(int i, int j, int k) {
|
|
backtrace(i);
|
|
test2(j, k);
|
|
}
|
|
|
|
void test_no_info() {
|
|
unw_context_t context;
|
|
unw_getcontext(&context);
|
|
|
|
unw_cursor_t cursor;
|
|
unw_init_local(&cursor, &context);
|
|
|
|
unw_proc_info_t info;
|
|
int ret = unw_get_proc_info(&cursor, &info);
|
|
if (ret != UNW_ESUCCESS)
|
|
abort();
|
|
|
|
// Set the IP to an address clearly outside any function.
|
|
unw_set_reg(&cursor, UNW_REG_IP, (unw_word_t)0);
|
|
|
|
ret = unw_get_proc_info(&cursor, &info);
|
|
if (ret != UNW_ENOINFO)
|
|
abort();
|
|
}
|
|
|
|
int main(int, char**) {
|
|
test1(1);
|
|
test2(1, 2);
|
|
test3(1, 2, 3);
|
|
test_no_info();
|
|
return 0;
|
|
}
|