[PATCH] bfd/ELF: loongarch_{larch_reloc_name_lookup,adjust_reloc_bitsfield}() are exposed to gas
Jan Beulich
jbeulich@suse.com
Tue Nov 11 13:36:52 GMT 2025
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