[PATCH v2 02/10] GAS: Unify code for SET_SECTION_RELOCS call
Maciej W. Rozycki
macro@orcam.me.uk
Wed Nov 5 02:46:40 GMT 2025
Fold a separate call to `bfd_set_reloc' into SET_SECTION_RELOCS itself,
so that the GAS interface to this facility is contained in a single
invocation.
Set the macro by default to a plain call to `bfd_set_reloc', letting
backends override the macro, with the requirement now to factor in a
call to said function. Update the COFF variant accordingly, moving it
to a new function for a better code structure, retaining functionality.
This is in preparation for `bfd_set_reloc' to return an error status.
---
New change in v2.
---
gas/config/obj-coff.c | 18 ++++++++++++++++++
gas/config/obj-coff.h | 16 +++-------------
gas/doc/internals.texi | 6 +++---
gas/write.c | 9 +++++----
4 files changed, 29 insertions(+), 20 deletions(-)
binutils-gas-set-section-relocs-once.diff
Index: binutils-gdb/gas/config/obj-coff.c
===================================================================
--- binutils-gdb.orig/gas/config/obj-coff.c
+++ binutils-gdb/gas/config/obj-coff.c
@@ -1514,6 +1514,24 @@ coff_frob_file_after_relocs (void)
bfd_map_over_sections (stdoutput, coff_adjust_section_syms, NULL);
}
+/* Set relocations for the section and then store the number of relocations
+ in its aux entry. */
+
+void
+obj_coff_set_section_relocs (asection *sec, arelent **relocs, unsigned int n)
+{
+ symbolS *sect_sym;
+
+ bfd_set_reloc (stdoutput, sec, n ? relocs : NULL, n);
+ sect_sym = section_symbol (sec);
+#ifdef OBJ_XCOFF
+ if (S_GET_STORAGE_CLASS (sect_sym) == C_DWARF)
+ SA_SET_SECT_NRELOC (sect_sym, n);
+ else
+#endif
+ SA_SET_SCN_NRELOC (sect_sym, n);
+}
+
/* Implement the .section pseudo op:
.section name {, "flags"}
^ ^
Index: binutils-gdb/gas/config/obj-coff.h
===================================================================
--- binutils-gdb.orig/gas/config/obj-coff.h
+++ binutils-gdb/gas/config/obj-coff.h
@@ -293,20 +293,10 @@ extern void coff_pop_insert (void);
information. */
#define INIT_STAB_SECTION(stab, str) obj_coff_init_stab_section (stab, str)
-/* Store the number of relocations in the section aux entry. */
-#ifdef OBJ_XCOFF
-#define SET_SECTION_RELOCS(sec, relocs, n) \
- do { \
- symbolS * sectSym = section_symbol (sec); \
- if (S_GET_STORAGE_CLASS (sectSym) == C_DWARF) \
- SA_SET_SECT_NRELOC (sectSym, n); \
- else \
- SA_SET_SCN_NRELOC (sectSym, n); \
- } while (0)
-#else
+/* We need to store the number of relocations in the section aux entry. */
#define SET_SECTION_RELOCS(sec, relocs, n) \
- SA_SET_SCN_NRELOC (section_symbol (sec), n)
-#endif
+ obj_coff_set_section_relocs (sec, relocs, n)
+extern void obj_coff_set_section_relocs (asection *, arelent **, unsigned int);
extern int S_SET_DATA_TYPE (symbolS *, int);
extern int S_SET_STORAGE_CLASS (symbolS *, int);
Index: binutils-gdb/gas/doc/internals.texi
===================================================================
--- binutils-gdb.orig/gas/doc/internals.texi
+++ binutils-gdb/gas/doc/internals.texi
@@ -1699,9 +1699,9 @@ generated.
@item SET_SECTION_RELOCS (@var{sec}, @var{relocs}, @var{n})
@cindex SET_SECTION_RELOCS
-If you define this, it will be called after the relocations have been set for
-the section @var{sec}. The list of relocations is in @var{relocs}, and the
-number of relocations is in @var{n}.
+If you define this, it will be called to set relocations for the section
+@var{sec}. The list of relocations is in @var{relocs}, and the number of
+relocations is in @var{n}.
@end table
@node Emulations
Index: binutils-gdb/gas/write.c
===================================================================
--- binutils-gdb.orig/gas/write.c
+++ binutils-gdb/gas/write.c
@@ -28,6 +28,11 @@
#include "compress-debug.h"
#include "codeview.h"
+#ifndef SET_SECTION_RELOCS
+#define SET_SECTION_RELOCS(sec, relocs, n) \
+ bfd_set_reloc (stdoutput, sec, n ? relocs : NULL, n)
+#endif
+
#ifndef TC_FORCE_RELOCATION
#define TC_FORCE_RELOCATION(FIX) \
(generic_force_reloc (FIX))
@@ -1414,11 +1419,7 @@ write_relocs (bfd *abfd ATTRIBUTE_UNUSED
}
#endif
- bfd_set_reloc (stdoutput, sec, n ? relocs : NULL, n);
-
-#ifdef SET_SECTION_RELOCS
SET_SECTION_RELOCS (sec, relocs, n);
-#endif
#ifdef DEBUG3
{
More information about the Binutils
mailing list