https://sourceware.org/bugzilla/show_bug.cgi?id=25181

Jim Wilson <wilson at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2019-11-12
                 CC|                            |wilson at gcc dot gnu.org
     Ever confirmed|0                           |1

--- Comment #4 from Jim Wilson <wilson at gcc dot gnu.org> ---
The way that this should work is that if the call crosses section boundaries,
then we need to use the max alignment of any section between the call
instruction and the target, including the call and target sections.  Except we
don't have code to compute that yet, so we just use the maximum alignment of
all sections in the output.  If the call does not cross section boundaries,
then it should only use the alignment of the section it is in.  This alignment
value is added in to the offset to make sure that we don't relax something that
might not fit after alignment is handled.  This has the downside that sometimes
we refuse to relax something that might be relaxable because of a section with
large alignment constraint.  But it is safe, in that we never accidentally
relax something that should not be relaxed.

This is how _bfd_riscv_relax_lui and _bfd_riscv_relax_pc work.  They use
max_alignment unconditionally, and set max_alignment to the section alignment
if the lui and gp are in the same section and it isn't the abs section.

This is unfortunately not how _bfd_riscv_relax_call works.  It only adds in the
alignment if the call and target are not in the same section.  I'd call this a
bug and that it needs to work the same as the other two functions.

I attached a proposed patch that fixes _bfd_riscv_relax_call and adds your
example as a testcase.

-- 
You are receiving this mail because:
You are on the CC list for the bug.

Reply via email to