aboutsummaryrefslogtreecommitdiff
path: root/bfd/cofflink.c
diff options
context:
space:
mode:
authorClément Chigot <clement.chigot@atos.net>2021-10-15 16:12:39 +0200
committerAlan Modra <amodra@gmail.com>2021-11-10 14:43:24 +1030
commite86fc4a5bc3747a6b811d93648a2afa4c1c74217 (patch)
tree00a19a31cfdddd830170cb363782279a0d39c212 /bfd/cofflink.c
parentf493b71179ab70d5e278234cb763eede55d44e61 (diff)
downloadgdb-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.c14
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)