[PATCH] bfd/ELF: loongarch_{larch_reloc_name_lookup,adjust_reloc_bitsfield}() are exposed to gas

Chenghua Xu xuchenghua@loongson.cn
Thu Nov 13 03:03:43 GMT 2025


Jan Beulich <jbeulich@suse.com> writes:

@lulu,qinggang, Take a look at this patch..


> As non-private functions, they should come with full disambiguating
> prefixes - add bfd_elf_ to both. Hence commit 2903d813fcc2 ("bfd/ELF: mark
> internal LoongArch functions hidden") also wrongly added ATTRIBUTE_HIDDEN
> to them.
>
> While loongarch_get_uleb128_length() also falls in the same category,
> having it live in libbfd, when outside of gas there's hardly any use to be
> expected, isn't very useful. Drop the function altogether and simplify the
> clearing of the ULEB128 in md_apply_fix().
>
> For loongarch_larch_reloc_name_lookup() drop gas'es custom declaration;
> the libbfd one ought to be used, for producer and consumer to "see" the
> same one. Also drop ATTRIBUTE_UNUSED there, as that makes sense only for
> parameters in function definitions.
>
> --- a/bfd/elfnn-loongarch.c
> +++ b/bfd/elfnn-loongarch.c
> @@ -2758,7 +2758,7 @@ loongarch_reloc_rewrite_imm_insn (const
>  {
>    /* Adjust the immediate based on alignment and
>       its position in the instruction.  */
> -  if (!loongarch_adjust_reloc_bitsfield (input_bfd, howto, &reloc_val))
> +  if (!bfd_elf_loongarch_adjust_reloc_bitsfield (input_bfd, howto, &reloc_val))
>      return bfd_reloc_overflow;
>  
>    int bits = bfd_get_reloc_size (howto) * 8;
> --- a/bfd/elfxx-loongarch.c
> +++ b/bfd/elfxx-loongarch.c
> @@ -1943,8 +1943,8 @@ loongarch_reloc_type_lookup (bfd *abfd A
>  }
>  
>  bfd_reloc_code_real_type
> -loongarch_larch_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
> -				   const char *l_r_name)
> +bfd_elf_loongarch_larch_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
> +					   const char *l_r_name)
>  {
>    for (size_t i = 0; i < ARRAY_SIZE (loongarch_howto_table); i++)
>      {
> @@ -2081,8 +2081,8 @@ reloc_unsign_bits (bfd *abfd, reloc_howt
>  }
>  
>  bool
> -loongarch_adjust_reloc_bitsfield (bfd *abfd, reloc_howto_type *howto,
> -				  bfd_vma *fix_val)
> +bfd_elf_loongarch_adjust_reloc_bitsfield (bfd *abfd, reloc_howto_type *howto,
> +					  bfd_vma *fix_val)
>  {
>    BFD_ASSERT (((loongarch_reloc_howto_type *)howto)->adjust_reloc_bits);
>    return ((loongarch_reloc_howto_type *)
> @@ -2223,10 +2223,3 @@ loongarch_write_unsigned_leb128 (bfd_byt
>    while (len);
>    return p;
>  }
> -
> -int loongarch_get_uleb128_length (bfd_byte *buf)
> -{
> -  unsigned int len = 0;
> -  _bfd_read_unsigned_leb128 (NULL, buf, &len);
> -  return len;
> -}
> --- a/bfd/elfxx-loongarch.h
> +++ b/bfd/elfxx-loongarch.h
> @@ -33,12 +33,10 @@ loongarch_reloc_name_lookup (bfd *abfd A
>    ATTRIBUTE_HIDDEN;
>  
>  extern bfd_reloc_code_real_type
> -loongarch_larch_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
> -				   const char *l_r_name) ATTRIBUTE_HIDDEN;
> +bfd_elf_loongarch_larch_reloc_name_lookup (bfd *abfd, const char *l_r_name);
>  
>  bool
> -loongarch_adjust_reloc_bitsfield (bfd *, reloc_howto_type *, bfd_vma *)
> -  ATTRIBUTE_HIDDEN;
> +bfd_elf_loongarch_adjust_reloc_bitsfield (bfd *, reloc_howto_type *, bfd_vma *);
>  void
>  bfd_elf32_loongarch_set_data_segment_info (struct bfd_link_info *, int *);
>  void
> @@ -48,8 +46,6 @@ bfd_byte *
>  loongarch_write_unsigned_leb128 (bfd_byte *p, unsigned int len, bfd_vma value)
>    ATTRIBUTE_HIDDEN;
>  
> -int loongarch_get_uleb128_length (bfd_byte *buf) ATTRIBUTE_HIDDEN;
> -
>  /* TRUE if this is a PLT reference to a local IFUNC.  */
>  #define PLT_LOCAL_IFUNC_P(INFO, H) \
>    ((H)->dynindx == -1 \
> --- a/gas/config/loongarch-lex.h
> +++ b/gas/config/loongarch-lex.h
> @@ -32,6 +32,3 @@ loongarch_parse_expr (const char *expr,
>  		      size_t max_reloc_num,
>  		      size_t *reloc_num,
>  		      offsetT *imm);
> -bfd_reloc_code_real_type
> -loongarch_larch_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
> -				   const char *l_r_name);
> --- a/gas/config/loongarch-parse.y
> +++ b/gas/config/loongarch-parse.y
> @@ -20,6 +20,7 @@
>  #include "as.h"
>  #include "loongarch-lex.h"
>  #include "loongarch-parse.h"
> +#include "bfd/elfxx-loongarch.h"
>  static void yyerror (const char *s ATTRIBUTE_UNUSED)
>  {
>  };
> @@ -133,7 +134,7 @@ reloc (const char *op_c_str, const char
>      btype = BFD_RELOC_LARCH_B26;
>    else
>      {
> -      btype = loongarch_larch_reloc_name_lookup (NULL, op_c_str);
> +      btype = bfd_elf_loongarch_larch_reloc_name_lookup (NULL, op_c_str);
>        if (btype == BFD_RELOC_NONE)
>  	as_fatal (_("unsupported modifier %s"), op_c_str);
>      }
> --- a/gas/config/tc-loongarch.c
> +++ b/gas/config/tc-loongarch.c
> @@ -1530,7 +1530,7 @@ static void fix_reloc_insn (fixS *fixP,
>  
>    insn = bfd_getl32 (buf);
>  
> -  if (!loongarch_adjust_reloc_bitsfield (NULL, howto, &reloc_val))
> +  if (!bfd_elf_loongarch_adjust_reloc_bitsfield (NULL, howto, &reloc_val))
>      as_bad_where (fixP->fx_file, fixP->fx_line, "Reloc overflow");
>  
>    insn = (insn & (insn_t)howto->src_mask)
> @@ -1832,12 +1832,9 @@ md_apply_fix (fixS *fixP, valueT *valP,
>      case BFD_RELOC_LARCH_ADD_ULEB128:  */
>      case BFD_RELOC_LARCH_SUB_ULEB128:
>        {
> -	unsigned int len = 0;
> -	len = loongarch_get_uleb128_length ((bfd_byte *)buf);
> -	bfd_byte *endp = (bfd_byte*) buf + len -1;
>  	/* Clean the uleb128 value to 0. Do not reduce the length.  */
> -	memset (buf, 0x80, len - 1);
> -	*endp = 0;
> +	for (bfd_byte *ptr = (bfd_byte *)buf; *ptr &= 0x80; ++ptr)
> +	  /* Nothing.  */;
>  	break;
>        }
>  



More information about the Binutils mailing list