Read corrrect auxiliary entry in AIX

Fix handling of XCOFF function auxiliary entries, in particular when
the xlc -qfuncsect or gcc -ffunction-sections compiler option is used
in AIX.  Also handle C_WEAKEXT storage class.

gdb/
2016-10-21  Sangamesh Mallayya  <sangamesh.swamy@in.ibm.com>
	    Ulrich Weigand  <uweigand@de.ibm.com>

	* xcoffread.c (read_xcoff_symtab): Read correct function auxiliary
	entry if xlc -qfuncsect or gcc -ffunction-sections compiler option
	is used in AIX.
	(read_xcoff_symtab): Handle C_WEAKEXT storage class.
	(process_xcoff_symbol): Likewise.
	(scan_xcoff_symtab): Likewise.

Signed-off-by: Ulrich Weigand <ulrich.weigand@de.ibm.com>
This commit is contained in:
Ulrich Weigand 2017-04-27 15:57:08 +02:00
parent 14f72d45a2
commit 55bcecda57
2 changed files with 53 additions and 25 deletions

View File

@ -1,3 +1,13 @@
2017-04-27 Sangamesh Mallayya <sangamesh.swamy@in.ibm.com>
Ulrich Weigand <uweigand@de.ibm.com>
* xcoffread.c (read_xcoff_symtab): Read correct function auxiliary
entry if xlc -qfuncsect or gcc -ffunction-sections compiler option
is used in AIX.
(read_xcoff_symtab): Handle C_WEAKEXT storage class.
(process_xcoff_symbol): Likewise.
(scan_xcoff_symtab): Likewise.
2017-04-26 Alan Hayward <alan.hayward@arm.com>
* ia64-tdep.c (examine_prologue): Use get_frame_register_unsigned.

View File

@ -1143,8 +1143,8 @@ read_xcoff_symtab (struct objfile *objfile, struct partial_symtab *pst)
/* Done with all files, everything from here on is globals. */
}
if ((cs->c_sclass == C_EXT || cs->c_sclass == C_HIDEXT)
&& cs->c_naux == 1)
if (cs->c_sclass == C_EXT || cs->c_sclass == C_HIDEXT ||
cs->c_sclass == C_WEAKEXT)
{
/* Dealing with a symbol with a csect entry. */
@ -1154,9 +1154,41 @@ read_xcoff_symtab (struct objfile *objfile, struct partial_symtab *pst)
#define CSECT_SMTYP(PP) (SMTYP_SMTYP(CSECT(PP).x_smtyp))
#define CSECT_SCLAS(PP) (CSECT(PP).x_smclas)
/* Convert the auxent to something we can access. */
bfd_coff_swap_aux_in (abfd, raw_auxptr, cs->c_type, cs->c_sclass,
0, cs->c_naux, &main_aux);
/* Convert the auxent to something we can access.
XCOFF can have more than one auxiliary entries.
Actual functions will have two auxiliary entries, one to have the
function size and other to have the smtype/smclass (LD/PR).
c_type value of main symbol table will be set only in case of
C_EXT/C_HIDEEXT/C_WEAKEXT storage class symbols.
Bit 10 of type is set if symbol is a function, ie the value is set
to 32(0x20). So we need to read the first function auxiliay entry
which contains the size. */
if (cs->c_naux > 1 && ISFCN (cs->c_type))
{
/* a function entry point. */
fcn_start_addr = cs->c_value;
/* save the function header info, which will be used
when `.bf' is seen. */
fcn_cs_saved = *cs;
/* Convert the auxent to something we can access. */
bfd_coff_swap_aux_in (abfd, raw_auxptr, cs->c_type, cs->c_sclass,
0, cs->c_naux, &fcn_aux_saved);
continue;
}
/* Read the csect auxiliary header, which is always the last by
onvention. */
bfd_coff_swap_aux_in (abfd,
raw_auxptr
+ ((coff_data (abfd)->local_symesz)
* (cs->c_naux - 1)),
cs->c_type, cs->c_sclass,
cs->c_naux - 1, cs->c_naux,
&main_aux);
switch (CSECT_SMTYP (&main_aux))
{
@ -1241,16 +1273,11 @@ read_xcoff_symtab (struct objfile *objfile, struct partial_symtab *pst)
switch (CSECT_SCLAS (&main_aux))
{
/* We never really come to this part as this case has been
handled in ISFCN check above.
This and other cases of XTY_LD are kept just for
reference. */
case XMC_PR:
/* a function entry point. */
function_entry_point:
fcn_start_addr = cs->c_value;
/* save the function header info, which will be used
when `.bf' is seen. */
fcn_cs_saved = *cs;
fcn_aux_saved = main_aux;
continue;
case XMC_GL:
@ -1283,16 +1310,6 @@ read_xcoff_symtab (struct objfile *objfile, struct partial_symtab *pst)
}
}
/* If explicitly specified as a function, treat is as one. This check
evaluates to true for @FIX* bigtoc CSECT symbols, so it must occur
after the above CSECT check. */
if (ISFCN (cs->c_type) && cs->c_sclass != C_TPDEF)
{
bfd_coff_swap_aux_in (abfd, raw_auxptr, cs->c_type, cs->c_sclass,
0, cs->c_naux, &main_aux);
goto function_entry_point;
}
switch (cs->c_sclass)
{
case C_FILE:
@ -1574,7 +1591,7 @@ process_xcoff_symbol (struct coff_symbol *cs, struct objfile *objfile)
SYMBOL_ACLASS_INDEX (sym) = LOC_BLOCK;
SYMBOL_DUP (sym, sym2);
if (cs->c_sclass == C_EXT)
if (cs->c_sclass == C_EXT || C_WEAKEXT)
add_symbol_to_list (sym2, &global_symbols);
else if (cs->c_sclass == C_HIDEXT || cs->c_sclass == C_STAT)
add_symbol_to_list (sym2, &file_symbols);
@ -2250,6 +2267,7 @@ scan_xcoff_symtab (minimal_symbol_reader &reader,
{
case C_EXT:
case C_HIDEXT:
case C_WEAKEXT:
{
/* The CSECT auxent--always the last auxent. */
union internal_auxent csect_aux;