2 * Copyright (c) 2012 The Native Client Authors. All rights reserved.
3 * Use of this source code is governed by a BSD-style license that can be
4 * found in the LICENSE file.
10 /* Prototypes to disable inlining. */
11 int inner(const char *, const char *) __attribute__((noinline));
12 int middle(const char *) __attribute__((noinline));
13 int outer(char *) __attribute__((noinline));
14 int alloca_size(void) __attribute__((noinline));
17 int inner(const char *outer_local, const char *middle_frame) {
21 "inner: outer_local = %p, &local = %p, "
22 "middle_frame = %p\n",
23 outer_local, &local, middle_frame);
24 if (outer_local >= &local) {
25 int inner_below_middle = middle_frame >= &local;
26 int middle_below_outer = outer_local >= middle_frame;
27 fprintf(stderr, "inner: stack grows downwards, "
28 " middle_below_outer %d, inner_below_middle %d\n",
29 middle_below_outer, inner_below_middle);
30 return middle_below_outer && inner_below_middle;
33 int inner_above_middle = middle_frame <= &local;
34 int middle_above_outer = outer_local <= middle_frame;
35 fprintf(stderr, "inner: stack grows upwards, "
36 " middle_above_outer %d, inner_above_middle %d\n",
37 middle_above_outer, inner_above_middle);
38 return middle_above_outer && inner_above_middle;
42 int middle(const char *outer_local) {
43 const char *frame = __builtin_frame_address (0);
46 fprintf(stderr, "middle: outer_local = %p, frame = %p\n", outer_local, frame);
47 retval = inner(outer_local, frame);
48 /* fprintf also disables tail call optimization. */
49 fprintf(stderr, "middle: inner returned %d\n", retval);
53 int outer(char *dummy) {
57 fprintf(stderr, "outer: &local = %p\n", &local);
58 retval = middle(&local);
59 /* fprintf also disables tail call optimization. */
60 fprintf(stderr, "outer: middle returned %d\n", retval);
64 int alloca_size(void) {
69 char *dummy = __builtin_alloca(alloca_size());
72 fprintf(stderr, "main: dummy = %p\n", dummy);
73 retval = outer(dummy);
74 fprintf(stderr, "main: outer returned %d\n", retval);