* ecoff.c (_bfd_ecoff_bfd_is_local_label): New function.
authorIan Lance Taylor <ian@airs.com>
Wed, 5 Jul 1995 16:31:07 +0000 (16:31 +0000)
committerIan Lance Taylor <ian@airs.com>
Wed, 5 Jul 1995 16:31:07 +0000 (16:31 +0000)
* libecoff.h (_bfd_ecoff_bfd_is_local_label): Declare.
* elf32-mips.c (mips_elf_is_local_label): New static function.
(bfd_elf32_bfd_is_local_label): Define.
PR 6978.

bfd/ChangeLog
bfd/ecoff.c
bfd/elf32-mips.c
bfd/libecoff.h

index 772a2523b645e1a5d0e59a5f6a685aac614b62c7..f83f58cb0d2a68680548c7e512393926698e16e1 100644 (file)
@@ -1,5 +1,10 @@
 Wed Jul  5 10:31:47 1995  Ian Lance Taylor  <ian@cygnus.com>
 
+       * ecoff.c (_bfd_ecoff_bfd_is_local_label): New function.
+       * libecoff.h (_bfd_ecoff_bfd_is_local_label): Declare.
+       * elf32-mips.c (mips_elf_is_local_label): New static function.
+       (bfd_elf32_bfd_is_local_label): Define.
+
        * configure.in: Use $ac_config_sub, not $configsub.
        * configure: Likewise.
 
index 21d81d996b4f1dce5e5392b5e1ae33d7acdd83c8..b85bf41d2044b3c568cfcd7e09a4cd13b23a95c9 100644 (file)
@@ -1467,6 +1467,17 @@ _bfd_ecoff_get_symbol_info (abfd, symbol, ret)
   bfd_symbol_info (symbol, ret);
 }
 
+/* Return whether this is a local label.  */
+
+/*ARGSUSED*/
+boolean
+_bfd_ecoff_bfd_is_local_label (abfd, symbol)
+     bfd *abfd;
+     asymbol *symbol;
+{
+  return symbol->name[0] == '$';
+}
+
 /* Print information about an ECOFF symbol.  */
 
 void
index 9ec539382448bd393fd2817dc6b0f9b643c9f2ab..0ae106572ff5a2e835f310453af3c571a60be9cc 100644 (file)
@@ -84,6 +84,8 @@ static boolean mips_elf_section_processing
 static void mips_elf_symbol_processing PARAMS ((bfd *, asymbol *));
 static boolean mips_elf_read_ecoff_info
   PARAMS ((bfd *, asection *, struct ecoff_debug_info *));
+static boolean mips_elf_is_local_label
+  PARAMS ((bfd *, asymbol *));
 static boolean mips_elf_find_nearest_line
   PARAMS ((bfd *, asection *, asymbol **, bfd_vma, const char **,
           const char **, unsigned int *));
@@ -791,8 +793,8 @@ mips_elf_gprel16_reloc (abfd,
        }
     }
 
-  return gprel16_with_gp (symbol, reloc_entry, input_section, relocateable,
-                         data, elf_gp (output_bfd));
+  return gprel16_with_gp (abfd, symbol, reloc_entry, input_section,
+                         relocateable, data, elf_gp (output_bfd));
 }
 
 static bfd_reloc_status_type
@@ -1507,6 +1509,17 @@ mips_elf_read_ecoff_info (abfd, section, debug)
   return false;
 }
 \f
+/* MIPS ELF local labels start with '$', not 'L'.  */
+
+/*ARGSUSED*/
+static boolean
+mips_elf_is_local_label (abfd, symbol)
+     bfd *abfd;
+     asymbol *symbol;
+{
+  return symbol->name[0] == '$';
+}
+
 /* MIPS ELF uses a special find_nearest_line routine in order the
    handle the ECOFF debugging information.  */
 
@@ -2805,7 +2818,7 @@ elf32_mips_get_relocated_section_contents (abfd, link_info, link_order, data,
          lh = 0;
        else
          {
-           h = bfd_hash_lookup (link_info->hash, "_gp", false, false);
+           h = bfd_hash_lookup (&link_info->hash->table, "_gp", false, false);
            lh = (struct bfd_link_hash_entry *) h;
          }
       lookup:
@@ -2990,6 +3003,7 @@ static const struct ecoff_debug_swap mips_elf_ecoff_debug_swap =
                                        mips_elf_final_write_processing
 #define elf_backend_ecoff_debug_swap   &mips_elf_ecoff_debug_swap
 
+#define bfd_elf32_bfd_is_local_label   mips_elf_is_local_label
 #define bfd_elf32_find_nearest_line    mips_elf_find_nearest_line
 
 #define bfd_elf32_bfd_link_hash_table_create \
index a6b8777021e87e0a73bcc356ab1e546d7a82e3c5..1b9d9a23bc36bc2bd10197814e3364d3602a0148 100644 (file)
@@ -50,7 +50,7 @@ struct ecoff_backend_data
   /* Bitsize of constructor entries.  */
   unsigned int constructor_bitsize;
   /* Reloc to use for constructor entries.  */
-  CONST struct reloc_howto_struct *constructor_reloc;
+  reloc_howto_type *constructor_reloc;
   /* How to swap debugging information.  */
   struct ecoff_debug_swap debug_swap;
   /* External reloc size.  */
@@ -124,6 +124,11 @@ typedef struct ecoff_tdata
   /* True if this BFD was written by the backend linker.  */
   boolean linker;
 
+  /* Used by find_nearest_line entry point.  The structure could be
+     included directly in this one, but there's no point to wasting
+     the memory just for the infrequently called find_nearest_line.  */
+  struct ecoff_find_line *find_line_info;
+
 } ecoff_data_type;
 
 /* Each canonical asymbol really looks like this.  */
