* config/tc-hppa.c (subspace_dictionary_chain): Add new ssd_defined
authorJeff Law <law@redhat.com>
Sun, 31 Oct 1993 18:49:26 +0000 (18:49 +0000)
committerJeff Law <law@redhat.com>
Sun, 31 Oct 1993 18:49:26 +0000 (18:49 +0000)
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.

gas/ChangeLog
gas/config/tc-hppa.c

index 61905dd09226dee96dcc36cd656bb05b87c53355..508238c77cda5ee6c594f02ab8450f8f7fdfa012 100644 (file)
@@ -1,5 +1,17 @@
 Sun Oct 31 00:36:40 1993  Jeffrey A. Law  (law@snake.cs.utah.edu)
 
+       * 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.
        * write.c (relax_and_size_seg): Correct test to determine if
        the section's size was rounded up.
 
index b0337b7a145d8662000a99fe02c1b0a7200fb7b8..7aa6e4397d52406f24f7ba524bf4c39e33c11132 100644 (file)
@@ -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;