* config/tc-hppa.h: Update for symbol handling changes.

* config/tc-hppa.c: Likewise.
This commit is contained in:
Ian Lance Taylor 1999-06-03 12:42:36 +00:00
parent 174419c123
commit a0f75b47e9
3 changed files with 46 additions and 38 deletions

View file

@ -1,5 +1,8 @@
1999-06-03 Ian Lance Taylor <ian@zembu.com> 1999-06-03 Ian Lance Taylor <ian@zembu.com>
* config/tc-hppa.h: Update for symbol handling changes.
* config/tc-hppa.c: Likewise.
* config/tc-arm.h: Update for symbol handling changes. * config/tc-arm.h: Update for symbol handling changes.
* config/tc-arm.c: Likewise. * config/tc-arm.c: Likewise.
(symbol_make_empty): Remove. Just use symbol_create. (symbol_make_empty): Remove. Just use symbol_create.

View file

@ -1072,11 +1072,11 @@ static struct default_space_dict pa_def_spaces[] =
#define is_DP_relative(exp) \ #define is_DP_relative(exp) \
((exp).X_op == O_subtract \ ((exp).X_op == O_subtract \
&& strcmp((exp).X_op_symbol->bsym->name, "$global$") == 0) && strcmp (S_GET_NAME ((exp).X_op_symbol), "$global$") == 0)
#define is_PC_relative(exp) \ #define is_PC_relative(exp) \
((exp).X_op == O_subtract \ ((exp).X_op == O_subtract \
&& strcmp((exp).X_op_symbol->bsym->name, "$PIC_pcrel$0") == 0) && strcmp (S_GET_NAME ((exp).X_op_symbol), "$PIC_pcrel$0") == 0)
/* We need some complex handling for stabs (sym1 - sym2). Luckily, we'll /* We need some complex handling for stabs (sym1 - sym2). Luckily, we'll
always be able to reduce the expression to a constant, so we don't always be able to reduce the expression to a constant, so we don't
@ -1369,7 +1369,8 @@ md_assemble (str)
if (label_symbol->lss_label) if (label_symbol->lss_label)
{ {
last_call_info->start_symbol = label_symbol->lss_label; last_call_info->start_symbol = label_symbol->lss_label;
label_symbol->lss_label->bsym->flags |= BSF_FUNCTION; symbol_get_bfdsym (label_symbol->lss_label)->flags
|= BSF_FUNCTION;
#ifdef OBJ_SOM #ifdef OBJ_SOM
/* Also handle allocation of a fixup to hold the unwind /* Also handle allocation of a fixup to hold the unwind
information when the label appears after the proc/procend. */ information when the label appears after the proc/procend. */
@ -2731,13 +2732,14 @@ tc_gen_reloc (section, fixp)
reloc = (arelent *) xmalloc (sizeof (arelent)); reloc = (arelent *) xmalloc (sizeof (arelent));
reloc->sym_ptr_ptr = &fixp->fx_addsy->bsym; reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
*reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
codes = (bfd_reloc_code_real_type **) hppa_gen_reloc_type (stdoutput, codes = (bfd_reloc_code_real_type **) hppa_gen_reloc_type (stdoutput,
fixp->fx_r_type, fixp->fx_r_type,
hppa_fixp->fx_r_format, hppa_fixp->fx_r_format,
hppa_fixp->fx_r_field, hppa_fixp->fx_r_field,
fixp->fx_subsy != NULL, fixp->fx_subsy != NULL,
fixp->fx_addsy->bsym); symbol_get_bfdsym (fixp->fx_addsy));
if (codes == NULL) if (codes == NULL)
abort (); abort ();
@ -2760,7 +2762,8 @@ tc_gen_reloc (section, fixp)
code = *codes[0]; code = *codes[0];
reloc->sym_ptr_ptr = &fixp->fx_addsy->bsym; reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
*reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
reloc->howto = bfd_reloc_type_lookup (stdoutput, code); reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
reloc->address = fixp->fx_frag->fr_address + fixp->fx_where; reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
reloc->addend = 0; /* default */ reloc->addend = 0; /* default */
@ -3068,8 +3071,8 @@ md_apply_fix (fixP, valp)
&& fixP->fx_addsy && fixP->fx_addsy
&& fixP->fx_pcrel && fixP->fx_pcrel
&& !arg_reloc_stub_needed ((long) ((obj_symbol_type *) && !arg_reloc_stub_needed ((long) ((obj_symbol_type *)
fixP->fx_addsy->bsym)->tc_data.ap.hppa_arg_reloc, symbol_get_bfdsym (fixP->fx_addsy))->tc_data.ap.hppa_arg_reloc,
hppa_fixP->fx_arg_reloc) hppa_fixP->fx_arg_reloc)
&& (((int)(*valp) > -262144 && (int)(*valp) < 262143) && fmt != 22) && (((int)(*valp) > -262144 && (int)(*valp) < 262143) && fmt != 22)
&& S_GET_SEGMENT (fixP->fx_addsy) == hppa_fixP->segment && S_GET_SEGMENT (fixP->fx_addsy) == hppa_fixP->segment
&& !(fixP->fx_subsy && !(fixP->fx_subsy
@ -4602,7 +4605,7 @@ pa_comm (unused)
/* colon() has already set the frag to the current location in the /* colon() has already set the frag to the current location in the
current subspace; we need to reset the fragment to the zero address current subspace; we need to reset the fragment to the zero address
fragment. We also need to reset the segment pointer. */ fragment. We also need to reset the segment pointer. */
symbol->sy_frag = &zero_address_frag; symbol_set_frag (symbol, &zero_address_frag);
} }
demand_empty_rest_of_line (); demand_empty_rest_of_line ();
} }
@ -4809,13 +4812,13 @@ pa_type_args (symbolP, is_export)
char *name, c, *p; char *name, c, *p;
unsigned int temp, arg_reloc; unsigned int temp, arg_reloc;
pa_symbol_type type = SYMBOL_TYPE_UNKNOWN; pa_symbol_type type = SYMBOL_TYPE_UNKNOWN;
obj_symbol_type *symbol = (obj_symbol_type *) symbolP->bsym; obj_symbol_type *symbol = (obj_symbol_type *) symbol_get_bfdsym (symbolP);
if (strncasecmp (input_line_pointer, "absolute", 8) == 0) if (strncasecmp (input_line_pointer, "absolute", 8) == 0)
{ {
input_line_pointer += 8; input_line_pointer += 8;
symbolP->bsym->flags &= ~BSF_FUNCTION; symbol_get_bfdsym (symbolP)->flags &= ~BSF_FUNCTION;
S_SET_SEGMENT (symbolP, bfd_abs_section_ptr); S_SET_SEGMENT (symbolP, bfd_abs_section_ptr);
type = SYMBOL_TYPE_ABSOLUTE; type = SYMBOL_TYPE_ABSOLUTE;
} }
@ -4828,54 +4831,55 @@ pa_type_args (symbolP, is_export)
Complain if one tries to EXPORT a CODE type since that's never Complain if one tries to EXPORT a CODE type since that's never
done. Both GCC and HP C still try to IMPORT CODE types, so done. Both GCC and HP C still try to IMPORT CODE types, so
silently fix them to be ENTRY types. */ silently fix them to be ENTRY types. */
if (symbolP->bsym->flags & BSF_FUNCTION) if (S_IS_FUNCTION (symbolP))
{ {
if (is_export) if (is_export)
as_tsktsk (_("Using ENTRY rather than CODE in export directive for %s"), symbolP->bsym->name); as_tsktsk (_("Using ENTRY rather than CODE in export directive for %s"),
S_GET_NAME (symbolP));
symbolP->bsym->flags |= BSF_FUNCTION; symbol_get_bfdsym (symbolP)->flags |= BSF_FUNCTION;
type = SYMBOL_TYPE_ENTRY; type = SYMBOL_TYPE_ENTRY;
} }
else else
{ {
symbolP->bsym->flags &= ~BSF_FUNCTION; symbol_get_bfdsym (symbolP)->flags &= ~BSF_FUNCTION;
type = SYMBOL_TYPE_CODE; type = SYMBOL_TYPE_CODE;
} }
} }
else if (strncasecmp (input_line_pointer, "data", 4) == 0) else if (strncasecmp (input_line_pointer, "data", 4) == 0)
{ {
input_line_pointer += 4; input_line_pointer += 4;
symbolP->bsym->flags &= ~BSF_FUNCTION; symbol_get_bfdsym (symbolP)->flags &= ~BSF_FUNCTION;
type = SYMBOL_TYPE_DATA; type = SYMBOL_TYPE_DATA;
} }
else if ((strncasecmp (input_line_pointer, "entry", 5) == 0)) else if ((strncasecmp (input_line_pointer, "entry", 5) == 0))
{ {
input_line_pointer += 5; input_line_pointer += 5;
symbolP->bsym->flags |= BSF_FUNCTION; symbol_get_bfdsym (symbolP)->flags |= BSF_FUNCTION;
type = SYMBOL_TYPE_ENTRY; type = SYMBOL_TYPE_ENTRY;
} }
else if (strncasecmp (input_line_pointer, "millicode", 9) == 0) else if (strncasecmp (input_line_pointer, "millicode", 9) == 0)
{ {
input_line_pointer += 9; input_line_pointer += 9;
symbolP->bsym->flags |= BSF_FUNCTION; symbol_get_bfdsym (symbolP)->flags |= BSF_FUNCTION;
type = SYMBOL_TYPE_MILLICODE; type = SYMBOL_TYPE_MILLICODE;
} }
else if (strncasecmp (input_line_pointer, "plabel", 6) == 0) else if (strncasecmp (input_line_pointer, "plabel", 6) == 0)
{ {
input_line_pointer += 6; input_line_pointer += 6;
symbolP->bsym->flags &= ~BSF_FUNCTION; symbol_get_bfdsym (symbolP)->flags &= ~BSF_FUNCTION;
type = SYMBOL_TYPE_PLABEL; type = SYMBOL_TYPE_PLABEL;
} }
else if (strncasecmp (input_line_pointer, "pri_prog", 8) == 0) else if (strncasecmp (input_line_pointer, "pri_prog", 8) == 0)
{ {
input_line_pointer += 8; input_line_pointer += 8;
symbolP->bsym->flags |= BSF_FUNCTION; symbol_get_bfdsym (symbolP)->flags |= BSF_FUNCTION;
type = SYMBOL_TYPE_PRI_PROG; type = SYMBOL_TYPE_PRI_PROG;
} }
else if (strncasecmp (input_line_pointer, "sec_prog", 8) == 0) else if (strncasecmp (input_line_pointer, "sec_prog", 8) == 0)
{ {
input_line_pointer += 8; input_line_pointer += 8;
symbolP->bsym->flags |= BSF_FUNCTION; symbol_get_bfdsym (symbolP)->flags |= BSF_FUNCTION;
type = SYMBOL_TYPE_SEC_PROG; type = SYMBOL_TYPE_SEC_PROG;
} }
@ -4883,7 +4887,7 @@ pa_type_args (symbolP, is_export)
than BFD understands. This is how we get this information than BFD understands. This is how we get this information
to the SOM BFD backend. */ to the SOM BFD backend. */
#ifdef obj_set_symbol_type #ifdef obj_set_symbol_type
obj_set_symbol_type (symbolP->bsym, (int) type); obj_set_symbol_type (symbol_get_bfdsym (symbolP), (int) type);
#endif #endif
/* Now that the type of the exported symbol has been handled, /* Now that the type of the exported symbol has been handled,
@ -4977,7 +4981,7 @@ pa_import (unused)
the the current segment. Note only BSF_FUNCTION really the the current segment. Note only BSF_FUNCTION really
matters, we do not need to set the full SYMBOL_TYPE_* info. */ matters, we do not need to set the full SYMBOL_TYPE_* info. */
if (now_seg == text_section) if (now_seg == text_section)
symbol->bsym->flags |= BSF_FUNCTION; symbol_get_bfdsym (symbol)->flags |= BSF_FUNCTION;
/* If the section is undefined, then the symbol is undefined /* If the section is undefined, then the symbol is undefined
Since this is an import, leave the section undefined. */ Since this is an import, leave the section undefined. */
@ -5177,7 +5181,7 @@ pa_proc (unused)
if (label_symbol->lss_label) if (label_symbol->lss_label)
{ {
last_call_info->start_symbol = label_symbol->lss_label; last_call_info->start_symbol = label_symbol->lss_label;
label_symbol->lss_label->bsym->flags |= BSF_FUNCTION; symbol_get_bfdsym (label_symbol->lss_label)->flags |= BSF_FUNCTION;
} }
else else
as_bad (_("Missing function name for .PROC (corrupted label chain)")); as_bad (_("Missing function name for .PROC (corrupted label chain)"));
@ -5216,7 +5220,8 @@ pa_procend (unused)
if (label_symbol->lss_label) if (label_symbol->lss_label)
{ {
last_call_info->start_symbol = label_symbol->lss_label; last_call_info->start_symbol = label_symbol->lss_label;
label_symbol->lss_label->bsym->flags |= BSF_FUNCTION; symbol_get_bfdsym (label_symbol->lss_label)->flags
|= BSF_FUNCTION;
#ifdef OBJ_SOM #ifdef OBJ_SOM
/* Also handle allocation of a fixup to hold the unwind /* Also handle allocation of a fixup to hold the unwind
information when the label appears after the proc/procend. */ information when the label appears after the proc/procend. */
@ -6572,7 +6577,7 @@ hppa_fix_adjustable (fixp)
|| hppa_fix->fx_r_field == e_lpsel) || hppa_fix->fx_r_field == e_lpsel)
return 0; return 0;
if (fixp->fx_addsy && fixp->fx_addsy->bsym->flags & BSF_GLOBAL) if (fixp->fx_addsy && S_IS_EXTERNAL (fixp->fx_addsy))
return 0; return 0;
/* Reject absolute calls (jumps). */ /* Reject absolute calls (jumps). */
@ -6580,8 +6585,7 @@ hppa_fix_adjustable (fixp)
return 0; return 0;
/* Reject reductions of function symbols. */ /* Reject reductions of function symbols. */
if (fixp->fx_addsy == 0 if (fixp->fx_addsy == 0 || ! S_IS_FUNCTION (fixp->fx_addsy))
|| (fixp->fx_addsy->bsym->flags & BSF_FUNCTION) == 0)
return 1; return 1;
return 0; return 0;
@ -6618,9 +6622,8 @@ hppa_force_relocation (fixp)
call stub. FIXME. Can't we need the same for absolute calls? */ call stub. FIXME. Can't we need the same for absolute calls? */
if (fixp->fx_pcrel && fixp->fx_addsy if (fixp->fx_pcrel && fixp->fx_addsy
&& (arg_reloc_stub_needed ((long) ((obj_symbol_type *) && (arg_reloc_stub_needed ((long) ((obj_symbol_type *)
fixp->fx_addsy->bsym)->tc_data.ap.hppa_arg_reloc, symbol_get_bfdsym (fixp->fx_addsy))->tc_data.ap.hppa_arg_reloc,
hppa_fixp->fx_arg_reloc)))
hppa_fixp->fx_arg_reloc)))
return 1; return 1;
distance = (fixp->fx_offset + S_GET_VALUE (fixp->fx_addsy) distance = (fixp->fx_offset + S_GET_VALUE (fixp->fx_addsy)
- md_pcrel_from (fixp)); - md_pcrel_from (fixp));
@ -6678,7 +6681,7 @@ hppa_elf_mark_end_of_function ()
frag_now); frag_now);
assert (symbolP); assert (symbolP);
symbolP->bsym->flags = BSF_LOCAL; S_CLEAR_EXTERNAL (symbolP);
symbol_table_insert (symbolP); symbol_table_insert (symbolP);
} }
@ -6708,7 +6711,8 @@ elf_hppa_final_processing ()
call_info_pointer = call_info_pointer->ci_next) call_info_pointer = call_info_pointer->ci_next)
{ {
elf_symbol_type *esym elf_symbol_type *esym
= (elf_symbol_type *) call_info_pointer->start_symbol->bsym; = ((elf_symbol_type *)
symbol_get_bfdsym (call_info_pointer->start_symbol));
esym->internal_elf_sym.st_size = esym->internal_elf_sym.st_size =
S_GET_VALUE (call_info_pointer->end_symbol) S_GET_VALUE (call_info_pointer->end_symbol)
- S_GET_VALUE (call_info_pointer->start_symbol) + 4; - S_GET_VALUE (call_info_pointer->start_symbol) + 4;

View file

@ -1,5 +1,6 @@
/* tc-hppa.h -- Header file for the PA /* tc-hppa.h -- Header file for the PA
Copyright (C) 1989, 93, 94, 95, 96, 97, 1998 Free Software Foundation, Inc. Copyright (C) 1989, 93, 94, 95, 96, 97, 98, 1999
Free Software Foundation, Inc.
This file is part of GAS, the GNU Assembler. This file is part of GAS, the GNU Assembler.
@ -128,9 +129,9 @@ void elf_hppa_final_processing PARAMS ((void));
*not* end up in the symbol table. Likewise for absolute symbols *not* end up in the symbol table. Likewise for absolute symbols
with local scope. */ with local scope. */
#define tc_frob_symbol(sym,punt) \ #define tc_frob_symbol(sym,punt) \
if ((S_GET_SEGMENT (sym) == &bfd_und_section && sym->sy_used == 0) \ if ((S_GET_SEGMENT (sym) == &bfd_und_section && ! symbol_used_p (sym)) \
|| (S_GET_SEGMENT (sym) == &bfd_abs_section \ || (S_GET_SEGMENT (sym) == &bfd_abs_section \
&& (sym->bsym->flags & BSF_EXPORT) == 0)) \ && ! S_IS_EXTERNAL (sym))) \
punt = 1 punt = 1
/* We need to be able to make relocations involving the difference of /* We need to be able to make relocations involving the difference of
@ -147,9 +148,9 @@ void elf_hppa_final_processing PARAMS ((void));
#ifdef OBJ_ELF #ifdef OBJ_ELF
#define tc_frob_symbol(sym,punt) \ #define tc_frob_symbol(sym,punt) \
{ \ { \
if ((S_GET_SEGMENT (sym) == &bfd_und_section && sym->sy_used == 0) \ if ((S_GET_SEGMENT (sym) == &bfd_und_section && ! symbol_used_p (sym)) \
|| (S_GET_SEGMENT (sym) == &bfd_abs_section \ || (S_GET_SEGMENT (sym) == &bfd_abs_section \
&& (sym->bsym->flags & BSF_EXPORT) == 0)) \ && ! S_IS_EXTERNAL (sym))) \
punt = 1; \ punt = 1; \
} }
#endif #endif