xref: /llvm-project/compiler-rt/test/BlocksRuntime/recursive-block.c (revision 2946cd701067404b99c39fb29dc9c74bd7193eb3)
18c1441f8SAlexey Samsonov //
2*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
3*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
4*2946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
58c1441f8SAlexey Samsonov 
68c1441f8SAlexey Samsonov #include <stdio.h>
78c1441f8SAlexey Samsonov #include <Block.h>
88c1441f8SAlexey Samsonov #include <Block_private.h>
98c1441f8SAlexey Samsonov #include <stdlib.h>
108c1441f8SAlexey Samsonov 
118c1441f8SAlexey Samsonov // CONFIG
128c1441f8SAlexey Samsonov 
138c1441f8SAlexey Samsonov 
148c1441f8SAlexey Samsonov int cumulation = 0;
158c1441f8SAlexey Samsonov 
doSomething(int i)168c1441f8SAlexey Samsonov int doSomething(int i) {
178c1441f8SAlexey Samsonov     cumulation += i;
188c1441f8SAlexey Samsonov     return cumulation;
198c1441f8SAlexey Samsonov }
208c1441f8SAlexey Samsonov 
dirtyStack()218c1441f8SAlexey Samsonov void dirtyStack() {
228c1441f8SAlexey Samsonov     int i = random();
238c1441f8SAlexey Samsonov     int j = doSomething(i);
248c1441f8SAlexey Samsonov     int k = doSomething(j);
258c1441f8SAlexey Samsonov     doSomething(i + j + k);
268c1441f8SAlexey Samsonov }
278c1441f8SAlexey Samsonov 
288c1441f8SAlexey Samsonov typedef void (^voidVoid)(void);
298c1441f8SAlexey Samsonov 
testFunction()308c1441f8SAlexey Samsonov voidVoid testFunction() {
318c1441f8SAlexey Samsonov     int i = random();
328c1441f8SAlexey Samsonov     __block voidVoid inner = ^{ doSomething(i); };
338c1441f8SAlexey Samsonov     //printf("inner, on stack, is %p\n", (void*)inner);
348c1441f8SAlexey Samsonov     /*__block*/ voidVoid outer = ^{
358c1441f8SAlexey Samsonov         //printf("will call inner block %p\n", (void *)inner);
368c1441f8SAlexey Samsonov         inner();
378c1441f8SAlexey Samsonov     };
388c1441f8SAlexey Samsonov     //printf("outer looks like: %s\n", _Block_dump(outer));
398c1441f8SAlexey Samsonov     voidVoid result = Block_copy(outer);
408c1441f8SAlexey Samsonov     //Block_release(inner);
418c1441f8SAlexey Samsonov     return result;
428c1441f8SAlexey Samsonov }
438c1441f8SAlexey Samsonov 
448c1441f8SAlexey Samsonov 
main(int argc,char ** argv)458c1441f8SAlexey Samsonov int main(int argc, char **argv) {
468c1441f8SAlexey Samsonov     voidVoid block = testFunction();
478c1441f8SAlexey Samsonov     dirtyStack();
488c1441f8SAlexey Samsonov     block();
498c1441f8SAlexey Samsonov     Block_release(block);
508c1441f8SAlexey Samsonov 
518c1441f8SAlexey Samsonov     printf("%s: success\n", argv[0]);
528c1441f8SAlexey Samsonov 
538c1441f8SAlexey Samsonov     return 0;
548c1441f8SAlexey Samsonov }
55