* 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>
* 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.c: Likewise.
(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) \
((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) \
((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
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)
{
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
/* Also handle allocation of a fixup to hold the unwind
information when the label appears after the proc/procend. */
@ -2731,13 +2732,14 @@ tc_gen_reloc (section, fixp)
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,
fixp->fx_r_type,
hppa_fixp->fx_r_format,
hppa_fixp->fx_r_field,
fixp->fx_subsy != NULL,
fixp->fx_addsy->bsym);
symbol_get_bfdsym (fixp->fx_addsy));
if (codes == NULL)
abort ();
@ -2760,7 +2762,8 @@ tc_gen_reloc (section, fixp)
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->address = fixp->fx_frag->fr_address + fixp->fx_where;
reloc->addend = 0; /* default */
@ -3068,8 +3071,8 @@ md_apply_fix (fixP, valp)
&& fixP->fx_addsy
&& fixP->fx_pcrel
&& !arg_reloc_stub_needed ((long) ((obj_symbol_type *)
fixP->fx_addsy->bsym)->tc_data.ap.hppa_arg_reloc,
hppa_fixP->fx_arg_reloc)
symbol_get_bfdsym (fixP->fx_addsy))->tc_data.ap.hppa_arg_reloc,
hppa_fixP->fx_arg_reloc)
&& (((int)(*valp) > -262144 && (int)(*valp) < 262143) && fmt != 22)
&& S_GET_SEGMENT (fixP->fx_addsy) == hppa_fixP->segment
&& !(fixP->fx_subsy
@ -4602,7 +4605,7 @@ pa_comm (unused)
/* colon() has already set the frag to the current location in the
current subspace; we need to reset the fragment to the zero address
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 ();
}
@ -4809,13 +4812,13 @@ pa_type_args (symbolP, is_export)
char *name, c, *p;
unsigned int temp, arg_reloc;
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)
{
input_line_pointer += 8;
symbolP->bsym->flags &= ~BSF_FUNCTION;
symbol_get_bfdsym (symbolP)->flags &= ~BSF_FUNCTION;
S_SET_SEGMENT (symbolP, bfd_abs_section_ptr);
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
done. Both GCC and HP C still try to IMPORT CODE types, so
silently fix them to be ENTRY types. */
if (symbolP->bsym->flags & BSF_FUNCTION)
if (S_IS_FUNCTION (symbolP))
{
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;
}
else
{
symbolP->bsym->flags &= ~BSF_FUNCTION;
symbol_get_bfdsym (symbolP)->flags &= ~BSF_FUNCTION;
type = SYMBOL_TYPE_CODE;
}
}
else if (strncasecmp (input_line_pointer, "data", 4) == 0)
{
input_line_pointer += 4;
symbolP->bsym->flags &= ~BSF_FUNCTION;
symbol_get_bfdsym (symbolP)->flags &= ~BSF_FUNCTION;
type = SYMBOL_TYPE_DATA;
}
else if ((strncasecmp (input_line_pointer, "entry", 5) == 0))
{
input_line_pointer += 5;
symbolP->bsym->flags |= BSF_FUNCTION;
symbol_get_bfdsym (symbolP)->flags |= BSF_FUNCTION;
type = SYMBOL_TYPE_ENTRY;
}
else if (strncasecmp (input_line_pointer, "millicode", 9) == 0)
{
input_line_pointer += 9;
symbolP->bsym->flags |= BSF_FUNCTION;
symbol_get_bfdsym (symbolP)->flags |= BSF_FUNCTION;
type = SYMBOL_TYPE_MILLICODE;
}
else if (strncasecmp (input_line_pointer, "plabel", 6) == 0)
{
input_line_pointer += 6;
symbolP->bsym->flags &= ~BSF_FUNCTION;
symbol_get_bfdsym (symbolP)->flags &= ~BSF_FUNCTION;
type = SYMBOL_TYPE_PLABEL;
}
else if (strncasecmp (input_line_pointer, "pri_prog", 8) == 0)
{
input_line_pointer += 8;
symbolP->bsym->flags |= BSF_FUNCTION;
symbol_get_bfdsym (symbolP)->flags |= BSF_FUNCTION;
type = SYMBOL_TYPE_PRI_PROG;
}
else if (strncasecmp (input_line_pointer, "sec_prog", 8) == 0)
{
input_line_pointer += 8;
symbolP->bsym->flags |= BSF_FUNCTION;
symbol_get_bfdsym (symbolP)->flags |= BSF_FUNCTION;
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
to the SOM BFD backend. */
#ifdef obj_set_symbol_type
obj_set_symbol_type (symbolP->bsym, (int) type);
obj_set_symbol_type (symbol_get_bfdsym (symbolP), (int) type);
#endif
/* 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
matters, we do not need to set the full SYMBOL_TYPE_* info. */
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
Since this is an import, leave the section undefined. */
@ -5177,7 +5181,7 @@ pa_proc (unused)
if (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
as_bad (_("Missing function name for .PROC (corrupted label chain)"));
@ -5216,7 +5220,8 @@ pa_procend (unused)
if (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
/* Also handle allocation of a fixup to hold the unwind
information when the label appears after the proc/procend. */
@ -6572,7 +6577,7 @@ hppa_fix_adjustable (fixp)
|| hppa_fix->fx_r_field == e_lpsel)
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;
/* Reject absolute calls (jumps). */
@ -6580,8 +6585,7 @@ hppa_fix_adjustable (fixp)
return 0;
/* Reject reductions of function symbols. */
if (fixp->fx_addsy == 0
|| (fixp->fx_addsy->bsym->flags & BSF_FUNCTION) == 0)
if (fixp->fx_addsy == 0 || ! S_IS_FUNCTION (fixp->fx_addsy))
return 1;
return 0;
@ -6618,9 +6622,8 @@ hppa_force_relocation (fixp)
call stub. FIXME. Can't we need the same for absolute calls? */
if (fixp->fx_pcrel && fixp->fx_addsy
&& (arg_reloc_stub_needed ((long) ((obj_symbol_type *)
fixp->fx_addsy->bsym)->tc_data.ap.hppa_arg_reloc,
hppa_fixp->fx_arg_reloc)))
symbol_get_bfdsym (fixp->fx_addsy))->tc_data.ap.hppa_arg_reloc,
hppa_fixp->fx_arg_reloc)))
return 1;
distance = (fixp->fx_offset + S_GET_VALUE (fixp->fx_addsy)
- md_pcrel_from (fixp));
@ -6678,7 +6681,7 @@ hppa_elf_mark_end_of_function ()
frag_now);
assert (symbolP);
symbolP->bsym->flags = BSF_LOCAL;
S_CLEAR_EXTERNAL (symbolP);
symbol_table_insert (symbolP);
}
@ -6708,7 +6711,8 @@ elf_hppa_final_processing ()
call_info_pointer = call_info_pointer->ci_next)
{
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 =
S_GET_VALUE (call_info_pointer->end_symbol)
- S_GET_VALUE (call_info_pointer->start_symbol) + 4;

View File

@ -1,5 +1,6 @@
/* 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.
@ -128,9 +129,9 @@ void elf_hppa_final_processing PARAMS ((void));
*not* end up in the symbol table. Likewise for absolute symbols
with local scope. */
#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 \
&& (sym->bsym->flags & BSF_EXPORT) == 0)) \
&& ! S_IS_EXTERNAL (sym))) \
punt = 1
/* 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
#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 \
&& (sym->bsym->flags & BSF_EXPORT) == 0)) \
&& ! S_IS_EXTERNAL (sym))) \
punt = 1; \
}
#endif