https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83162
Richard Biener changed:
What|Removed |Added
Keywords||diagnostic, ra
CC||jakub at gcc dot gnu.org,
||rguenth at gcc dot gnu.org
Component|c |rtl-optimization
Known to work||4.8.5
Target Milestone|--- |7.3
Summary|x86-64 -Wclobbered issuing |[6/7/8 Regression] x86-64
|more false alarms |-Wclobbered issuing more
|(regression)|false alarms (regression)
--- Comment #1 from Richard Biener ---
Hm, so the warning just does
static void
setjmp_args_warning (bitmap setjmp_crosses)
{
tree decl;
for (decl = DECL_ARGUMENTS (current_function_decl);
decl; decl = DECL_CHAIN (decl))
if (DECL_RTL (decl) != 0
&& REG_P (DECL_RTL (decl))
&& regno_clobbered_at_setjmp (setjmp_crosses, REGNO (DECL_RTL (decl
warning (OPT_Wclobbered,
"argument %q+D might be clobbered by % or %",
decl);
and thus looks whether the PARM_DECL is expanded as a register and is
regno_clobbered_at_setjmp. But it seems to fail to exclude call clobbered
registers as we can see we spill those regs:
module_vec_set:
.LFB0:
.cfi_startproc
subq$40, %rsp
.cfi_def_cfa_offset 48
movq%rdi, 8(%rsp)
movl$jb, %edi
movq%rsi, 16(%rsp)
movq%rdx, 24(%rsp)
call_setjmp
testl %eax, %eax
jne .L1
xorl%eax, %eax
cmpb$0, module_assertions(%rip)
movq24(%rsp), %rcx
movq16(%rsp), %rsi
...
/* True if register REGNO was alive at a place where `setjmp' was
called and was set more than once or is an argument. Such regs may
be clobbered by `longjmp'. */
static bool
regno_clobbered_at_setjmp (bitmap setjmp_crosses, int regno)
I don't really understand what this is about. At least call clobbered
regs should get spilled so this should be about callee saved ones only?