From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Date: Thu, 25 Oct 2018 12:28:29 +0300 From: Vladimir Davydov Subject: Re: [tarantool-patches] [PATCH 1/3] fiber: do not inline coro unwind function Message-ID: <20181025092829.bk2zhtpyeweafal2@esperanza> References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: To: Georgy Kirichenko Cc: tarantool-patches@freelists.org List-ID: On Wed, Oct 10, 2018 at 07:39:24PM +0300, Georgy Kirichenko wrote: > Call coro_unwcontext via function pointer to protect the > function from inlining. > --- > src/backtrace.cc | 7 ++++++- > 1 file changed, 6 insertions(+), 1 deletion(-) > > diff --git a/src/backtrace.cc b/src/backtrace.cc > index 2512bc045..66dcc0047 100644 > --- a/src/backtrace.cc > +++ b/src/backtrace.cc > @@ -363,12 +363,17 @@ __asm__ volatile( > #endif > } > > +typedef void (*coro_unwcontext_indirect_f)(unw_context_t *unw_context, > + struct coro_context *coro_ctx); > +/* Variable to process coro_unwcontext indirect call to avoid inlining. */ > +static volatile coro_unwcontext_indirect_f coro_unwcontext_indirect = coro_unwcontext; > + Why must not it be inlined? I think it deserves an explanation in the comment. Also, may be we'd better use NOINLINE attribute instead of function pointer? > void > backtrace_foreach(backtrace_cb cb, coro_context *coro_ctx, void *cb_ctx) > { > unw_cursor_t unw_cur; > unw_context_t unw_ctx; > - coro_unwcontext(&unw_ctx, coro_ctx); > + coro_unwcontext_indirect(&unw_ctx, coro_ctx); > unw_init_local(&unw_cur, &unw_ctx); > int frame_no = 0; > unw_word_t sp = 0, old_sp = 0, ip, offset;