rectrace.cpp
Go to the documentation of this file.
1 /*
2  * test/rectrace.cpp
3  * Copyright 2013 Google Inc. All Rights Reserved.
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining a copy
6  * of this software and associated documentation files (the "Software"), to deal
7  * in the Software without restriction, including without limitation the rights
8  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9  * copies of the Software, and to permit persons to whom the Software is
10  * furnished to do so, subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice shall be included in
13  * all copies or substantial portions of the Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21  * SOFTWARE.
22  */
23 
25 #include <stdio.h>
26 #include "test.hpp"
27 
28 using namespace backward;
29 
31 
33  if (not st.size()) {
34  st.load_here();
35  }
36 }
37 
38 int rec(stacktrace_t& st, int level) {
39  if (level <= 1) {
41  return 0;
42  }
43  return rec(st, level - 1);
44 }
45 
46 namespace toto {
47 
48 namespace titi {
49 
50  struct foo {
51 
52  union bar {
53  __attribute__((noinline))
54  static int trampoline(stacktrace_t& st, int level) {
55  return rec(st, level);
56  }
57  };
58  };
59 
60 } // namespace titi
61 
62 } // namespace toto
63 
64 TEST (recursion) {
65  { // lexical scope.
66  stacktrace_t st;
67  const int input = 3;
68  int r = toto::titi::foo::bar::trampoline(st, input);
69 
70  std::cout << "rec(" << input << ") == " << r << std::endl;
71 
72  Printer printer;
73  // printer.address = true;
74  printer.object = true;
75  printer.print(st, stdout);
76  }
77 }
78 
79 int fib(StackTrace& st, int level) {
80  if (level == 2) {
81  return 1;
82  }
83  if (level <= 1) {
85  return 0;
86  }
87  return fib(st, level - 1) + fib(st, level - 2);
88 }
89 
90 TEST (fibrecursive) {
91  StackTrace st;
92  const int input = 6;
93  int r = fib(st, input);
94 
95  std::cout << "fib(" << input << ") == " << r << std::endl;
96 
97  Printer printer;
98  printer.print(st, stdout);
99 }
backward::StackTrace
Definition: backward.hpp:1207
stacktrace_t
StackTrace stacktrace_t
Definition: rectrace.cpp:30
backward::Printer
Definition: backward.hpp:3968
TEST
TEST(recursion)
Definition: rectrace.cpp:64
end_of_our_journey
void end_of_our_journey(stacktrace_t &st)
Definition: rectrace.cpp:32
backward::StackTraceImpl::size
size_t size() const
Definition: backward.hpp:712
__attribute__
__attribute__((noinline)) void a(StackTrace &st)
Definition: stacktrace.cpp:54
backward::Printer::object
bool object
Definition: backward.hpp:3973
rec
int rec(stacktrace_t &st, int level)
Definition: rectrace.cpp:38
toto
Definition: rectrace.cpp:46
toto::titi::foo::bar
Definition: rectrace.cpp:52
backward.hpp
test.hpp
fib
int fib(StackTrace &st, int level)
Definition: rectrace.cpp:79
toto::titi::foo
Definition: rectrace.cpp:50
backward::StackTraceImpl::load_here
size_t load_here(size_t=0)
Definition: backward.hpp:714
backward::Printer::print
FILE * print(ST &st, FILE *fp=stderr)
Definition: backward.hpp:3981
backward
Definition: backward.hpp:419


backward_ros
Author(s):
autogenerated on Tue Mar 1 2022 23:50:48