Home | History | Annotate | Download | only in coregrind
      1 
      2 /*--------------------------------------------------------------------*/
      3 /*--- Take snapshots of client stacks.              m_stacktrace.c ---*/
      4 /*--------------------------------------------------------------------*/
      5 
      6 /*
      7    This file is part of Valgrind, a dynamic binary instrumentation
      8    framework.
      9 
     10    Copyright (C) 2000-2012 Julian Seward
     11       jseward (at) acm.org
     12 
     13    This program is free software; you can redistribute it and/or
     14    modify it under the terms of the GNU General Public License as
     15    published by the Free Software Foundation; either version 2 of the
     16    License, or (at your option) any later version.
     17 
     18    This program is distributed in the hope that it will be useful, but
     19    WITHOUT ANY WARRANTY; without even the implied warranty of
     20    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     21    General Public License for more details.
     22 
     23    You should have received a copy of the GNU General Public License
     24    along with this program; if not, write to the Free Software
     25    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
     26    02111-1307, USA.
     27 
     28    The GNU General Public License is contained in the file COPYING.
     29 */
     30 
     31 #include "pub_core_basics.h"
     32 #include "pub_core_vki.h"
     33 #include "pub_core_libcsetjmp.h"    // to keep _threadstate.h happy
     34 #include "pub_core_threadstate.h"
     35 #include "pub_core_debuginfo.h"     // XXX: circular dependency
     36 #include "pub_core_aspacemgr.h"     // For VG_(is_addressable)()
     37 #include "pub_core_libcbase.h"
     38 #include "pub_core_libcassert.h"
     39 #include "pub_core_libcprint.h"
     40 #include "pub_core_machine.h"
     41 #include "pub_core_options.h"
     42 #include "pub_core_stacks.h"        // VG_(stack_limits)
     43 #include "pub_core_stacktrace.h"
     44 #include "pub_core_xarray.h"
     45 #include "pub_core_clientstate.h"   // VG_(client__dl_sysinfo_int80)
     46 #include "pub_core_trampoline.h"
     47 
     48 
     49 /*------------------------------------------------------------*/
     50 /*---                                                      ---*/
     51 /*--- BEGIN platform-dependent unwinder worker functions   ---*/
     52 /*---                                                      ---*/
     53 /*------------------------------------------------------------*/
     54 
     55 /* Take a snapshot of the client's stack, putting up to 'max_n_ips'
     56    IPs into 'ips'.  In order to be thread-safe, we pass in the
     57    thread's IP SP, FP if that's meaningful, and LR if that's
     58    meaningful.  Returns number of IPs put in 'ips'.
     59 
     60    If you know what the thread ID for this stack is, send that as the
     61    first parameter, else send zero.  This helps generate better stack
     62    traces on ppc64-linux and has no effect on other platforms.
     63 */
     64 
     65 /* ------------------------ x86 ------------------------- */
     66 
     67 #if defined(VGP_x86_linux) || defined(VGP_x86_darwin)
     68 
     69 UInt VG_(get_StackTrace_wrk) ( ThreadId tid_if_known,
     70                                /*OUT*/Addr* ips, UInt max_n_ips,
     71                                /*OUT*/Addr* sps, /*OUT*/Addr* fps,
     72                                UnwindStartRegs* startRegs,
     73                                Addr fp_max_orig )
     74 {
     75    Bool  debug = False;
     76    Int   i;
     77    Addr  fp_max;
     78    UInt  n_found = 0;
     79 
     80    vg_assert(sizeof(Addr) == sizeof(UWord));
     81    vg_assert(sizeof(Addr) == sizeof(void*));
     82 
     83    D3UnwindRegs uregs;
     84    uregs.xip = (Addr)startRegs->r_pc;
     85    uregs.xsp = (Addr)startRegs->r_sp;
     86    uregs.xbp = startRegs->misc.X86.r_ebp;
     87    Addr fp_min = uregs.xsp;
     88 
     89    /* Snaffle IPs from the client's stack into ips[0 .. max_n_ips-1],
     90       stopping when the trail goes cold, which we guess to be
     91       when FP is not a reasonable stack location. */
     92 
     93    // JRS 2002-sep-17: hack, to round up fp_max to the end of the
     94    // current page, at least.  Dunno if it helps.
     95    // NJN 2002-sep-17: seems to -- stack traces look like 1.0.X again
     96    fp_max = VG_PGROUNDUP(fp_max_orig);
     97    if (fp_max >= sizeof(Addr))
     98       fp_max -= sizeof(Addr);
     99 
    100    if (debug)
    101       VG_(printf)("max_n_ips=%d fp_min=0x%lx fp_max_orig=0x%lx, "
    102                   "fp_max=0x%lx ip=0x%lx fp=0x%lx\n",
    103                   max_n_ips, fp_min, fp_max_orig, fp_max,
    104                   uregs.xip, uregs.xbp);
    105 
    106    /* Assertion broken before main() is reached in pthreaded programs;  the
    107     * offending stack traces only have one item.  --njn, 2002-aug-16 */
    108    /* vg_assert(fp_min <= fp_max);*/
    109    // On Darwin, this kicks in for pthread-related stack traces, so they're
    110    // only 1 entry long which is wrong.
    111 #  if !defined(VGO_darwin)
    112    if (fp_min + 512 >= fp_max) {
    113       /* If the stack limits look bogus, don't poke around ... but
    114          don't bomb out either. */
    115       if (sps) sps[0] = uregs.xsp;
    116       if (fps) fps[0] = uregs.xbp;
    117       ips[0] = uregs.xip;
    118       return 1;
    119    }
    120 #  endif
    121 
    122    /* fp is %ebp.  sp is %esp.  ip is %eip. */
    123 
    124    if (sps) sps[0] = uregs.xsp;
    125    if (fps) fps[0] = uregs.xbp;
    126    ips[0] = uregs.xip;
    127    i = 1;
    128 
    129    /* Loop unwinding the stack. Note that the IP value we get on
    130     * each pass (whether from CFI info or a stack frame) is a
    131     * return address so is actually after the calling instruction
    132     * in the calling function.
    133     *
    134     * Because of this we subtract one from the IP after each pass
    135     * of the loop so that we find the right CFI block on the next
    136     * pass - otherwise we can find the wrong CFI info if it happens
    137     * to change after the calling instruction and that will mean
    138     * that we will fail to unwind the next step.
    139     *
    140     * This most frequently happens at the end of a function when
    141     * a tail call occurs and we wind up using the CFI info for the
    142     * next function which is completely wrong.
    143     */
    144    while (True) {
    145 
    146       if (i >= max_n_ips)
    147          break;
    148 
    149       /* Try to derive a new (ip,sp,fp) triple from the current
    150          set. */
    151 
    152       /* On x86, first try the old-fashioned method of following the
    153          %ebp-chain.  Code which doesn't use this (that is, compiled
    154          with -fomit-frame-pointer) is not ABI compliant and so
    155          relatively rare.  Besides, trying the CFI first almost always
    156          fails, and is expensive. */
    157       /* Deal with frames resulting from functions which begin "pushl%
    158          ebp ; movl %esp, %ebp" which is the ABI-mandated preamble. */
    159       if (fp_min <= uregs.xbp &&
    160           uregs.xbp <= fp_max - 1 * sizeof(UWord)/*see comment below*/)
    161       {
    162          /* fp looks sane, so use it. */
    163          uregs.xip = (((UWord*)uregs.xbp)[1]);
    164          // We stop if we hit a zero (the traditional end-of-stack
    165          // marker) or a one -- these correspond to recorded IPs of 0 or -1.
    166          // The latter because r8818 (in this file) changes the meaning of
    167          // entries [1] and above in a stack trace, by subtracting 1 from
    168          // them.  Hence stacks that used to end with a zero value now end in
    169          // -1 and so we must detect that too.
    170          if (0 == uregs.xip || 1 == uregs.xip) break;
    171          uregs.xsp = uregs.xbp + sizeof(Addr) /*saved %ebp*/
    172                                + sizeof(Addr) /*ra*/;
    173          uregs.xbp = (((UWord*)uregs.xbp)[0]);
    174          if (sps) sps[i] = uregs.xsp;
    175          if (fps) fps[i] = uregs.xbp;
    176          ips[i++] = uregs.xip - 1; /* -1: refer to calling insn, not the RA */
    177          if (debug)
    178             VG_(printf)("     ipsF[%d]=0x%08lx\n", i-1, ips[i-1]);
    179          uregs.xip = uregs.xip - 1;
    180             /* as per comment at the head of this loop */
    181          continue;
    182       }
    183 
    184       /* That didn't work out, so see if there is any CF info to hand
    185          which can be used. */
    186       if ( VG_(use_CF_info)( &uregs, fp_min, fp_max ) ) {
    187          if (0 == uregs.xip || 1 == uregs.xip) break;
    188          if (sps) sps[i] = uregs.xsp;
    189          if (fps) fps[i] = uregs.xbp;
    190          ips[i++] = uregs.xip - 1; /* -1: refer to calling insn, not the RA */
    191          if (debug)
    192             VG_(printf)("     ipsC[%d]=0x%08lx\n", i-1, ips[i-1]);
    193          uregs.xip = uregs.xip - 1;
    194             /* as per comment at the head of this loop */
    195          continue;
    196       }
    197 
    198       /* And, similarly, try for MSVC FPO unwind info. */
    199       if ( VG_(use_FPO_info)( &uregs.xip, &uregs.xsp, &uregs.xbp,
    200                               fp_min, fp_max ) ) {
    201          if (0 == uregs.xip || 1 == uregs.xip) break;
    202          if (sps) sps[i] = uregs.xsp;
    203          if (fps) fps[i] = uregs.xbp;
    204          ips[i++] = uregs.xip;
    205          if (debug)
    206             VG_(printf)("     ipsC[%d]=0x%08lx\n", i-1, ips[i-1]);
    207          uregs.xip = uregs.xip - 1;
    208          continue;
    209       }
    210 
    211       /* No luck.  We have to give up. */
    212       break;
    213    }
    214 
    215    n_found = i;
    216    return n_found;
    217 }
    218 
    219 #endif
    220 
    221 /* ----------------------- amd64 ------------------------ */
    222 
    223 #if defined(VGP_amd64_linux) || defined(VGP_amd64_darwin)
    224 
    225 UInt VG_(get_StackTrace_wrk) ( ThreadId tid_if_known,
    226                                /*OUT*/Addr* ips, UInt max_n_ips,
    227                                /*OUT*/Addr* sps, /*OUT*/Addr* fps,
    228                                UnwindStartRegs* startRegs,
    229                                Addr fp_max_orig )
    230 {
    231    Bool  debug = False;
    232    Int   i;
    233    Addr  fp_max;
    234    UInt  n_found = 0;
    235 
    236    vg_assert(sizeof(Addr) == sizeof(UWord));
    237    vg_assert(sizeof(Addr) == sizeof(void*));
    238 
    239    D3UnwindRegs uregs;
    240    uregs.xip = startRegs->r_pc;
    241    uregs.xsp = startRegs->r_sp;
    242    uregs.xbp = startRegs->misc.AMD64.r_rbp;
    243    Addr fp_min = uregs.xsp;
    244 
    245    /* Snaffle IPs from the client's stack into ips[0 .. max_n_ips-1],
    246       stopping when the trail goes cold, which we guess to be
    247       when FP is not a reasonable stack location. */
    248 
    249    // JRS 2002-sep-17: hack, to round up fp_max to the end of the
    250    // current page, at least.  Dunno if it helps.
    251    // NJN 2002-sep-17: seems to -- stack traces look like 1.0.X again
    252    fp_max = VG_PGROUNDUP(fp_max_orig);
    253    if (fp_max >= sizeof(Addr))
    254       fp_max -= sizeof(Addr);
    255 
    256    if (debug)
    257       VG_(printf)("max_n_ips=%d fp_min=0x%lx fp_max_orig=0x%lx, "
    258                   "fp_max=0x%lx ip=0x%lx fp=0x%lx\n",
    259                   max_n_ips, fp_min, fp_max_orig, fp_max,
    260                   uregs.xip, uregs.xbp);
    261 
    262    /* Assertion broken before main() is reached in pthreaded programs;  the
    263     * offending stack traces only have one item.  --njn, 2002-aug-16 */
    264    /* vg_assert(fp_min <= fp_max);*/
    265    // On Darwin, this kicks in for pthread-related stack traces, so they're
    266    // only 1 entry long which is wrong.
    267 #  if !defined(VGO_darwin)
    268    if (fp_min + 256 >= fp_max) {
    269       /* If the stack limits look bogus, don't poke around ... but
    270          don't bomb out either. */
    271       if (sps) sps[0] = uregs.xsp;
    272       if (fps) fps[0] = uregs.xbp;
    273       ips[0] = uregs.xip;
    274       return 1;
    275    }
    276 #  endif
    277 
    278    /* fp is %rbp.  sp is %rsp.  ip is %rip. */
    279 
    280    ips[0] = uregs.xip;
    281    if (sps) sps[0] = uregs.xsp;
    282    if (fps) fps[0] = uregs.xbp;
    283    i = 1;
    284 
    285    /* Loop unwinding the stack. Note that the IP value we get on
    286     * each pass (whether from CFI info or a stack frame) is a
    287     * return address so is actually after the calling instruction
    288     * in the calling function.
    289     *
    290     * Because of this we subtract one from the IP after each pass
    291     * of the loop so that we find the right CFI block on the next
    292     * pass - otherwise we can find the wrong CFI info if it happens
    293     * to change after the calling instruction and that will mean
    294     * that we will fail to unwind the next step.
    295     *
    296     * This most frequently happens at the end of a function when
    297     * a tail call occurs and we wind up using the CFI info for the
    298     * next function which is completely wrong.
    299     */
    300    while (True) {
    301 
    302       if (i >= max_n_ips)
    303          break;
    304 
    305       /* Try to derive a new (ip,sp,fp) triple from the current set. */
    306 
    307       /* First off, see if there is any CFI info to hand which can
    308          be used. */
    309       if ( VG_(use_CF_info)( &uregs, fp_min, fp_max ) ) {
    310          if (0 == uregs.xip || 1 == uregs.xip) break;
    311          if (sps) sps[i] = uregs.xsp;
    312          if (fps) fps[i] = uregs.xbp;
    313          ips[i++] = uregs.xip - 1; /* -1: refer to calling insn, not the RA */
    314          if (debug)
    315             VG_(printf)("     ipsC[%d]=%#08lx\n", i-1, ips[i-1]);
    316          uregs.xip = uregs.xip - 1; /* as per comment at the head of this loop */
    317          continue;
    318       }
    319 
    320       /* If VG_(use_CF_info) fails, it won't modify ip/sp/fp, so
    321          we can safely try the old-fashioned method. */
    322       /* This bit is supposed to deal with frames resulting from
    323          functions which begin "pushq %rbp ; movq %rsp, %rbp".
    324          Unfortunately, since we can't (easily) look at the insns at
    325          the start of the fn, like GDB does, there's no reliable way
    326          to tell.  Hence the hack of first trying out CFI, and if that
    327          fails, then use this as a fallback. */
    328       /* Note: re "- 1 * sizeof(UWord)", need to take account of the
    329          fact that we are prodding at & ((UWord*)fp)[1] and so need to
    330          adjust the limit check accordingly.  Omitting this has been
    331          observed to cause segfaults on rare occasions. */
    332       if (fp_min <= uregs.xbp && uregs.xbp <= fp_max - 1 * sizeof(UWord)) {
    333          /* fp looks sane, so use it. */
    334          uregs.xip = (((UWord*)uregs.xbp)[1]);
    335          if (0 == uregs.xip || 1 == uregs.xip) break;
    336          uregs.xsp = uregs.xbp + sizeof(Addr) /*saved %rbp*/
    337                                + sizeof(Addr) /*ra*/;
    338          uregs.xbp = (((UWord*)uregs.xbp)[0]);
    339          if (sps) sps[i] = uregs.xsp;
    340          if (fps) fps[i] = uregs.xbp;
    341          ips[i++] = uregs.xip - 1; /* -1: refer to calling insn, not the RA */
    342          if (debug)
    343             VG_(printf)("     ipsF[%d]=%#08lx\n", i-1, ips[i-1]);
    344          uregs.xip = uregs.xip - 1; /* as per comment at the head of this loop */
    345          continue;
    346       }
    347 
    348       /* Last-ditch hack (evidently GDB does something similar).  We
    349          are in the middle of nowhere and we have a nonsense value for
    350          the frame pointer.  If the stack pointer is still valid,
    351          assume that what it points at is a return address.  Yes,
    352          desperate measures.  Could do better here:
    353          - check that the supposed return address is in
    354            an executable page
    355          - check that the supposed return address is just after a call insn
    356          - given those two checks, don't just consider *sp as the return
    357            address; instead scan a likely section of stack (eg sp .. sp+256)
    358            and use suitable values found there.
    359       */
    360       if (fp_min <= uregs.xsp && uregs.xsp < fp_max) {
    361          uregs.xip = ((UWord*)uregs.xsp)[0];
    362          if (0 == uregs.xip || 1 == uregs.xip) break;
    363          if (sps) sps[i] = uregs.xsp;
    364          if (fps) fps[i] = uregs.xbp;
    365          ips[i++] = uregs.xip == 0
    366                     ? 0 /* sp[0] == 0 ==> stuck at the bottom of a
    367                            thread stack */
    368                     : uregs.xip - 1;
    369                         /* -1: refer to calling insn, not the RA */
    370          if (debug)
    371             VG_(printf)("     ipsH[%d]=%#08lx\n", i-1, ips[i-1]);
    372          uregs.xip = uregs.xip - 1; /* as per comment at the head of this loop */
    373          uregs.xsp += 8;
    374          continue;
    375       }
    376 
    377       /* No luck at all.  We have to give up. */
    378       break;
    379    }
    380 
    381    n_found = i;
    382    return n_found;
    383 }
    384 
    385 #endif
    386 
    387 /* -----------------------ppc32/64 ---------------------- */
    388 
    389 #if defined(VGP_ppc32_linux) || defined(VGP_ppc64_linux)
    390 
    391 UInt VG_(get_StackTrace_wrk) ( ThreadId tid_if_known,
    392                                /*OUT*/Addr* ips, UInt max_n_ips,
    393                                /*OUT*/Addr* sps, /*OUT*/Addr* fps,
    394                                UnwindStartRegs* startRegs,
    395                                Addr fp_max_orig )
    396 {
    397    Bool  lr_is_first_RA = False;
    398 #  if defined(VG_PLAT_USES_PPCTOC)
    399    Word redir_stack_size = 0;
    400    Word redirs_used      = 0;
    401 #  endif
    402 
    403    Bool  debug = False;
    404    Int   i;
    405    Addr  fp_max;
    406    UInt  n_found = 0;
    407 
    408    vg_assert(sizeof(Addr) == sizeof(UWord));
    409    vg_assert(sizeof(Addr) == sizeof(void*));
    410 
    411    Addr ip = (Addr)startRegs->r_pc;
    412    Addr sp = (Addr)startRegs->r_sp;
    413    Addr fp = sp;
    414 #  if defined(VGP_ppc32_linux)
    415    Addr lr = startRegs->misc.PPC32.r_lr;
    416 #  elif defined(VGP_ppc64_linux)
    417    Addr lr = startRegs->misc.PPC64.r_lr;
    418 #  endif
    419    Addr fp_min = sp;
    420 
    421    /* Snaffle IPs from the client's stack into ips[0 .. max_n_ips-1],
    422       stopping when the trail goes cold, which we guess to be
    423       when FP is not a reasonable stack location. */
    424 
    425    // JRS 2002-sep-17: hack, to round up fp_max to the end of the
    426    // current page, at least.  Dunno if it helps.
    427    // NJN 2002-sep-17: seems to -- stack traces look like 1.0.X again
    428    fp_max = VG_PGROUNDUP(fp_max_orig);
    429    if (fp_max >= sizeof(Addr))
    430       fp_max -= sizeof(Addr);
    431 
    432    if (debug)
    433       VG_(printf)("max_n_ips=%d fp_min=0x%lx fp_max_orig=0x%lx, "
    434                   "fp_max=0x%lx ip=0x%lx fp=0x%lx\n",
    435 		  max_n_ips, fp_min, fp_max_orig, fp_max, ip, fp);
    436 
    437    /* Assertion broken before main() is reached in pthreaded programs;  the
    438     * offending stack traces only have one item.  --njn, 2002-aug-16 */
    439    /* vg_assert(fp_min <= fp_max);*/
    440    if (fp_min + 512 >= fp_max) {
    441       /* If the stack limits look bogus, don't poke around ... but
    442          don't bomb out either. */
    443       if (sps) sps[0] = sp;
    444       if (fps) fps[0] = fp;
    445       ips[0] = ip;
    446       return 1;
    447    }
    448 
    449    /* fp is %r1.  ip is %cia.  Note, ppc uses r1 as both the stack and
    450       frame pointers. */
    451 
    452 #  if defined(VGP_ppc64_linux)
    453    redir_stack_size = VEX_GUEST_PPC64_REDIR_STACK_SIZE;
    454    redirs_used      = 0;
    455 #  endif
    456 
    457 #  if defined(VG_PLAT_USES_PPCTOC)
    458    /* Deal with bogus LR values caused by function
    459       interception/wrapping on ppc-TOC platforms; see comment on
    460       similar code a few lines further down. */
    461    if (ULong_to_Ptr(lr) == (void*)&VG_(ppctoc_magic_redirect_return_stub)
    462        && VG_(is_valid_tid)(tid_if_known)) {
    463       Word hsp = VG_(threads)[tid_if_known].arch.vex.guest_REDIR_SP;
    464       redirs_used++;
    465       if (hsp >= 1 && hsp < redir_stack_size)
    466          lr = VG_(threads)[tid_if_known]
    467                  .arch.vex.guest_REDIR_STACK[hsp-1];
    468    }
    469 #  endif
    470 
    471    /* We have to determine whether or not LR currently holds this fn
    472       (call it F)'s return address.  It might not if F has previously
    473       called some other function, hence overwriting LR with a pointer
    474       to some part of F.  Hence if LR and IP point to the same
    475       function then we conclude LR does not hold this function's
    476       return address; instead the LR at entry must have been saved in
    477       the stack by F's prologue and so we must get it from there
    478       instead.  Note all this guff only applies to the innermost
    479       frame. */
    480    lr_is_first_RA = False;
    481    {
    482 #     define M_VG_ERRTXT 1000
    483       UChar buf_lr[M_VG_ERRTXT], buf_ip[M_VG_ERRTXT];
    484       /* The following conditional looks grossly inefficient and
    485          surely could be majorly improved, with not much effort. */
    486       if (VG_(get_fnname_raw) (lr, buf_lr, M_VG_ERRTXT))
    487          if (VG_(get_fnname_raw) (ip, buf_ip, M_VG_ERRTXT))
    488             if (VG_(strncmp)(buf_lr, buf_ip, M_VG_ERRTXT))
    489                lr_is_first_RA = True;
    490 #     undef M_VG_ERRTXT
    491    }
    492 
    493    if (sps) sps[0] = fp; /* NB. not sp */
    494    if (fps) fps[0] = fp;
    495    ips[0] = ip;
    496    i = 1;
    497 
    498    if (fp_min <= fp && fp < fp_max-VG_WORDSIZE+1) {
    499 
    500       /* initial FP is sane; keep going */
    501       fp = (((UWord*)fp)[0]);
    502 
    503       while (True) {
    504 
    505         /* On ppc64-linux (ppc64-elf, really), the lr save
    506            slot is 2 words back from sp, whereas on ppc32-elf(?) it's
    507            only one word back. */
    508 #        if defined(VG_PLAT_USES_PPCTOC)
    509          const Int lr_offset = 2;
    510 #        else
    511          const Int lr_offset = 1;
    512 #        endif
    513 
    514          if (i >= max_n_ips)
    515             break;
    516 
    517          /* Try to derive a new (ip,fp) pair from the current set. */
    518 
    519          if (fp_min <= fp && fp <= fp_max - lr_offset * sizeof(UWord)) {
    520             /* fp looks sane, so use it. */
    521 
    522             if (i == 1 && lr_is_first_RA)
    523                ip = lr;
    524             else
    525                ip = (((UWord*)fp)[lr_offset]);
    526 
    527 #           if defined(VG_PLAT_USES_PPCTOC)
    528             /* Nasty hack to do with function replacement/wrapping on
    529                ppc64-linux.  If LR points to our magic return stub,
    530                then we are in a wrapped or intercepted function, in
    531                which LR has been messed with.  The original LR will
    532                have been pushed onto the thread's hidden REDIR stack
    533                one down from the top (top element is the saved R2) and
    534                so we should restore the value from there instead.
    535                Since nested redirections can and do happen, we keep
    536                track of the number of nested LRs used by the unwinding
    537                so far with 'redirs_used'. */
    538             if (ip == (Addr)&VG_(ppctoc_magic_redirect_return_stub)
    539                 && VG_(is_valid_tid)(tid_if_known)) {
    540                Word hsp = VG_(threads)[tid_if_known]
    541                              .arch.vex.guest_REDIR_SP;
    542                hsp -= 2 * redirs_used;
    543                redirs_used ++;
    544                if (hsp >= 1 && hsp < redir_stack_size)
    545                   ip = VG_(threads)[tid_if_known]
    546                           .arch.vex.guest_REDIR_STACK[hsp-1];
    547             }
    548 #           endif
    549 
    550             if (0 == ip || 1 == ip) break;
    551             if (sps) sps[i] = fp; /* NB. not sp */
    552             if (fps) fps[i] = fp;
    553             fp = (((UWord*)fp)[0]);
    554             ips[i++] = ip - 1; /* -1: refer to calling insn, not the RA */
    555             if (debug)
    556                VG_(printf)("     ipsF[%d]=%#08lx\n", i-1, ips[i-1]);
    557             ip = ip - 1; /* ip is probably dead at this point, but
    558                             play safe, a la x86/amd64 above.  See
    559                             extensive comments above. */
    560             continue;
    561          }
    562 
    563          /* No luck there.  We have to give up. */
    564          break;
    565       }
    566    }
    567 
    568    n_found = i;
    569    return n_found;
    570 }
    571 
    572 #endif
    573 
    574 /* ------------------------ arm ------------------------- */
    575 
    576 #if defined(VGP_arm_linux)
    577 
    578 static Bool in_same_fn ( Addr a1, Addr a2 )
    579 {
    580 #  define M_VG_ERRTXT 500
    581    UChar buf_a1[M_VG_ERRTXT], buf_a2[M_VG_ERRTXT];
    582    /* The following conditional looks grossly inefficient and
    583       surely could be majorly improved, with not much effort. */
    584    if (VG_(get_fnname_raw) (a1, buf_a1, M_VG_ERRTXT))
    585       if (VG_(get_fnname_raw) (a2, buf_a2, M_VG_ERRTXT))
    586          if (VG_(strncmp)(buf_a1, buf_a2, M_VG_ERRTXT))
    587             return True;
    588 #  undef M_VG_ERRTXT
    589    return False;
    590 }
    591 
    592 static Bool in_same_page ( Addr a1, Addr a2 ) {
    593    return (a1 & ~0xFFF) == (a2 & ~0xFFF);
    594 }
    595 
    596 static Addr abs_diff ( Addr a1, Addr a2 ) {
    597    return (Addr)(a1 > a2 ? a1 - a2 : a2 - a1);
    598 }
    599 
    600 static Bool has_XT_perms ( Addr a )
    601 {
    602    NSegment const* seg = VG_(am_find_nsegment)(a);
    603    return seg && seg->hasX && seg->hasT;
    604 }
    605 
    606 static Bool looks_like_Thumb_call32 ( UShort w0, UShort w1 )
    607 {
    608    if (0)
    609       VG_(printf)("isT32call %04x %04x\n", (UInt)w0, (UInt)w1);
    610    // BL  simm26
    611    if ((w0 & 0xF800) == 0xF000 && (w1 & 0xC000) == 0xC000) return True;
    612    // BLX simm26
    613    if ((w0 & 0xF800) == 0xF000 && (w1 & 0xC000) == 0xC000) return True;
    614    return False;
    615 }
    616 
    617 static Bool looks_like_Thumb_call16 ( UShort w0 )
    618 {
    619    return False;
    620 }
    621 
    622 static Bool looks_like_ARM_call ( UInt a0 )
    623 {
    624    if (0)
    625       VG_(printf)("isA32call %08x\n", a0);
    626    // Leading E forces unconditional only -- fix
    627    if ((a0 & 0xFF000000) == 0xEB000000) return True;
    628    return False;
    629 }
    630 
    631 static Bool looks_like_RA ( Addr ra )
    632 {
    633    /* 'ra' is a plausible return address if it points to
    634        an instruction after a call insn. */
    635    Bool isT = (ra & 1);
    636    if (isT) {
    637       // returning to Thumb code
    638       ra &= ~1;
    639       ra -= 4;
    640       if (has_XT_perms(ra)) {
    641          UShort w0 = *(UShort*)ra;
    642          UShort w1 = in_same_page(ra, ra+2) ? *(UShort*)(ra+2) : 0;
    643          if (looks_like_Thumb_call16(w1) || looks_like_Thumb_call32(w0,w1))
    644             return True;
    645       }
    646    } else {
    647       // ARM
    648       ra &= ~3;
    649       ra -= 4;
    650       if (has_XT_perms(ra)) {
    651          UInt a0 = *(UInt*)ra;
    652          if (looks_like_ARM_call(a0))
    653             return True;
    654       }
    655    }
    656    return False;
    657 }
    658 
    659 UInt VG_(get_StackTrace_wrk) ( ThreadId tid_if_known,
    660                                /*OUT*/Addr* ips, UInt max_n_ips,
    661                                /*OUT*/Addr* sps, /*OUT*/Addr* fps,
    662                                UnwindStartRegs* startRegs,
    663                                Addr fp_max_orig )
    664 {
    665    Bool  debug = False;
    666    Int   i;
    667    Addr  fp_max;
    668    UInt  n_found = 0;
    669 
    670    vg_assert(sizeof(Addr) == sizeof(UWord));
    671    vg_assert(sizeof(Addr) == sizeof(void*));
    672 
    673    D3UnwindRegs uregs;
    674    uregs.r15 = startRegs->r_pc & 0xFFFFFFFE;
    675    uregs.r14 = startRegs->misc.ARM.r14;
    676    uregs.r13 = startRegs->r_sp;
    677    uregs.r12 = startRegs->misc.ARM.r12;
    678    uregs.r11 = startRegs->misc.ARM.r11;
    679    uregs.r7  = startRegs->misc.ARM.r7;
    680    Addr fp_min = uregs.r13;
    681 
    682    /* Snaffle IPs from the client's stack into ips[0 .. max_n_ips-1],
    683       stopping when the trail goes cold, which we guess to be
    684       when FP is not a reasonable stack location. */
    685 
    686    // JRS 2002-sep-17: hack, to round up fp_max to the end of the
    687    // current page, at least.  Dunno if it helps.
    688    // NJN 2002-sep-17: seems to -- stack traces look like 1.0.X again
    689    fp_max = VG_PGROUNDUP(fp_max_orig);
    690    if (fp_max >= sizeof(Addr))
    691       fp_max -= sizeof(Addr);
    692 
    693    if (debug)
    694       VG_(printf)("\nmax_n_ips=%d fp_min=0x%lx fp_max_orig=0x%lx, "
    695                   "fp_max=0x%lx r15=0x%lx r13=0x%lx\n",
    696                   max_n_ips, fp_min, fp_max_orig, fp_max,
    697                   uregs.r15, uregs.r13);
    698 
    699    /* Assertion broken before main() is reached in pthreaded programs;  the
    700     * offending stack traces only have one item.  --njn, 2002-aug-16 */
    701    /* vg_assert(fp_min <= fp_max);*/
    702    // On Darwin, this kicks in for pthread-related stack traces, so they're
    703    // only 1 entry long which is wrong.
    704    if (fp_min + 512 >= fp_max) {
    705       /* If the stack limits look bogus, don't poke around ... but
    706          don't bomb out either. */
    707       if (sps) sps[0] = uregs.r13;
    708       if (fps) fps[0] = 0;
    709       ips[0] = uregs.r15;
    710       return 1;
    711    }
    712 
    713    /* */
    714 
    715    if (sps) sps[0] = uregs.r13;
    716    if (fps) fps[0] = 0;
    717    ips[0] = uregs.r15;
    718    i = 1;
    719 
    720    /* Loop unwinding the stack. */
    721    Bool do_stack_scan = False;
    722 
    723    while (True) {
    724       if (debug) {
    725          VG_(printf)("i: %d, r15: 0x%lx, r13: 0x%lx\n",
    726                      i, uregs.r15, uregs.r13);
    727       }
    728 
    729       if (i >= max_n_ips)
    730          break;
    731 
    732       if (VG_(use_CF_info)( &uregs, fp_min, fp_max )) {
    733          if (sps) sps[i] = uregs.r13;
    734          if (fps) fps[i] = 0;
    735          ips[i++] = (uregs.r15 & 0xFFFFFFFE) - 1;
    736          if (debug)
    737             VG_(printf)("USING CFI: r15: 0x%lx, r13: 0x%lx\n",
    738                         uregs.r15, uregs.r13);
    739          uregs.r15 = (uregs.r15 & 0xFFFFFFFE) - 1;
    740          continue;
    741       }
    742       /* No luck.  We have to give up. */
    743       do_stack_scan = True;
    744       break;
    745    }
    746 
    747    if (0/*DISABLED BY DEFAULT*/ && do_stack_scan && i < max_n_ips && i <= 2) {
    748       Int  nByStackScan = 0;
    749       Addr lr = uregs.r14;
    750       Addr sp = uregs.r13 & ~3;
    751       Addr pc = uregs.r15;
    752       // First see if LR contains
    753       // something that could be a valid return address.
    754       if (!in_same_fn(lr, pc) && looks_like_RA(lr)) {
    755          // take it only if 'cand' isn't obviously a duplicate
    756          // of the last found IP value
    757          Addr cand = (lr & 0xFFFFFFFE) - 1;
    758          if (abs_diff(cand, ips[i-1]) > 1) {
    759             if (sps) sps[i] = 0;
    760             if (fps) fps[i] = 0;
    761             ips[i++] = cand;
    762             nByStackScan++;
    763          }
    764       }
    765       while (in_same_page(sp, uregs.r13)) {
    766          if (i >= max_n_ips)
    767             break;
    768          // we're in the same page; fairly safe to keep going
    769          UWord w = *(UWord*)(sp & ~0x3);
    770          if (looks_like_RA(w)) {
    771             Addr cand = (w & 0xFFFFFFFE) - 1;
    772             // take it only if 'cand' isn't obviously a duplicate
    773             // of the last found IP value
    774             if (abs_diff(cand, ips[i-1]) > 1) {
    775                if (sps) sps[i] = 0;
    776                if (fps) fps[i] = 0;
    777                ips[i++] = cand;
    778                if (++nByStackScan >= 5) break;
    779             }
    780          }
    781          sp += 4;
    782       }
    783    }
    784 
    785    n_found = i;
    786    return n_found;
    787 }
    788 
    789 #endif
    790 
    791 /* ------------------------ s390x ------------------------- */
    792 
    793 #if defined(VGP_s390x_linux)
    794 
    795 UInt VG_(get_StackTrace_wrk) ( ThreadId tid_if_known,
    796                                /*OUT*/Addr* ips, UInt max_n_ips,
    797                                /*OUT*/Addr* sps, /*OUT*/Addr* fps,
    798                                UnwindStartRegs* startRegs,
    799                                Addr fp_max_orig )
    800 {
    801    Bool  debug = False;
    802    Int   i;
    803    Addr  fp_max;
    804    UInt  n_found = 0;
    805 
    806    vg_assert(sizeof(Addr) == sizeof(UWord));
    807    vg_assert(sizeof(Addr) == sizeof(void*));
    808 
    809    D3UnwindRegs uregs;
    810    uregs.ia = startRegs->r_pc;
    811    uregs.sp = startRegs->r_sp;
    812    Addr fp_min = uregs.sp;
    813    uregs.fp = startRegs->misc.S390X.r_fp;
    814    uregs.lr = startRegs->misc.S390X.r_lr;
    815 
    816    fp_max = VG_PGROUNDUP(fp_max_orig);
    817    if (fp_max >= sizeof(Addr))
    818       fp_max -= sizeof(Addr);
    819 
    820    if (debug)
    821       VG_(printf)("max_n_ips=%d fp_min=0x%lx fp_max_orig=0x%lx, "
    822                   "fp_max=0x%lx IA=0x%lx SP=0x%lx FP=0x%lx\n",
    823                   max_n_ips, fp_min, fp_max_orig, fp_max,
    824                   uregs.ia, uregs.sp,uregs.fp);
    825 
    826    /* The first frame is pretty obvious */
    827    ips[0] = uregs.ia;
    828    if (sps) sps[0] = uregs.sp;
    829    if (fps) fps[0] = uregs.fp;
    830    i = 1;
    831 
    832    /* for everything else we have to rely on the eh_frame. gcc defaults to
    833       not create a backchain and all the other  tools (like gdb) also have
    834       to use the CFI. */
    835    while (True) {
    836       if (i >= max_n_ips)
    837          break;
    838 
    839       if (VG_(use_CF_info)( &uregs, fp_min, fp_max )) {
    840          if (sps) sps[i] = uregs.sp;
    841          if (fps) fps[i] = uregs.fp;
    842          ips[i++] = uregs.ia - 1;
    843          uregs.ia = uregs.ia - 1;
    844          continue;
    845       }
    846       /* A problem on the first frame? Lets assume it was a bad jump.
    847          We will use the link register and the current stack and frame
    848          pointers and see if we can use the CFI in the next round. */
    849       if (i == 1) {
    850          if (sps) {
    851             sps[i] = sps[0];
    852             uregs.sp = sps[0];
    853          }
    854          if (fps) {
    855             fps[i] = fps[0];
    856             uregs.fp = fps[0];
    857          }
    858          uregs.ia = uregs.lr - 1;
    859          ips[i++] = uregs.lr - 1;
    860          continue;
    861       }
    862 
    863       /* No luck.  We have to give up. */
    864       break;
    865    }
    866 
    867    n_found = i;
    868    return n_found;
    869 }
    870 
    871 #endif
    872 
    873 /* ------------------------ mips 32------------------------- */
    874 
    875 #if defined(VGP_mips32_linux)
    876 
    877 UInt VG_(get_StackTrace_wrk) ( ThreadId tid_if_known,
    878                                /*OUT*/Addr* ips, UInt max_n_ips,
    879                                /*OUT*/Addr* sps, /*OUT*/Addr* fps,
    880                                UnwindStartRegs* startRegs,
    881                                Addr fp_max_orig )
    882 {
    883    Bool  debug = False;
    884    Int   i;
    885    Addr  fp_max;
    886    UInt  n_found = 0;
    887 
    888    vg_assert(sizeof(Addr) == sizeof(UWord));
    889    vg_assert(sizeof(Addr) == sizeof(void*));
    890 
    891    D3UnwindRegs uregs;
    892    uregs.pc = startRegs->r_pc;
    893    uregs.sp = startRegs->r_sp;
    894    Addr fp_min = uregs.sp;
    895 
    896    uregs.fp = startRegs->misc.MIPS32.r30;
    897    uregs.ra = startRegs->misc.MIPS32.r31;
    898 
    899    /* Snaffle IPs from the client's stack into ips[0 .. max_n_ips-1],
    900       stopping when the trail goes cold, which we guess to be
    901       when FP is not a reasonable stack location. */
    902 
    903    fp_max = VG_PGROUNDUP(fp_max_orig);
    904    if (fp_max >= sizeof(Addr))
    905       fp_max -= sizeof(Addr);
    906 
    907    if (debug)
    908       VG_(printf)("max_n_ips=%d fp_min=0x%lx fp_max_orig=0x%lx, "
    909                   "fp_max=0x%lx pc=0x%lx sp=0x%lx fp=0x%lx\n",
    910                   max_n_ips, fp_min, fp_max_orig, fp_max,
    911                   uregs.pc, uregs.sp, uregs.fp);
    912 
    913    if (sps) sps[0] = uregs.sp;
    914    if (fps) fps[0] = uregs.fp;
    915    ips[0] = uregs.pc;
    916    i = 1;
    917 
    918    /* Loop unwinding the stack. */
    919 
    920    while (True) {
    921       if (debug) {
    922          VG_(printf)("i: %d, pc: 0x%lx, sp: 0x%lx, ra: 0x%lx\n",
    923                      i, uregs.pc, uregs.sp, uregs.ra);
    924       }
    925       if (i >= max_n_ips)
    926          break;
    927 
    928       if (VG_(use_CF_info)( &uregs, fp_min, fp_max )) {
    929          if (debug)
    930             VG_(printf)("USING CFI: pc: 0x%lx, sp: 0x%lx, ra: 0x%lx\n",
    931                         uregs.pc, uregs.sp, uregs.ra);
    932          if (0 == uregs.pc || 1 == uregs.pc) break;
    933          if (sps) sps[i] = uregs.sp;
    934          if (fps) fps[i] = uregs.fp;
    935          ips[i++] = uregs.pc - 4;
    936          uregs.pc = uregs.pc - 4;
    937          continue;
    938       }
    939 
    940       int seen_sp_adjust = 0;
    941       long frame_offset = 0;
    942       PtrdiffT offset;
    943       if (VG_(get_inst_offset_in_function)(uregs.pc, &offset)) {
    944          Addr start_pc = uregs.pc - offset;
    945          Addr limit_pc = uregs.pc;
    946          Addr cur_pc;
    947          for (cur_pc = start_pc; cur_pc < limit_pc; cur_pc += 4) {
    948             unsigned long inst, high_word, low_word;
    949             unsigned long * cur_inst;
    950             int reg;
    951             /* Fetch the instruction.   */
    952             cur_inst = (unsigned long *)cur_pc;
    953             inst = *((UInt *) cur_inst);
    954             if(debug)
    955                VG_(printf)("cur_pc: 0x%lx, inst: 0x%lx\n", cur_pc, inst);
    956 
    957             /* Save some code by pre-extracting some useful fields.  */
    958             high_word = (inst >> 16) & 0xffff;
    959             low_word = inst & 0xffff;
    960             reg = high_word & 0x1f;
    961 
    962             if (high_word == 0x27bd        /* addiu $sp,$sp,-i */
    963                 || high_word == 0x23bd     /* addi $sp,$sp,-i */
    964                 || high_word == 0x67bd) {  /* daddiu $sp,$sp,-i */
    965                if (low_word & 0x8000)	/* negative stack adjustment? */
    966                   frame_offset += 0x10000 - low_word;
    967                else
    968                   /* Exit loop if a positive stack adjustment is found, which
    969                      usually means that the stack cleanup code in the function
    970                      epilogue is reached.  */
    971                break;
    972             seen_sp_adjust = 1;
    973             }
    974          }
    975          if(debug)
    976             VG_(printf)("offset: 0x%lx\n", frame_offset);
    977       }
    978       if (seen_sp_adjust) {
    979          if (0 == uregs.pc || 1 == uregs.pc) break;
    980          if (uregs.pc == uregs.ra - 8) break;
    981          if (sps) {
    982             sps[i] = uregs.sp + frame_offset;
    983          }
    984          uregs.sp = uregs.sp + frame_offset;
    985 
    986          if (fps) {
    987             fps[i] = fps[0];
    988             uregs.fp = fps[0];
    989          }
    990          if (0 == uregs.ra || 1 == uregs.ra) break;
    991          uregs.pc = uregs.ra - 8;
    992          ips[i++] = uregs.ra - 8;
    993          continue;
    994       }
    995 
    996       if (i == 1) {
    997          if (sps) {
    998             sps[i] = sps[0];
    999             uregs.sp = sps[0];
   1000          }
   1001          if (fps) {
   1002             fps[i] = fps[0];
   1003             uregs.fp = fps[0];
   1004          }
   1005          if (0 == uregs.ra || 1 == uregs.ra) break;
   1006          uregs.pc = uregs.ra - 8;
   1007          ips[i++] = uregs.ra - 8;
   1008          continue;
   1009       }
   1010       /* No luck.  We have to give up. */
   1011       break;
   1012    }
   1013 
   1014    n_found = i;
   1015    return n_found;
   1016 }
   1017 
   1018 #endif
   1019 
   1020 
   1021 /*------------------------------------------------------------*/
   1022 /*---                                                      ---*/
   1023 /*--- END platform-dependent unwinder worker functions     ---*/
   1024 /*---                                                      ---*/
   1025 /*------------------------------------------------------------*/
   1026 
   1027 /*------------------------------------------------------------*/
   1028 /*--- Exported functions.                                  ---*/
   1029 /*------------------------------------------------------------*/
   1030 
   1031 UInt VG_(get_StackTrace) ( ThreadId tid,
   1032                            /*OUT*/StackTrace ips, UInt max_n_ips,
   1033                            /*OUT*/StackTrace sps,
   1034                            /*OUT*/StackTrace fps,
   1035                            Word first_ip_delta )
   1036 {
   1037    /* Get the register values with which to start the unwind. */
   1038    UnwindStartRegs startRegs;
   1039    VG_(memset)( &startRegs, 0, sizeof(startRegs) );
   1040    VG_(get_UnwindStartRegs)( &startRegs, tid );
   1041 
   1042    Addr stack_highest_word = VG_(threads)[tid].client_stack_highest_word;
   1043    Addr stack_lowest_word  = 0;
   1044 
   1045 #  if defined(VGP_x86_linux)
   1046    /* Nasty little hack to deal with syscalls - if libc is using its
   1047       _dl_sysinfo_int80 function for syscalls (the TLS version does),
   1048       then ip will always appear to be in that function when doing a
   1049       syscall, not the actual libc function doing the syscall.  This
   1050       check sees if IP is within that function, and pops the return
   1051       address off the stack so that ip is placed within the library
   1052       function calling the syscall.  This makes stack backtraces much
   1053       more useful.
   1054 
   1055       The function is assumed to look like this (from glibc-2.3.6 sources):
   1056          _dl_sysinfo_int80:
   1057             int $0x80
   1058             ret
   1059       That is 3 (2+1) bytes long.  We could be more thorough and check
   1060       the 3 bytes of the function are as expected, but I can't be
   1061       bothered.
   1062    */
   1063    if (VG_(client__dl_sysinfo_int80) != 0 /* we know its address */
   1064        && startRegs.r_pc >= VG_(client__dl_sysinfo_int80)
   1065        && startRegs.r_pc < VG_(client__dl_sysinfo_int80)+3
   1066        && VG_(am_is_valid_for_client)(startRegs.r_pc, sizeof(Addr),
   1067                                       VKI_PROT_READ)) {
   1068       startRegs.r_pc  = (ULong) *(Addr*)(UWord)startRegs.r_sp;
   1069       startRegs.r_sp += (ULong) sizeof(Addr);
   1070    }
   1071 #  endif
   1072 
   1073    /* See if we can get a better idea of the stack limits */
   1074    VG_(stack_limits)( (Addr)startRegs.r_sp,
   1075                       &stack_lowest_word, &stack_highest_word );
   1076 
   1077    /* Take into account the first_ip_delta. */
   1078    startRegs.r_pc += (Long)(Word)first_ip_delta;
   1079 
   1080    if (0)
   1081       VG_(printf)("tid %d: stack_highest=0x%08lx ip=0x%010llx "
   1082                   "sp=0x%010llx\n",
   1083 		  tid, stack_highest_word,
   1084                   startRegs.r_pc, startRegs.r_sp);
   1085 
   1086    return VG_(get_StackTrace_wrk)(tid, ips, max_n_ips,
   1087                                        sps, fps,
   1088                                        &startRegs,
   1089                                        stack_highest_word);
   1090 }
   1091 
   1092 static void printIpDesc(UInt n, Addr ip, void* uu_opaque)
   1093 {
   1094    #define BUF_LEN   4096
   1095 
   1096    static UChar buf[BUF_LEN];
   1097 
   1098    VG_(describe_IP)(ip, buf, BUF_LEN);
   1099 
   1100    if (VG_(clo_xml)) {
   1101       VG_(printf_xml)("    %s\n", buf);
   1102    } else {
   1103       VG_(message)(Vg_UserMsg, "   %s %s\n", ( n == 0 ? "at" : "by" ), buf);
   1104    }
   1105 }
   1106 
   1107 /* Print a StackTrace. */
   1108 void VG_(pp_StackTrace) ( StackTrace ips, UInt n_ips )
   1109 {
   1110    vg_assert( n_ips > 0 );
   1111 
   1112    if (VG_(clo_xml))
   1113       VG_(printf_xml)("  <stack>\n");
   1114 
   1115    VG_(apply_StackTrace)( printIpDesc, NULL, ips, n_ips );
   1116 
   1117    if (VG_(clo_xml))
   1118       VG_(printf_xml)("  </stack>\n");
   1119 }
   1120 
   1121 /* Get and immediately print a StackTrace. */
   1122 void VG_(get_and_pp_StackTrace) ( ThreadId tid, UInt max_n_ips )
   1123 {
   1124    Addr ips[max_n_ips];
   1125    UInt n_ips
   1126       = VG_(get_StackTrace)(tid, ips, max_n_ips,
   1127                             NULL/*array to dump SP values in*/,
   1128                             NULL/*array to dump FP values in*/,
   1129                             0/*first_ip_delta*/);
   1130    VG_(pp_StackTrace)(ips, n_ips);
   1131 }
   1132 
   1133 void VG_(apply_StackTrace)(
   1134         void(*action)(UInt n, Addr ip, void* opaque),
   1135         void* opaque,
   1136         StackTrace ips, UInt n_ips
   1137      )
   1138 {
   1139    Bool main_done = False;
   1140    Int i = 0;
   1141 
   1142    vg_assert(n_ips > 0);
   1143    do {
   1144       Addr ip = ips[i];
   1145 
   1146       // Stop after the first appearance of "main" or one of the other names
   1147       // (the appearance of which is a pretty good sign that we've gone past
   1148       // main without seeing it, for whatever reason)
   1149       if ( ! VG_(clo_show_below_main) ) {
   1150          Vg_FnNameKind kind = VG_(get_fnname_kind_from_IP)(ip);
   1151          if (Vg_FnNameMain == kind || Vg_FnNameBelowMain == kind) {
   1152             main_done = True;
   1153          }
   1154       }
   1155 
   1156       // Act on the ip
   1157       action(i, ip, opaque);
   1158 
   1159       i++;
   1160    } while (i < n_ips && !main_done);
   1161 
   1162    #undef MYBUF_LEN
   1163 }
   1164 
   1165 
   1166 /*--------------------------------------------------------------------*/
   1167 /*--- end                                                          ---*/
   1168 /*--------------------------------------------------------------------*/
   1169