/* ===-- trampoline_setup_test.c - Test __trampoline_setup -----------------=== * * The LLVM Compiler Infrastructure * * This file is dual licensed under the MIT and the University of Illinois Open * Source Licenses. See LICENSE.TXT for details. * * ===----------------------------------------------------------------------=== */ #include <stdio.h> #include <string.h> #include <stdint.h> #include <sys/mman.h> /* * Tests nested functions * The ppc compiler generates a call to __trampoline_setup * The i386 and x86_64 compilers generate a call to ___enable_execute_stack */ /* * Note that, nested functions are not ISO C and are not supported in Clang. */ #if !defined(__clang__) typedef int (*nested_func_t)(int x); nested_func_t proc; int main() { /* Some locals */ int c = 10; int d = 7; /* Define a nested function: */ int bar(int x) { return x*5 + c*d; }; /* Assign global to point to nested function * (really points to trampoline). */ proc = bar; /* Invoke nested function: */ c = 4; if ( (*proc)(3) != 43 ) return 1; d = 5; if ( (*proc)(4) != 40 ) return 1; /* Success. */ return 0; } #else int main() { printf("skipped\n"); return 0; } #endif