diff options
author | Clément Chigot <clement.chigot@atos.net> | 2021-10-15 16:12:39 +0200 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2021-11-10 14:43:24 +1030 |
commit | e86fc4a5bc3747a6b811d93648a2afa4c1c74217 (patch) | |
tree | 00a19a31cfdddd830170cb363782279a0d39c212 /bfd/cofflink.c | |
parent | f493b71179ab70d5e278234cb763eede55d44e61 (diff) | |
download | gdb-e86fc4a5bc3747a6b811d93648a2afa4c1c74217.zip gdb-e86fc4a5bc3747a6b811d93648a2afa4c1c74217.tar.gz gdb-e86fc4a5bc3747a6b811d93648a2afa4c1c74217.tar.bz2 |
PR 28447: implement multiple parameters for .file on XCOFF
On XCOFF, ".file" pseudo-op allows 3 extras parameters to provide
additional information to AIX linker, or its debugger. These are
stored in auxiliary entries of the C_FILE symbol.
bfd/
PR 28447
* coffcode.h (combined_entry_type): Add extrap field.
(coff_bigobj_swap_aux_in): Adjust names of x_file fields.
(coff_bigobj_swap_aux_out): Likewise.
* coffgen.c (coff_write_auxent_fname): New function.
(coff_fix_symbol_name): Write x_file using
coff_write_auxent_fname.
(coff_write_symbol): Likewise.
(coff_write_symbols): Add C_FILE auxiliary entries to
string table if needed.
(coff_get_normalized_symtab): Adjust names of x_file fields.
Normalize C_FILE auxiliary entries.
(coff_print_symbol): Print C_FILE auxiliary entries.
* coff-rs6000.c (_bfd_xcoff_swap_aux_in): Adjust names of
x_file fields.
(_bfd_xcoff_swap_aux_out): Likewise.
* coff64-rs6000.c (_bfd_xcoff64_swap_aux_in): Likewise.
(_bfd_xcoff64_swap_aux_out): Likewise.
* cofflink.c (_bfd_coff_final_link): Likewise.
(_bfd_coff_link_input_bfd): Likewise.
* coffswap.h (coff_swap_aux_in): Likewise.
* peXXigen.c (_bfd_XXi_swap_aux_in): Likewise.
(_bfd_XXi_swap_aux_out): Likewise.
* xcofflink.c (xcoff_link_input_bfd): Likewise.
* libcoff.h: Regenerate.
gas/
* config/tc-ppc.c (ppc_file): New function.
* config/tc-ppc.h (OBJ_COFF_MAX_AUXENTRIES): Change to 4.
* testsuite/gas/ppc/aix.exp: Add tests.
* testsuite/gas/ppc/xcoff-file-32.d: New test.
* testsuite/gas/ppc/xcoff-file-64.d: New test.
* testsuite/gas/ppc/xcoff-file.s: New test.
include/
* coff/internal.h (union internal_auxent): Change x_file to be a
struct instead of a union. Add x_ftype field.
* coff/rs6000.h (union external_auxent): Add x_resv field.
* coff/xcoff.h (XFT_FN): New define.
(XFT_CT): Likewise.
(XFT_CV): Likewise.
(XFT_CD): Likewise.
Diffstat (limited to 'bfd/cofflink.c')
-rw-r--r-- | bfd/cofflink.c | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/bfd/cofflink.c b/bfd/cofflink.c index b8a3709..67d9c62 100644 --- a/bfd/cofflink.c +++ b/bfd/cofflink.c @@ -963,7 +963,7 @@ _bfd_coff_final_link (bfd *abfd, else { BFD_ASSERT (isym.n_numaux == 1); - iaux.x_file.x_n.x_offset = STRING_SIZE_SIZE + indx; + iaux.x_file.x_n.x_n.x_offset = STRING_SIZE_SIZE + indx; bfd_coff_swap_aux_out (abfd, &iaux, isym.n_type, C_FILE, 0, 1, flaginfo.outsyms + symesz); if (bfd_seek (abfd, pos + symesz, SEEK_SET) != 0 @@ -2006,13 +2006,13 @@ _bfd_coff_link_input_bfd (struct coff_final_link_info *flaginfo, bfd *input_bfd) { /* If this is a long filename, we must put it in the string table. */ - if (auxp->x_file.x_n.x_zeroes == 0 - && auxp->x_file.x_n.x_offset != 0) + if (auxp->x_file.x_n.x_n.x_zeroes == 0 + && auxp->x_file.x_n.x_n.x_offset != 0) { const char *filename; bfd_size_type indx; - BFD_ASSERT (auxp->x_file.x_n.x_offset + BFD_ASSERT (auxp->x_file.x_n.x_n.x_offset >= STRING_SIZE_SIZE); if (strings == NULL) { @@ -2020,15 +2020,15 @@ _bfd_coff_link_input_bfd (struct coff_final_link_info *flaginfo, bfd *input_bfd) if (strings == NULL) return false; } - if ((bfd_size_type) auxp->x_file.x_n.x_offset >= obj_coff_strings_len (input_bfd)) + if ((bfd_size_type) auxp->x_file.x_n.x_n.x_offset >= obj_coff_strings_len (input_bfd)) filename = _("<corrupt>"); else - filename = strings + auxp->x_file.x_n.x_offset; + filename = strings + auxp->x_file.x_n.x_n.x_offset; indx = _bfd_stringtab_add (flaginfo->strtab, filename, hash, copy); if (indx == (bfd_size_type) -1) return false; - auxp->x_file.x_n.x_offset = STRING_SIZE_SIZE + indx; + auxp->x_file.x_n.x_n.x_offset = STRING_SIZE_SIZE + indx; } } else if ((isymp->n_sclass != C_STAT || isymp->n_type != T_NULL) |