From: "Wang, Yanzhang" <yanzhang.wang@intel.com>
To: Jeff Law <jeffreyalaw@gmail.com>,
"gcc-patches@gcc.gnu.org" <gcc-patches@gcc.gnu.org>
Cc: "juzhe.zhong@rivai.ai" <juzhe.zhong@rivai.ai>,
"kito.cheng@sifive.com" <kito.cheng@sifive.com>,
"Li, Pan2" <pan2.li@intel.com>
Subject: RE: [PATCH] RISCV: Add -m(no)-omit-leaf-frame-pointer support.
Date: Wed, 7 Jun 2023 03:50:14 +0000 [thread overview]
Message-ID: <IA1PR11MB646644384E3EE4771832D12CF253A@IA1PR11MB6466.namprd11.prod.outlook.com> (raw)
In-Reply-To: <e2d1bf0e-7f3e-7308-cc39-74e075b41e4e@gmail.com>
Hi Jeff,
Thanks your comments. I have few questions that I don't quite understand.
> One of the things that needs to be upstreamed is long jump support within
> a function. Essentially once a function reaches 1M in size we have the
> real possibility that a direct jump may not reach its target.
>
> To support this I expect that $ra is going to become a fixed register (ie,
> not available to the register allocator as a temporary). It'll be used
> as a scratch register for long jump sequences.
>
> One of the consequences of this is $ra will need to be saved in leaf
> functions that are near or over 1M in size.
>
> Note that at the time when we have to lay out the stack, we do not know
> the precise length of the function. So there's a degree of "fuzz" in the
> decision whether or not to save $ra in a function that is close to the 1M
> limit.
Do you mean that, long jump to more than 1M offset will need multiple jal
and each jal will save the $ra ?
If yes, I'm confused about what's the influence of the $ra saving for
function prologue. We will save the fp+ra at the prologue, the next $ra
saving seems will not modify the $ra already saved.
> I don't think you can reliably know if $ra is valid in an arbitrary leaf
> function or not. You could implement some heuristics by looking at the
> symbol table (which I'm guessing you don't want to do) or by
> disassembling the prologue (again, I'm guessing you don't want to do that
> either).
I think it's yes (not valid) when we want to get the return address to parent
function from $ra directly in the function body. But we can get the right
return address from fp with offset if we save them at prologue, is it right ?
> Meaning that what you really want is to be using -fno-omit-frame-pointer
> and for $ra to always be saved in the stack, even in a leaf function.
This is also another solution but will change the default behavior of
-fno-omit-frame-pointer.
> Presumably you're not suggesting any of these options be used in general
> -- they're going to be used for things like embedded devices or firmware?
> Also note there are low overhead unwinding schemes out there that are
> already supported in various tools -- ORC & SFRAME come
> immediately to mind. Those may be better than building a bespoke
> solution for the embedded space.
Yes. You're right, I forget to introduce background of the requirement. It
will be used in the firmware where the dwarf or unwinding maybe not acceptable.
Yanzhang
> -----Original Message-----
> From: Jeff Law <jeffreyalaw@gmail.com>
> Sent: Wednesday, June 7, 2023 10:13 AM
> To: Wang, Yanzhang <yanzhang.wang@intel.com>; gcc-patches@gcc.gnu.org
> Cc: juzhe.zhong@rivai.ai; kito.cheng@sifive.com; Li, Pan2
> <pan2.li@intel.com>
> Subject: Re: [PATCH] RISCV: Add -m(no)-omit-leaf-frame-pointer support.
>
>
>
> On 6/4/23 20:49, Wang, Yanzhang wrote:
> > Hi Jeff,
> >
> > Yes, there's a requirement to support backtrace based on the fp+ra.
> > And the unwind/cfa is not acceptable because it will add additional
> > sections to the binary. Currently, -fno-omit-frame-pointer can not
> > save the ra for the leaf function. So we need to add another option
> > like ARM/X86 to support consistent fp+ra stack layout for the leaf and
> > non-leaf functions.
> One of the things that needs to be upstreamed is long jump support within
> a function. Essentially once a function reaches 1M in size we have the
> real possibility that a direct jump may not reach its target.
>
> To support this I expect that $ra is going to become a fixed register (ie,
> not available to the register allocator as a temporary). It'll be used
> as a scratch register for long jump sequences.
>
> One of the consequences of this is $ra will need to be saved in leaf
> functions that are near or over 1M in size.
>
> Note that at the time when we have to lay out the stack, we do not know
> the precise length of the function. So there's a degree of "fuzz" in the
> decision whether or not to save $ra in a function that is close to the 1M
> limit.
>
> I don't think you can reliably know if $ra is valid in an arbitrary leaf
> function or not. You could implement some heuristics by looking at the
> symbol table (which I'm guessing you don't want to do) or by
> disassembling the prologue (again, I'm guessing you don't want to do that
> either).
>
> Meaning that what you really want is to be using -fno-omit-frame-pointer
> and for $ra to always be saved in the stack, even in a leaf function.
>
> Presumably you're not suggesting any of these options be used in general
> -- they're going to be used for things like embedded devices or firmware?
> Also note there are low overhead unwinding schemes out there that are
> already supported in various tools -- ORC & SFRAME come
> immediately to mind. Those may be better than building a bespoke
> solution for the embedded space.
>
>
>
> Jeff
next prev parent reply other threads:[~2023-06-07 3:50 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-06-02 7:07 yanzhang.wang
2023-06-03 2:43 ` Jeff Law
2023-06-05 2:49 ` Wang, Yanzhang
2023-06-07 2:13 ` Jeff Law
2023-06-07 3:50 ` Wang, Yanzhang [this message]
2023-06-08 15:05 ` Jeff Law
2023-06-21 8:14 ` Wang, Yanzhang
2023-06-24 15:01 ` Jeff Law
2023-06-25 1:40 ` Stefan O'Rear
2023-06-25 12:49 ` Jeff Law
2023-06-25 18:45 ` Stefan O'Rear
2023-06-26 14:30 ` Jeff Law
2023-06-26 14:50 ` Kito Cheng
2023-06-26 16:51 ` Jeff Law
2023-06-05 1:04 ` Li, Pan2
2023-06-05 3:36 ` Wang, Yanzhang
2023-07-13 6:12 ` yanzhang.wang
2023-07-18 7:49 ` [PATCH v3] " yanzhang.wang
2023-07-21 3:49 ` Kito Cheng
2023-07-21 4:11 ` Jeff Law
2023-08-02 1:51 ` Wang, Yanzhang
2023-08-03 6:12 ` Jeff Law
2023-08-03 6:16 ` Li, Pan2
2023-08-03 6:22 ` Li, Pan2
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=IA1PR11MB646644384E3EE4771832D12CF253A@IA1PR11MB6466.namprd11.prod.outlook.com \
--to=yanzhang.wang@intel.com \
--cc=gcc-patches@gcc.gnu.org \
--cc=jeffreyalaw@gmail.com \
--cc=juzhe.zhong@rivai.ai \
--cc=kito.cheng@sifive.com \
--cc=pan2.li@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).