Em Sun, Oct 04, 2015 at 05:16:37PM +0200, Milian Wolff escreveu:
> We cannot reverse the order of the libunwind stepper. To workaround
> this, we store the IPs in a temporary stack buffer and then walk
> this buffer in reverse order when callchain_param.order is set to
> ORDER_CALLER.
>
> Signed-off-by: Milian Wolff <[email protected]>
Jiri,
Can you please take a look at this?
- Arnaldo
> Cc: Arnaldo Carvalho de Melo <[email protected]>
> ---
> tools/perf/util/unwind-libunwind.c | 21 +++++++++++++++++----
> 1 file changed, 17 insertions(+), 4 deletions(-)
>
> diff --git a/tools/perf/util/unwind-libunwind.c
> b/tools/perf/util/unwind-libunwind.c
> index 4c00507..bf631f1 100644
> --- a/tools/perf/util/unwind-libunwind.c
> +++ b/tools/perf/util/unwind-libunwind.c
> @@ -621,11 +621,24 @@ static int get_entries(struct unwind_info *ui,
> unwind_entry_cb_t cb,
> if (ret)
> display_error(ret);
>
> - while (!ret && (unw_step(&c) > 0) && max_stack--) {
> - unw_word_t ip;
> + if (callchain_param.order == ORDER_CALLEE) {
> + while (!ret && (unw_step(&c) > 0) && max_stack--) {
> + unw_word_t ip;
>
> - unw_get_reg(&c, UNW_REG_IP, &ip);
> - ret = ip ? entry(ip, ui->thread, cb, arg) : 0;
> + unw_get_reg(&c, UNW_REG_IP, &ip);
> + ret = ip ? entry(ip, ui->thread, cb, arg) : 0;
> + }
> + } else {
> + unw_word_t ips[max_stack];
> + int i = 0;
> +
> + while ((unw_step(&c) > 0) && i < max_stack) {
> + unw_get_reg(&c, UNW_REG_IP, &ips[i]);
> + ++i;
> + }
> + max_stack = i;
> + for (i = max_stack - 1; i >= 0; --i)
> + entry(ips[i], ui->thread, cb, arg);
> }
>
> return ret;
> --
> 2.6.0
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-perf-users" in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-perf-users" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html