https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63741
--- Comment #4 from Uroš Bizjak <ubizjak at gmail dot com> ---
(In reply to Joel Sherrill from comment #3)
> Added the dwarf maintainers hoping to get an answer. From an RTEMS
> perspective, the lm32 is not usable. Both 4.9 and the head are broken.
> Hoping you two have an idea. Happy to help since this is a cross target.
This is a target problem.
Please see stack_adjust function, where emit_move_insn is used to move an
immediate to r10. However, emit_move_insn with (const_int -32812) generates two
insn sequence:
(insn 952 123 953 2 (set (reg:SI 10 r10)
(const_int -65536 [0xffffffffffff0000]))
../../../../../../rtems/c/src/../../cpukit/libdl/fastlz.c:167 -1
(nil))
(insn/f 953 952 954 2 (set (reg:SI 10 r10)
(ior:SI (reg:SI 10 r10)
(const_int 32724 [0x7fd4])))
../../../../../../rtems/c/src/../../cpukit/libdl/fastlz.c:167 -1
(expr_list:REG_EQUAL (const_int -32812 [0xffffffffffff7fd4])
(nil)))
However:
/* r10 is caller saved so it can be used as a temp reg. */
rtx r10;
r10 = gen_rtx_REG (word_mode, 10);
insn = emit_move_insn (r10, GEN_INT (amount));
if (amount < 0)
RTX_FRAME_RELATED_P (insn) = 1;
emit_move_insn returns only the *last* insn of the sequence (insn 953 in the
above dump). (insn 952) doesn't get RTX_FRAME_RELATED_P flag set - please note
lack of /f modifier - and consequently dwarf2out_frame_debug_expr trips in Rule
7 due to unknown cfa_temp.reg (which would be otherwise initialized in insn
952, following Rule 6).
So, considering that emit_move_insn can generate a sequence of insns, but only
the last insn is returned as a return value of a function,
insn = emit_move_insn (r10, GEN_INT (amount));
RTX_FRAME_RELATED_P (insn) = 1;
is not the correct way to set /f flags to all insn of the generated sequence.