diff options
author | Jeff Law <law@redhat.com> | 1993-10-31 18:49:26 +0000 |
---|---|---|
committer | Jeff Law <law@redhat.com> | 1993-10-31 18:49:26 +0000 |
commit | 47f45d66367ac7895537b5c767d215c4661765cd (patch) | |
tree | a91efda0660c7368cc9364439d4b66780f779515 /gas/config/tc-hppa.c | |
parent | 00b02f17b5c8df04bb5500c2214d7a7fa386a04a (diff) | |
download | gdb-47f45d66367ac7895537b5c767d215c4661765cd.zip gdb-47f45d66367ac7895537b5c767d215c4661765cd.tar.gz gdb-47f45d66367ac7895537b5c767d215c4661765cd.tar.bz2 |
* config/tc-hppa.c (subspace_dictionary_chain): Add new ssd_defined
field. Define SUBSPACE_DEFINED accessor macro.
(pa_subspace): Allow user to override subspace attributes for
built-in subspaces. Set ssd_defined at the end of fcn -- that
way the attributes can only be changed once. Pass newly allocated
name to is_defined_subspace, not a pointer to the input line.
Fix typo in space/subspace rework.
(is_defined_subspace): Delete unused 2nd arg. All callers changed.
* config/tc-hppa.c (pa_import): If currently in the text segment
and a symbol is imported without type information, set BSF_FUNCTION
for the symbol.
Diffstat (limited to 'gas/config/tc-hppa.c')
-rw-r--r-- | gas/config/tc-hppa.c | 31 |
1 files changed, 21 insertions, 10 deletions
diff --git a/gas/config/tc-hppa.c b/gas/config/tc-hppa.c index b0337b7..7aa6e43 100644 --- a/gas/config/tc-hppa.c +++ b/gas/config/tc-hppa.c @@ -286,6 +286,9 @@ struct subspace_dictionary_chain /* Index of containing space. */ unsigned long ssd_space_index; + /* Nonzero if this space has been defined by the user code. */ + unsigned int ssd_defined; + /* Which quadrant within the space this subspace should be loaded into. */ unsigned char ssd_quadrant; @@ -596,7 +599,7 @@ static ssd_chain_struct *update_subspace PARAMS ((sd_chain_struct *, char, char, char, int, int, int, int, subsegT)); static sd_chain_struct *is_defined_space PARAMS ((char *)); -static ssd_chain_struct *is_defined_subspace PARAMS ((char *, subsegT)); +static ssd_chain_struct *is_defined_subspace PARAMS ((char *)); static sd_chain_struct *pa_segment_to_space PARAMS ((asection *)); static ssd_chain_struct * pa_subsegment_to_subspace PARAMS ((asection *, subsegT)); @@ -1171,6 +1174,7 @@ static struct default_space_dict pa_def_spaces[] = #define SPACE_NAME_INDEX(space_chain) (space_chain)->sd_name_index #define SUBSPACE_SPACE_INDEX(ss_chain) (ss_chain)->ssd_space_index +#define SUBSPACE_DEFINED(ss_chain) (ss_chain)->ssd_defined #define SUBSPACE_QUADRANT(ss_chain) (ss_chain)->ssd_quadrant #define SUBSPACE_ALIGN(ss_chain) (ss_chain)->ssd_alignment #define SUBSPACE_ACCESS(ss_chain) (ss_chain)->ssd_access_control_bits @@ -4936,11 +4940,17 @@ pa_import (unused) if (!is_end_of_statement ()) { input_line_pointer++; - /* Hmmm. This doesn't look right. */ pa_export_args (symbol); } else { + /* Sigh. To be compatable with the HP assembler and to help + poorly written assembly code, we assign a type based on + the the current segment. Note only BSF_FUNCTION really + matters, we do not need to set the full SYMBOL_TYPE_* info here. */ + if (now_seg == text_section) + symbol->bsym->flags |= BSF_FUNCTION; + /* If the section is undefined, then the symbol is undefined Since this is an import, leave the section undefined. */ S_SET_SEGMENT (symbol, &bfd_und_section); @@ -5505,8 +5515,10 @@ pa_subspace (unused) alias = NULL; space = current_space; - ssd = is_defined_subspace (name, space->sd_last_subseg); - if (ssd) + ssd = is_defined_subspace (ss_name); + /* Allow user to override the builtin attributes of subspaces. But + only allow the attributes to be changed once! */ + if (ssd && SUBSPACE_DEFINED (ssd)) { subseg_set (ssd->ssd_seg, ssd->ssd_subseg); if (!is_end_of_statement ()) @@ -5640,7 +5652,7 @@ pa_subspace (unused) but the "standard" sections for ELF. */ if (ssd) section = ssd->ssd_seg; - if (alias) + else if (alias) section = subseg_new (alias, 0); else if (! alias && USE_ALIASES) { @@ -5661,7 +5673,6 @@ pa_subspace (unused) bfd_set_section_vma (stdoutput, section, pa_subspace_start (space, quadrant)); - /* Now that all the flags are set, update an existing subspace, or create a new one. */ if (ssd) @@ -5670,7 +5681,7 @@ pa_subspace (unused) code_only, common, dup_common, sort, zero, access, space_index, alignment, quadrant, - ssd->ssd_subseg); + section); else current_subspace = create_new_subspace (space, ss_name, loadable, code_only, common, @@ -5682,6 +5693,7 @@ pa_subspace (unused) current_subspace->ssd_seg = section; subseg_set (current_subspace->ssd_seg, current_subspace->ssd_subseg); } + SUBSPACE_DEFINED (current_subspace) = 1; return; } @@ -6004,7 +6016,7 @@ update_subspace (space, name, loadable, code_only, common, dup_common, sort, { ssd_chain_struct *chain_entry; - if ((chain_entry = is_defined_subspace (name, subseg))) + if ((chain_entry = is_defined_subspace (name))) { SUBSPACE_ACCESS (chain_entry) = access; SUBSPACE_LOADABLE (chain_entry) = loadable; @@ -6083,9 +6095,8 @@ pa_segment_to_space (seg) own subspace. */ static ssd_chain_struct * -is_defined_subspace (name, subseg) +is_defined_subspace (name) char *name; - subsegT subseg; { sd_chain_struct*space_chain; ssd_chain_struct *subspace_chain; |