@@ -149,11 +154,11 @@ typedef struct ecoff_symbol_struct
    macro is only ever applied to an asymbol.  */
 #define ecoffsymbol(asymbol) ((ecoff_symbol_type *) (&((asymbol)->the_bfd)))
 
-/* This is a hack borrowed from coffcode.h; we need to save the index
-   of an external symbol when we write it out so that can set the
-   symbol index correctly when we write out the relocs.  */
-#define ecoff_get_sym_index(symbol) ((unsigned long) (symbol)->udata)
-#define ecoff_set_sym_index(symbol, idx) ((symbol)->udata = (PTR) (idx))
+/* We need to save the index of an external symbol when we write it
+   out so that can set the symbol index correctly when we write out
+   the relocs.  */
+#define ecoff_get_sym_index(symbol) ((symbol)->udata.i)
+#define ecoff_set_sym_index(symbol, idx) ((symbol)->udata.i = (idx))
 
 /* When generating MIPS embedded PIC code, the linker relaxes the code
    to turn PC relative branches into longer code sequences when the PC
@@ -238,18 +243,30 @@ extern boolean _bfd_ecoff_new_section_hook
 extern boolean _bfd_ecoff_get_section_contents
   PARAMS ((bfd *, asection *, PTR location, file_ptr, bfd_size_type));
 
+#define _bfd_ecoff_bfd_link_split_section _bfd_generic_link_split_section
+
 extern boolean _bfd_ecoff_bfd_copy_private_bfd_data PARAMS ((bfd *, bfd *));
 #define _bfd_ecoff_bfd_copy_private_section_data \
   _bfd_generic_bfd_copy_private_section_data
 
+#define _bfd_ecoff_bfd_copy_private_symbol_data \
+  _bfd_generic_bfd_copy_private_symbol_data
+
+#define _bfd_ecoff_bfd_merge_private_bfd_data \
+  _bfd_generic_bfd_merge_private_bfd_data
+
+#define _bfd_ecoff_bfd_set_private_flags _bfd_generic_bfd_set_private_flags
 extern boolean _bfd_ecoff_slurp_armap PARAMS ((bfd *abfd));
 #define _bfd_ecoff_slurp_extended_name_table _bfd_slurp_extended_name_table
+#define _bfd_ecoff_construct_extended_name_table \
+  _bfd_archive_bsd_construct_extended_name_table
 #define _bfd_ecoff_truncate_arname bfd_dont_truncate_arname
 extern boolean _bfd_ecoff_write_armap
   PARAMS ((bfd *, unsigned int, struct orl *, unsigned int, int));
 #define _bfd_ecoff_openr_next_archived_file \
   bfd_generic_openr_next_archived_file
 #define _bfd_ecoff_generic_stat_arch_elt bfd_generic_stat_arch_elt
+#define _bfd_ecoff_update_armap_timestamp bfd_true
 
 extern long _bfd_ecoff_get_symtab_upper_bound PARAMS ((bfd *abfd));
 extern long _bfd_ecoff_get_symtab PARAMS ((bfd *abfd, asymbol **alocation));
@@ -258,7 +275,8 @@ extern void _bfd_ecoff_print_symbol
   PARAMS ((bfd *, PTR filep, asymbol *, bfd_print_symbol_type));
 extern void _bfd_ecoff_get_symbol_info
   PARAMS ((bfd *, asymbol *, symbol_info *));
-#define _bfd_ecoff_bfd_is_local_label bfd_generic_is_local_label
+extern boolean _bfd_ecoff_bfd_is_local_label
+  PARAMS ((bfd *, asymbol *));
 #define _bfd_ecoff_get_lineno _bfd_nosymbols_get_lineno
 extern boolean _bfd_ecoff_find_nearest_line
   PARAMS ((bfd *, asection *, asymbol **, bfd_vma offset,
@@ -296,3 +314,15 @@ extern boolean _bfd_ecoff_set_arch_mach_hook PARAMS ((bfd *abfd, PTR filehdr));
 extern flagword _bfd_ecoff_styp_to_sec_flags
   PARAMS ((bfd *abfd, PTR hdr, const char *name));
 extern boolean _bfd_ecoff_slurp_symbol_table PARAMS ((bfd *abfd));
+
+/* ECOFF auxiliary information swapping routines.  These are the same
+   for all ECOFF targets, so they are defined in ecofflink.c.  */
+
+extern void _bfd_ecoff_swap_tir_in
+  PARAMS ((int, const struct tir_ext *, TIR *));
+extern void _bfd_ecoff_swap_tir_out
+  PARAMS ((int, const TIR *, struct tir_ext *));
+extern void _bfd_ecoff_swap_rndx_in
+  PARAMS ((int, const struct rndx_ext *, RNDXR *));
+extern void _bfd_ecoff_swap_rndx_out
+  PARAMS ((int, const RNDXR *, struct rndx_ext *));