.typedef struct coff_ptr_struct
.{
. {* Remembers the offset from the first symbol in the file for
-. this symbol. Generated by coff_renumber_symbols. *}
+. this symbol. Generated by coff_renumber_symbols. *}
. unsigned int offset;
.
-. {* Should the value of this symbol be renumbered. Used for
-. XCOFF C_BSTAT symbols. Set by coff_slurp_symbol_table. *}
-. unsigned int fix_value : 1;
+. {* Selects between the elements of the union below. *}
+. unsigned int is_sym : 1;
.
-. {* Should the tag field of this symbol be renumbered.
-. Created by coff_pointerize_aux. *}
+. {* Selects between the elements of the x_sym.x_tagndx union. If set,
+. p is valid and the field will be renumbered. *}
. unsigned int fix_tag : 1;
.
-. {* Should the endidx field of this symbol be renumbered.
-. Created by coff_pointerize_aux. *}
+. {* Selects between the elements of the x_sym.x_fcnary.x_fcn.x_endndx
+. union. If set, p is valid and the field will be renumbered. *}
. unsigned int fix_end : 1;
.
-. {* Should the x_csect.x_scnlen field be renumbered.
-. Created by coff_pointerize_aux. *}
+. {* Selects between the elements of the x_csect.x_scnlen union. If set,
+. p is valid and the field will be renumbered. *}
. unsigned int fix_scnlen : 1;
.
-. {* Fix up an XCOFF C_BINCL/C_EINCL symbol. The value is the
-. index into the line number entries. Set by coff_slurp_symbol_table. *}
+. {* If set, u.syment.n_value contains a pointer to a symbol. The final
+. value will be the offset field. Used for XCOFF C_BSTAT symbols. *}
+. unsigned int fix_value : 1;
+.
+. {* If set, u.syment.n_value is an index into the line number entries.
+. Used for XCOFF C_BINCL/C_EINCL symbols. *}
. unsigned int fix_line : 1;
.
. {* The container for the symbol structure as read and translated
. struct internal_syment syment;
. } u;
.
-. {* Selector for the union above. *}
-. bool is_sym;
-.
. {* An extra pointer which can used by format based on COFF (like XCOFF)
. to provide extra information to their backend. *}
. void *extrap;
typedef struct coff_ptr_struct
{
/* Remembers the offset from the first symbol in the file for
- this symbol. Generated by coff_renumber_symbols. */
+ this symbol. Generated by coff_renumber_symbols. */
unsigned int offset;
- /* Should the value of this symbol be renumbered. Used for
- XCOFF C_BSTAT symbols. Set by coff_slurp_symbol_table. */
- unsigned int fix_value : 1;
+ /* Selects between the elements of the union below. */
+ unsigned int is_sym : 1;
- /* Should the tag field of this symbol be renumbered.
- Created by coff_pointerize_aux. */
+ /* Selects between the elements of the x_sym.x_tagndx union. If set,
+ p is valid and the field will be renumbered. */
unsigned int fix_tag : 1;
- /* Should the endidx field of this symbol be renumbered.
- Created by coff_pointerize_aux. */
+ /* Selects between the elements of the x_sym.x_fcnary.x_fcn.x_endndx
+ union. If set, p is valid and the field will be renumbered. */
unsigned int fix_end : 1;
- /* Should the x_csect.x_scnlen field be renumbered.
- Created by coff_pointerize_aux. */
+ /* Selects between the elements of the x_csect.x_scnlen union. If set,
+ p is valid and the field will be renumbered. */
unsigned int fix_scnlen : 1;
- /* Fix up an XCOFF C_BINCL/C_EINCL symbol. The value is the
- index into the line number entries. Set by coff_slurp_symbol_table. */
+ /* If set, u.syment.n_value contains a pointer to a symbol. The final
+ value will be the offset field. Used for XCOFF C_BSTAT symbols. */
+ unsigned int fix_value : 1;
+
+ /* If set, u.syment.n_value is an index into the line number entries.
+ Used for XCOFF C_BINCL/C_EINCL symbols. */
unsigned int fix_line : 1;
/* The container for the symbol structure as read and translated
struct internal_syment syment;
} u;
- /* Selector for the union above. */
- bool is_sym;
-
/* An extra pointer which can used by format based on COFF (like XCOFF)
to provide extra information to their backend. */
void *extrap;
do_type (unsigned int i)
{
struct internal_syment *sym;
- union internal_auxent *aux;
+ combined_entry_type *aux;
struct coff_type *res = (struct coff_type *) xmalloc (sizeof (struct coff_type));
int type;
int which_dt = 0;
if (sym->n_numaux == 0 || i >= rawcount -1 || rawsyms[i + 1].is_sym)
aux = NULL;
else
- aux = &rawsyms[i + 1].u.auxent;
+ aux = &rawsyms[i + 1];
type = sym->n_type;
res->type = coff_secdef_type;
if (aux == NULL)
fatal (_("Section definition needs a section length"));
- res->size = aux->x_scn.x_scnlen;
+ res->size = aux->u.auxent.x_scn.x_scnlen;
/* PR 17512: file: 081c955d.
Fill in the asecdef structure as well. */
if (aux == NULL)
fatal (_("Aggregate definition needs auxiliary information"));
- if (aux->x_sym.x_tagndx.p)
+ if (aux->fix_tag)
{
- unsigned int idx;
-
- /* PR 17512: file: e72f3988. */
- if (aux->x_sym.x_tagndx.l < 0 || aux->x_sym.x_tagndx.p < rawsyms)
- {
- non_fatal (_("Invalid tag index %#lx encountered"), aux->x_sym.x_tagndx.l);
- idx = 0;
- }
- else
- idx = INDEXOF (aux->x_sym.x_tagndx.p);
-
- if (idx >= rawcount)
- {
- if (rawcount == 0)
- fatal (_("Symbol index %u encountered when there are no symbols"), idx);
- non_fatal (_("Invalid symbol index %u encountered"), idx);
- idx = 0;
- }
+ unsigned int idx = INDEXOF (aux->u.auxent.x_sym.x_tagndx.p);
/* Referring to a struct defined elsewhere. */
res->type = coff_structref_type;
res->u.astructdef.elements = empty_scope ();
res->u.astructdef.idx = 0;
res->u.astructdef.isstruct = (type & 0xf) == T_STRUCT;
- res->size = aux->x_sym.x_misc.x_lnsz.x_size;
+ res->size = aux->u.auxent.x_sym.x_misc.x_lnsz.x_size;
}
}
else
case T_ENUM:
if (aux == NULL)
fatal (_("Enum definition needs auxiliary information"));
- if (aux->x_sym.x_tagndx.p)
+ if (aux->fix_tag)
{
- unsigned int idx = INDEXOF (aux->x_sym.x_tagndx.p);
+ unsigned int idx = INDEXOF (aux->u.auxent.x_sym.x_tagndx.p);
- /* PR 17512: file: 1ef037c7. */
- if (idx >= rawcount)
- fatal (_("Invalid enum symbol index %u encountered"), idx);
/* Referring to a enum defined elsewhere. */
res->type = coff_enumref_type;
res->u.aenumref.ref = tindex[idx];
last_enum = res;
res->type = coff_enumdef_type;
res->u.aenumdef.elements = empty_scope ();
- res->size = aux->x_sym.x_misc.x_lnsz.x_size;
+ res->size = aux->u.auxent.x_sym.x_misc.x_lnsz.x_size;
}
break;
case T_MOE:
if (aux == NULL)
fatal (_("Array definition needs auxiliary information"));
els = (dimind < DIMNUM
- ? aux->x_sym.x_fcnary.x_ary.x_dimen[dimind]
+ ? aux->u.auxent.x_sym.x_fcnary.x_ary.x_dimen[dimind]
: 0);
++dimind;