114e36a6a516875be61e02206c81c08a8750f340fhp.com!davidm/* libunwind - a platform-independent unwind library
214e36a6a516875be61e02206c81c08a8750f340fhp.com!davidm   Copyright (C) 2001-2002 Hewlett-Packard Co
314e36a6a516875be61e02206c81c08a8750f340fhp.com!davidm	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
414e36a6a516875be61e02206c81c08a8750f340fhp.com!davidm
514e36a6a516875be61e02206c81c08a8750f340fhp.com!davidmThis file is part of libunwind.
614e36a6a516875be61e02206c81c08a8750f340fhp.com!davidm
714e36a6a516875be61e02206c81c08a8750f340fhp.com!davidmPermission is hereby granted, free of charge, to any person obtaining
814e36a6a516875be61e02206c81c08a8750f340fhp.com!davidma copy of this software and associated documentation files (the
914e36a6a516875be61e02206c81c08a8750f340fhp.com!davidm"Software"), to deal in the Software without restriction, including
1014e36a6a516875be61e02206c81c08a8750f340fhp.com!davidmwithout limitation the rights to use, copy, modify, merge, publish,
1114e36a6a516875be61e02206c81c08a8750f340fhp.com!davidmdistribute, sublicense, and/or sell copies of the Software, and to
1214e36a6a516875be61e02206c81c08a8750f340fhp.com!davidmpermit persons to whom the Software is furnished to do so, subject to
1314e36a6a516875be61e02206c81c08a8750f340fhp.com!davidmthe following conditions:
1414e36a6a516875be61e02206c81c08a8750f340fhp.com!davidm
1514e36a6a516875be61e02206c81c08a8750f340fhp.com!davidmThe above copyright notice and this permission notice shall be
1614e36a6a516875be61e02206c81c08a8750f340fhp.com!davidmincluded in all copies or substantial portions of the Software.
1714e36a6a516875be61e02206c81c08a8750f340fhp.com!davidm
1814e36a6a516875be61e02206c81c08a8750f340fhp.com!davidmTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
1914e36a6a516875be61e02206c81c08a8750f340fhp.com!davidmEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
2014e36a6a516875be61e02206c81c08a8750f340fhp.com!davidmMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
2114e36a6a516875be61e02206c81c08a8750f340fhp.com!davidmNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
2214e36a6a516875be61e02206c81c08a8750f340fhp.com!davidmLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
2314e36a6a516875be61e02206c81c08a8750f340fhp.com!davidmOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
2414e36a6a516875be61e02206c81c08a8750f340fhp.com!davidmWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
2514e36a6a516875be61e02206c81c08a8750f340fhp.com!davidm
2614e36a6a516875be61e02206c81c08a8750f340fhp.com!davidm#ifndef UNW_REMOTE_ONLY
273eabce18b1e70c3b26975024e450977dfb4b84b9Konstantin Belousov
28093855f12a00d4eacf548db6095235f970f88305Konstantin Belousov#define UNW_LOCAL_ONLY
2914e36a6a516875be61e02206c81c08a8750f340fhp.com!davidm#include <libunwind.h>
302f9b04e9c29999d18906e37b37dcea9676df194fArun Sharma#include <libunwind_i.h>
3144a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuura#include <string.h>
3214e36a6a516875be61e02206c81c08a8750f340fhp.com!davidm
3314e36a6a516875be61e02206c81c08a8750f340fhp.com!davidm/* See glibc manual for a description of this function.  */
3414e36a6a516875be61e02206c81c08a8750f340fhp.com!davidm
352f9b04e9c29999d18906e37b37dcea9676df194fArun Sharmastatic ALWAYS_INLINE int
365f38f35d5d6c78aafa6da20845d9ceff74af00f8Lassi Tuuraslow_backtrace (void **buffer, int size, unw_context_t *uc)
377ff83c051e33de1adbcbc20bf63ea368c2745a70Arun Sharma{
387ff83c051e33de1adbcbc20bf63ea368c2745a70Arun Sharma  unw_cursor_t cursor;
397ff83c051e33de1adbcbc20bf63ea368c2745a70Arun Sharma  unw_word_t ip;
407ff83c051e33de1adbcbc20bf63ea368c2745a70Arun Sharma  int n = 0;
417ff83c051e33de1adbcbc20bf63ea368c2745a70Arun Sharma
42ae5c1f2adf4da04235d87d024d4d942c01b2b447Lassi Tuura  if (unlikely (unw_init_local (&cursor, uc) < 0))
437ff83c051e33de1adbcbc20bf63ea368c2745a70Arun Sharma    return 0;
447ff83c051e33de1adbcbc20bf63ea368c2745a70Arun Sharma
457ff83c051e33de1adbcbc20bf63ea368c2745a70Arun Sharma  while (unw_step (&cursor) > 0)
467ff83c051e33de1adbcbc20bf63ea368c2745a70Arun Sharma    {
477ff83c051e33de1adbcbc20bf63ea368c2745a70Arun Sharma      if (n >= size)
487ff83c051e33de1adbcbc20bf63ea368c2745a70Arun Sharma	return n;
497ff83c051e33de1adbcbc20bf63ea368c2745a70Arun Sharma
507ff83c051e33de1adbcbc20bf63ea368c2745a70Arun Sharma      if (unw_get_reg (&cursor, UNW_REG_IP, &ip) < 0)
517ff83c051e33de1adbcbc20bf63ea368c2745a70Arun Sharma	return n;
527ff83c051e33de1adbcbc20bf63ea368c2745a70Arun Sharma      buffer[n++] = (void *) (uintptr_t) ip;
537ff83c051e33de1adbcbc20bf63ea368c2745a70Arun Sharma    }
547ff83c051e33de1adbcbc20bf63ea368c2745a70Arun Sharma  return n;
557ff83c051e33de1adbcbc20bf63ea368c2745a70Arun Sharma}
567ff83c051e33de1adbcbc20bf63ea368c2745a70Arun Sharma
5714e36a6a516875be61e02206c81c08a8750f340fhp.com!davidmint
5850bc12afba900c478d5d760966ef5b6f32229c99Lassi Tuuraunw_backtrace (void **buffer, int size)
5914e36a6a516875be61e02206c81c08a8750f340fhp.com!davidm{
6014e36a6a516875be61e02206c81c08a8750f340fhp.com!davidm  unw_cursor_t cursor;
617ff83c051e33de1adbcbc20bf63ea368c2745a70Arun Sharma  unw_context_t uc;
6244a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuura  int n = size;
6314e36a6a516875be61e02206c81c08a8750f340fhp.com!davidm
64e2962af9d31266761700b431da894421c0d757ecArun Sharma  tdep_getcontext_trace (&uc);
6544a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuura
66ae5c1f2adf4da04235d87d024d4d942c01b2b447Lassi Tuura  if (unlikely (unw_init_local (&cursor, &uc) < 0))
6714e36a6a516875be61e02206c81c08a8750f340fhp.com!davidm    return 0;
6814e36a6a516875be61e02206c81c08a8750f340fhp.com!davidm
69ae5c1f2adf4da04235d87d024d4d942c01b2b447Lassi Tuura  if (unlikely (tdep_trace (&cursor, buffer, &n) < 0))
7014e36a6a516875be61e02206c81c08a8750f340fhp.com!davidm    {
715f38f35d5d6c78aafa6da20845d9ceff74af00f8Lassi Tuura      unw_getcontext (&uc);
725f38f35d5d6c78aafa6da20845d9ceff74af00f8Lassi Tuura      return slow_backtrace (buffer, size, &uc);
7314e36a6a516875be61e02206c81c08a8750f340fhp.com!davidm    }
7444a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuura
7514e36a6a516875be61e02206c81c08a8750f340fhp.com!davidm  return n;
7614e36a6a516875be61e02206c81c08a8750f340fhp.com!davidm}
7714e36a6a516875be61e02206c81c08a8750f340fhp.com!davidm
7850bc12afba900c478d5d760966ef5b6f32229c99Lassi Tuuraextern int backtrace (void **buffer, int size)
795e7e890a0b75fc9b64838dd197f554c6c6285d88Tommi Rantala  WEAK ALIAS(unw_backtrace);
8050bc12afba900c478d5d760966ef5b6f32229c99Lassi Tuura
8114e36a6a516875be61e02206c81c08a8750f340fhp.com!davidm#endif /* !UNW_REMOTE_ONLY */
82