/* Taken from memcheck/tests/inlinfo.c almost verbatim; * only main() renamed to main_nested(). */ #include "../../memcheck.h" #define INLINE static inline __attribute__((always_inline)) INLINE int fun_d(int argd) { static int locd = 0; if (argd > 0) locd += argd; return locd; } INLINE int fun_c(int argc) { static int locc = 0; locc += argc; return fun_d(locc); } INLINE int fun_b(int argb) { static int locb = 0; locb += argb; return fun_c(locb); } INLINE int fun_a(int arga) { static int loca = 0; loca += arga; return fun_b(loca); } __attribute__((noinline)) static int fun_noninline_m(int argm) { return fun_d(argm); } __attribute__((noinline)) static int fun_noninline_o(int argo) { static int loco = 0; if (argo > 0) loco += argo; return loco; } INLINE int fun_f(int argf) { static int locf = 0; locf += argf; return fun_noninline_o(locf); } INLINE int fun_e(int arge) { static int loce = 0; loce += arge; return fun_f(loce); } __attribute__((noinline)) static int fun_noninline_n(int argn) { return fun_e(argn); } int main_nested(void) { int result; result = fun_a(result); VALGRIND_MAKE_MEM_UNDEFINED(&result, sizeof(result)); result += fun_noninline_m(result); VALGRIND_MAKE_MEM_UNDEFINED(&result, sizeof(result)); result += fun_d(result); VALGRIND_MAKE_MEM_UNDEFINED(&result, sizeof(result)); result += fun_noninline_n(result); return 0; }