1*282b3eb7SLouis Dionne // -*- C++ -*-
2*282b3eb7SLouis Dionne //===----------------------------------------------------------------------===//
3*282b3eb7SLouis Dionne //
4*282b3eb7SLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5*282b3eb7SLouis Dionne // See https://llvm.org/LICENSE.txt for license information.
6*282b3eb7SLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7*282b3eb7SLouis Dionne //
8*282b3eb7SLouis Dionne //===----------------------------------------------------------------------===//
9*282b3eb7SLouis Dionne 
10cb055e51SLouis Dionne // TODO: Figure out why this fails with Memory Sanitizer.
11cb055e51SLouis Dionne // XFAIL: msan
12cb055e51SLouis Dionne 
137fab97f3SLogan Chien #include <assert.h>
147fab97f3SLogan Chien #include <stdlib.h>
157fab97f3SLogan Chien #include <unwind.h>
167fab97f3SLogan Chien 
177fab97f3SLogan Chien #define EXPECTED_NUM_FRAMES 50
187fab97f3SLogan Chien #define NUM_FRAMES_UPPER_BOUND 100
197fab97f3SLogan Chien 
callback(_Unwind_Context * context,void * cnt)207fab97f3SLogan Chien _Unwind_Reason_Code callback(_Unwind_Context *context, void *cnt) {
216e50d93aSJonathan Roelofs   (void)context;
227fab97f3SLogan Chien   int *i = (int *)cnt;
237fab97f3SLogan Chien   ++*i;
247fab97f3SLogan Chien   if (*i > NUM_FRAMES_UPPER_BOUND) {
257fab97f3SLogan Chien     abort();
267fab97f3SLogan Chien   }
277fab97f3SLogan Chien   return _URC_NO_REASON;
287fab97f3SLogan Chien }
297fab97f3SLogan Chien 
test_backtrace()307fab97f3SLogan Chien void test_backtrace() {
317fab97f3SLogan Chien   int n = 0;
327fab97f3SLogan Chien   _Unwind_Backtrace(&callback, &n);
337fab97f3SLogan Chien   if (n < EXPECTED_NUM_FRAMES) {
347fab97f3SLogan Chien     abort();
357fab97f3SLogan Chien   }
367fab97f3SLogan Chien }
377fab97f3SLogan Chien 
test(int i)387fab97f3SLogan Chien int test(int i) {
397fab97f3SLogan Chien   if (i == 0) {
407fab97f3SLogan Chien     test_backtrace();
417fab97f3SLogan Chien     return 0;
427fab97f3SLogan Chien   } else {
437fab97f3SLogan Chien     return i + test(i - 1);
447fab97f3SLogan Chien   }
457fab97f3SLogan Chien }
467fab97f3SLogan Chien 
main(int,char **)47504bc07dSLouis Dionne int main(int, char**) {
487fab97f3SLogan Chien   int total = test(50);
497fab97f3SLogan Chien   assert(total == 1275);
50504bc07dSLouis Dionne   return 0;
517fab97f3SLogan Chien }
52