1 /* ===-- trampoline_setup_test.c - Test __trampoline_setup -----------------=== 2 * 3 * The LLVM Compiler Infrastructure 4 * 5 * This file is dual licensed under the MIT and the University of Illinois Open 6 * Source Licenses. See LICENSE.TXT for details. 7 * 8 * ===----------------------------------------------------------------------=== 9 */ 10 11 12 #include <stdio.h> 13 #include <string.h> 14 #include <stdint.h> 15 #include <sys/mman.h> 16 17 /* 18 * Tests nested functions 19 * The ppc compiler generates a call to __trampoline_setup 20 * The i386 and x86_64 compilers generate a call to ___enable_execute_stack 21 */ 22 23 /* 24 * Note that, nested functions are not ISO C and are not supported in Clang. 25 */ 26 27 #if !defined(__clang__) 28 29 typedef int (*nested_func_t)(int x); 30 31 nested_func_t proc; 32 33 int main() { 34 /* Some locals */ 35 int c = 10; 36 int d = 7; 37 38 /* Define a nested function: */ 39 int bar(int x) { return x*5 + c*d; }; 40 41 /* Assign global to point to nested function 42 * (really points to trampoline). */ 43 proc = bar; 44 45 /* Invoke nested function: */ 46 c = 4; 47 if ( (*proc)(3) != 43 ) 48 return 1; 49 d = 5; 50 if ( (*proc)(4) != 40 ) 51 return 1; 52 53 /* Success. */ 54 return 0; 55 } 56 57 #else 58 59 int main() { 60 printf("skipped\n"); 61 return 0; 62 } 63 64 #endif 65