1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
  
     | 
    
      /* 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;
}
 
     |