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 Chienvoid 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 Chienint 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 Dionneint main(int, char**) { 487fab97f3SLogan Chien int total = test(50); 497fab97f3SLogan Chien assert(total == 1275); 50504bc07dSLouis Dionne return 0; 517fab97f3SLogan Chien } 52