Daniel Jacobowitz | 3842dac | 2008-02-04 17:16:37 -0700 | [diff] [blame] | 1 | /* libunwind - a platform-independent unwind library |
| 2 | Copyright (C) 2008 CodeSourcery |
| 3 | |
| 4 | This file is part of libunwind. |
| 5 | |
| 6 | Permission is hereby granted, free of charge, to any person obtaining |
| 7 | a copy of this software and associated documentation files (the |
| 8 | "Software"), to deal in the Software without restriction, including |
| 9 | without limitation the rights to use, copy, modify, merge, publish, |
| 10 | distribute, sublicense, and/or sell copies of the Software, and to |
| 11 | permit persons to whom the Software is furnished to do so, subject to |
| 12 | the following conditions: |
| 13 | |
| 14 | The above copyright notice and this permission notice shall be |
| 15 | included in all copies or substantial portions of the Software. |
| 16 | |
| 17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
| 18 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
| 19 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
| 20 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE |
| 21 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION |
| 22 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION |
| 23 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ |
| 24 | |
| 25 | #include "unwind_i.h" |
| 26 | #include "offsets.h" |
| 27 | |
| 28 | PROTECTED int |
| 29 | unw_step (unw_cursor_t *cursor) |
| 30 | { |
| 31 | struct cursor *c = (struct cursor *) cursor; |
| 32 | int ret; |
| 33 | |
| 34 | Debug (1, "(cursor=%p)\n", c); |
| 35 | |
| 36 | /* Try DWARF-based unwinding... this is the only method likely to work for |
| 37 | ARM. */ |
| 38 | ret = dwarf_step (&c->dwarf); |
| 39 | |
| 40 | if (unlikely (ret == -UNW_ESTOPUNWIND)) |
| 41 | return ret; |
| 42 | |
| 43 | /* Dwarf unwinding didn't work, stop. */ |
| 44 | if (unlikely (ret < 0)) |
| 45 | return 0; |
| 46 | |
| 47 | return (c->dwarf.ip == 0) ? 0 : 1; |
| 48 | } |