(Just for the record to avoid misleading)

I think the .eqv should fully work, but need to correct the reason for why.

It is not because it turned the new symbol into non-function type, but because .eqv is expect to always evaulate the snapshot value of the equaled expression at each place the new symbol is used, you don't know it's final value and the associated section, therefore it is associated with undefined section until the final stage of assembling. So, when doing ADR instruction assembling, at that stage, the new symbol is still without definition section assigned, therefore is able to skip the LSB
setting which only happens for thumb function symbol with defined section.

binutils-gdb/gas/config/tc-arm.c: do_t_adr
...

  && S_IS_DEFINED (inst.reloc.exp.X_add_symbol)
  && THUMB_IS_FUNC (inst.reloc.exp.X_add_symbol))
    inst.reloc.exp.X_add_number += 1;

Use .equ, the magic disappear.

Regards,
Jiong

On 04/08/17 14:58, Jiong Wang wrote:

Change

  "adreq lr,X(ff_h264_idct_add_neon) +CONFIG_THUMB"

Into:

.eqv ff_h264_idct_add_neon_without_func_type, X(ff_h264_idct_add_neon)
adreq lr,ff_h264_idct_add_neon_without_func_type +CONFIG_THUMB

might be a solution. The idea is we use .eqv to remove the function attribute, so the assembler won't set LSB in any case.


On 04/08/17 12:39, Jiong Wang wrote:
Hi,

This issue is caused by a recent change in ARM assembler included since Binutils 2.29.

The details of that change can be found at https://sourceware.org/bugzilla/show_bug.cgi?id=21458

The semantics of ADR has changed. In general, the address generated by ADR will guarantee the LSB be set if it's a thumb function address.

   I noticed h264idct_neon.S is using something like:

adreq lr,X(ff_h264_idct_add_neon) +CONFIG_THUMB

As ADR now will set the LSB automatically, you don't need CONFIG_THUMB any more.

I think h264idct_neon.S needs to be updated, and the modification should make sure it works with both old Binutils and the new one.

Regards,
Jiong



Reply via email to