| Index: bfd/vms-alpha.c
|
| diff --git a/bfd/vms-alpha.c b/bfd/vms-alpha.c
|
| index 8b98560743731a3d8983e9800cd8c4407c589a38..09438aebf1d203c882ac305c87e5eddded83a2b1 100644
|
| --- a/bfd/vms-alpha.c
|
| +++ b/bfd/vms-alpha.c
|
| @@ -1,6 +1,5 @@
|
| /* vms.c -- BFD back-end for EVAX (openVMS/Alpha) files.
|
| - Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
|
| - 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
|
| + Copyright 1996-2013 Free Software Foundation, Inc.
|
|
|
| Initial version written by Klaus Kaempf (kkaempf@rmi.de)
|
| Major rewrite by Adacore.
|
| @@ -331,10 +330,6 @@ struct vms_private_data_struct
|
|
|
| /* linkage index counter used by conditional store commands */
|
| unsigned int vms_linkage_index;
|
| -
|
| - /* see tc-alpha.c of gas for a description. */
|
| - int flag_hash_long_names; /* -+, hash instead of truncate */
|
| - int flag_show_after_trunc; /* -H, show hashing/truncation */
|
| };
|
|
|
| #define PRIV2(abfd, name) \
|
| @@ -2686,88 +2681,6 @@ _bfd_vms_write_eeom (bfd *abfd)
|
| return TRUE;
|
| }
|
|
|
| -/* This hash routine borrowed from GNU-EMACS, and strengthened
|
| - slightly. ERY. */
|
| -
|
| -static int
|
| -hash_string (const char *ptr)
|
| -{
|
| - const unsigned char *p = (unsigned char *) ptr;
|
| - const unsigned char *end = p + strlen (ptr);
|
| - unsigned char c;
|
| - int hash = 0;
|
| -
|
| - while (p != end)
|
| - {
|
| - c = *p++;
|
| - hash = ((hash << 3) + (hash << 15) + (hash >> 28) + c);
|
| - }
|
| - return hash;
|
| -}
|
| -
|
| -/* Generate a length-hashed VMS symbol name (limited to maxlen chars). */
|
| -
|
| -static char *
|
| -_bfd_vms_length_hash_symbol (bfd *abfd, const char *in, int maxlen)
|
| -{
|
| - unsigned long result;
|
| - int in_len;
|
| - char *new_name;
|
| - const char *old_name;
|
| - int i;
|
| - static char outbuf[EOBJ__C_SYMSIZ + 1];
|
| - char *out = outbuf;
|
| -
|
| -#if VMS_DEBUG
|
| - vms_debug (4, "_bfd_vms_length_hash_symbol \"%s\"\n", in);
|
| -#endif
|
| -
|
| - if (maxlen > EOBJ__C_SYMSIZ)
|
| - maxlen = EOBJ__C_SYMSIZ;
|
| -
|
| - /* Save this for later. */
|
| - new_name = out;
|
| -
|
| - /* We may need to truncate the symbol, save the hash for later. */
|
| - in_len = strlen (in);
|
| -
|
| - result = (in_len > maxlen) ? hash_string (in) : 0;
|
| -
|
| - old_name = in;
|
| -
|
| - /* Do the length checking. */
|
| - if (in_len <= maxlen)
|
| - i = in_len;
|
| - else
|
| - {
|
| - if (PRIV (flag_hash_long_names))
|
| - i = maxlen - 9;
|
| - else
|
| - i = maxlen;
|
| - }
|
| -
|
| - strncpy (out, in, (size_t) i);
|
| - in += i;
|
| - out += i;
|
| -
|
| - if ((in_len > maxlen)
|
| - && PRIV (flag_hash_long_names))
|
| - sprintf (out, "_%08lx", result);
|
| - else
|
| - *out = 0;
|
| -
|
| -#if VMS_DEBUG
|
| - vms_debug (4, "--> [%d]\"%s\"\n", (int)strlen (outbuf), outbuf);
|
| -#endif
|
| -
|
| - if (in_len > maxlen
|
| - && PRIV (flag_hash_long_names)
|
| - && PRIV (flag_show_after_trunc))
|
| - printf (_("Symbol %s replaced by %s\n"), old_name, new_name);
|
| -
|
| - return outbuf;
|
| -}
|
| -
|
| static void
|
| vector_grow1 (struct vector_type *vec, size_t elsz)
|
| {
|
| @@ -3241,7 +3154,6 @@ alpha_vms_write_exec (bfd *abfd)
|
| for (i = 0; i < PRIV (gsd_sym_count); i++)
|
| {
|
| struct vms_symbol_entry *sym = PRIV (syms)[i];
|
| - char *hash;
|
| bfd_vma val;
|
| bfd_vma ep;
|
|
|
| @@ -3268,8 +3180,7 @@ alpha_vms_write_exec (bfd *abfd)
|
| _bfd_vms_output_quad (recwr, ep);
|
| _bfd_vms_output_quad (recwr, val);
|
| _bfd_vms_output_long (recwr, 0);
|
| - hash = _bfd_vms_length_hash_symbol (abfd, sym->name, EOBJ__C_SYMSIZ);
|
| - _bfd_vms_output_counted (recwr, hash);
|
| + _bfd_vms_output_counted (recwr, sym->name);
|
| _bfd_vms_output_end_subrec (recwr);
|
| if ((i % 5) == 4)
|
| _bfd_vms_output_end (abfd, recwr);
|
| @@ -3364,8 +3275,6 @@ _bfd_vms_write_egsd (bfd *abfd)
|
| else if ((*sname == 'l') && (strcmp (sname, "lcomm") == 0))
|
| sname = EVAX_LOCAL_NAME;
|
| }
|
| - else
|
| - sname = _bfd_vms_length_hash_symbol (abfd, sname, EOBJ__C_SECSIZ);
|
|
|
| if (bfd_is_com_section (section))
|
| new_flags = (EGPS__V_OVR | EGPS__V_REL | EGPS__V_GBL | EGPS__V_RD
|
| @@ -3405,18 +3314,13 @@ _bfd_vms_write_egsd (bfd *abfd)
|
|
|
| for (symnum = 0; symnum < abfd->symcount; symnum++)
|
| {
|
| - char *hash;
|
| -
|
| symbol = abfd->outsymbols[symnum];
|
| old_flags = symbol->flags;
|
|
|
| /* Work-around a missing feature: consider __main as the main entry
|
| point. */
|
| - if (*(symbol->name) == '_')
|
| - {
|
| - if (strcmp (symbol->name, "__main") == 0)
|
| - bfd_set_start_address (abfd, (bfd_vma)symbol->value);
|
| - }
|
| + if (symbol->name[0] == '_' && strcmp (symbol->name, "__main") == 0)
|
| + bfd_set_start_address (abfd, (bfd_vma)symbol->value);
|
|
|
| /* Only put in the GSD the global and the undefined symbols. */
|
| if (old_flags & BSF_FILE)
|
| @@ -3509,8 +3413,7 @@ _bfd_vms_write_egsd (bfd *abfd)
|
| _bfd_vms_output_long (recwr, ca_psindx);
|
| _bfd_vms_output_long (recwr, psindx);
|
| }
|
| - hash = _bfd_vms_length_hash_symbol (abfd, symbol->name, EOBJ__C_SYMSIZ);
|
| - _bfd_vms_output_counted (recwr, hash);
|
| + _bfd_vms_output_counted (recwr, symbol->name);
|
|
|
| _bfd_vms_output_end_subrec (recwr);
|
| }
|
| @@ -3528,8 +3431,6 @@ _bfd_vms_write_ehdr (bfd *abfd)
|
| {
|
| asymbol *symbol;
|
| unsigned int symnum;
|
| - int had_case = 0;
|
| - int had_file = 0;
|
| struct vms_rec_wr *recwr = &PRIV (recwr);
|
|
|
| vms_debug2 ((2, "vms_write_ehdr (%p)\n", abfd));
|
| @@ -3549,22 +3450,9 @@ _bfd_vms_write_ehdr (bfd *abfd)
|
|
|
| if (symbol->flags & BSF_FILE)
|
| {
|
| - if (CONST_STRNEQ ((char *)symbol->name, "<CASE:"))
|
| - {
|
| - PRIV (flag_hash_long_names) = symbol->name[6] - '0';
|
| - PRIV (flag_show_after_trunc) = symbol->name[7] - '0';
|
| -
|
| - if (had_file)
|
| - break;
|
| - had_case = 1;
|
| - continue;
|
| - }
|
| -
|
| _bfd_vms_output_dump (recwr, (unsigned char *) symbol->name,
|
| (int) strlen (symbol->name));
|
| - if (had_case)
|
| - break;
|
| - had_file = 1;
|
| + break;
|
| }
|
| }
|
|
|
| @@ -3800,7 +3688,6 @@ _bfd_vms_write_etir (bfd * abfd, int objtype ATTRIBUTE_UNUSED)
|
| asection *sec = sym->section;
|
| bfd_boolean defer = defer_reloc_p (rptr);
|
| unsigned int slen;
|
| - char *hash;
|
|
|
| if (pass2_in_progress)
|
| {
|
| @@ -3839,13 +3726,11 @@ _bfd_vms_write_etir (bfd * abfd, int objtype ATTRIBUTE_UNUSED)
|
| {
|
| bfd_vma addend = rptr->addend;
|
| slen = strlen ((char *) sym->name);
|
| - hash = _bfd_vms_length_hash_symbol
|
| - (abfd, sym->name, EOBJ__C_SYMSIZ);
|
| etir_output_check (abfd, section, curr_addr, slen);
|
| if (addend)
|
| {
|
| _bfd_vms_output_begin_subrec (recwr, ETIR__C_STA_GBL);
|
| - _bfd_vms_output_counted (recwr, hash);
|
| + _bfd_vms_output_counted (recwr, sym->name);
|
| _bfd_vms_output_end_subrec (recwr);
|
| _bfd_vms_output_begin_subrec (recwr, ETIR__C_STA_LW);
|
| _bfd_vms_output_long (recwr, (unsigned long) addend);
|
| @@ -3859,7 +3744,7 @@ _bfd_vms_write_etir (bfd * abfd, int objtype ATTRIBUTE_UNUSED)
|
| {
|
| _bfd_vms_output_begin_subrec
|
| (recwr, ETIR__C_STO_GBL_LW);
|
| - _bfd_vms_output_counted (recwr, hash);
|
| + _bfd_vms_output_counted (recwr, sym->name);
|
| _bfd_vms_output_end_subrec (recwr);
|
| }
|
| }
|
| @@ -3894,13 +3779,11 @@ _bfd_vms_write_etir (bfd * abfd, int objtype ATTRIBUTE_UNUSED)
|
| {
|
| bfd_vma addend = rptr->addend;
|
| slen = strlen ((char *) sym->name);
|
| - hash = _bfd_vms_length_hash_symbol
|
| - (abfd, sym->name, EOBJ__C_SYMSIZ);
|
| etir_output_check (abfd, section, curr_addr, slen);
|
| if (addend)
|
| {
|
| _bfd_vms_output_begin_subrec (recwr, ETIR__C_STA_GBL);
|
| - _bfd_vms_output_counted (recwr, hash);
|
| + _bfd_vms_output_counted (recwr, sym->name);
|
| _bfd_vms_output_end_subrec (recwr);
|
| _bfd_vms_output_begin_subrec (recwr, ETIR__C_STA_QW);
|
| _bfd_vms_output_quad (recwr, addend);
|
| @@ -3913,7 +3796,7 @@ _bfd_vms_write_etir (bfd * abfd, int objtype ATTRIBUTE_UNUSED)
|
| else
|
| {
|
| _bfd_vms_output_begin_subrec (recwr, ETIR__C_STO_GBL);
|
| - _bfd_vms_output_counted (recwr, hash);
|
| + _bfd_vms_output_counted (recwr, sym->name);
|
| _bfd_vms_output_end_subrec (recwr);
|
| }
|
| }
|
| @@ -3950,20 +3833,16 @@ _bfd_vms_write_etir (bfd * abfd, int objtype ATTRIBUTE_UNUSED)
|
| (recwr, (unsigned long) rptr->addend);
|
| if (rptr->addend > PRIV (vms_linkage_index))
|
| PRIV (vms_linkage_index) = rptr->addend;
|
| - hash = _bfd_vms_length_hash_symbol
|
| - (abfd, sym->name, EOBJ__C_SYMSIZ);
|
| - _bfd_vms_output_counted (recwr, hash);
|
| + _bfd_vms_output_counted (recwr, sym->name);
|
| _bfd_vms_output_byte (recwr, 0);
|
| _bfd_vms_output_end_subrec (recwr);
|
| break;
|
|
|
| case ALPHA_R_CODEADDR:
|
| slen = strlen ((char *) sym->name);
|
| - hash = _bfd_vms_length_hash_symbol
|
| - (abfd, sym->name, EOBJ__C_SYMSIZ);
|
| etir_output_check (abfd, section, curr_addr, slen);
|
| _bfd_vms_output_begin_subrec (recwr, ETIR__C_STO_CA);
|
| - _bfd_vms_output_counted (recwr, hash);
|
| + _bfd_vms_output_counted (recwr, sym->name);
|
| _bfd_vms_output_end_subrec (recwr);
|
| break;
|
|
|
| @@ -3981,9 +3860,7 @@ _bfd_vms_write_etir (bfd * abfd, int objtype ATTRIBUTE_UNUSED)
|
| _bfd_vms_output_long
|
| (recwr, (unsigned long) section->target_index);
|
| _bfd_vms_output_quad (recwr, rptr->addend);
|
| - _bfd_vms_output_counted
|
| - (recwr, _bfd_vms_length_hash_symbol
|
| - (abfd, udata->origname, EOBJ__C_SYMSIZ));
|
| + _bfd_vms_output_counted (recwr, udata->origname);
|
| _bfd_vms_output_end_subrec (recwr);
|
| break;
|
|
|
| @@ -4006,9 +3883,7 @@ _bfd_vms_write_etir (bfd * abfd, int objtype ATTRIBUTE_UNUSED)
|
| _bfd_vms_output_long
|
| (recwr, (unsigned long) udata->bsym->section->target_index);
|
| _bfd_vms_output_quad (recwr, rptr->addend);
|
| - _bfd_vms_output_counted
|
| - (recwr, _bfd_vms_length_hash_symbol
|
| - (abfd, udata->origname, EOBJ__C_SYMSIZ));
|
| + _bfd_vms_output_counted (recwr, udata->origname);
|
| _bfd_vms_output_end_subrec (recwr);
|
| break;
|
|
|
| @@ -4026,9 +3901,7 @@ _bfd_vms_write_etir (bfd * abfd, int objtype ATTRIBUTE_UNUSED)
|
| _bfd_vms_output_long
|
| (recwr, (unsigned long) section->target_index);
|
| _bfd_vms_output_quad (recwr, rptr->addend);
|
| - _bfd_vms_output_counted
|
| - (recwr, _bfd_vms_length_hash_symbol
|
| - (abfd, udata->origname, EOBJ__C_SYMSIZ));
|
| + _bfd_vms_output_counted (recwr, udata->origname);
|
| _bfd_vms_output_end_subrec (recwr);
|
| break;
|
|
|
| @@ -4741,6 +4614,26 @@ _bfd_vms_find_nearest_dst_line (bfd *abfd, asection *section,
|
|
|
| return FALSE;
|
| }
|
| +
|
| +/* Likewise but with a discriminator. */
|
| +
|
| +static bfd_boolean
|
| +_bfd_vms_find_nearest_line_discriminator (bfd *abfd,
|
| + asection *section,
|
| + asymbol **symbols,
|
| + bfd_vma offset,
|
| + const char **filename_ptr,
|
| + const char **functionname_ptr,
|
| + unsigned int *line_ptr,
|
| + unsigned int *discriminator)
|
| +{
|
| + *discriminator = 0;
|
| +
|
| + return _bfd_vms_find_nearest_dst_line (abfd, section, symbols, offset,
|
| + filename_ptr, functionname_ptr,
|
| + line_ptr);
|
| +}
|
| +
|
|
|
| /* Canonicalizations. */
|
| /* Set name, value, section and flags of SYM from E. */
|
| @@ -6044,7 +5937,7 @@ evax_bfd_print_etir (FILE *file, const char *name,
|
| unsigned char *rec, unsigned int rec_len)
|
| {
|
| unsigned int off = sizeof (struct vms_egsd);
|
| - unsigned int sec_len;
|
| + unsigned int sec_len = 0;
|
|
|
| fprintf (file, _(" %s (len=%u+%u):\n"), name,
|
| (unsigned)(rec_len - sizeof (struct vms_eobjrec)),
|
| @@ -7849,7 +7742,7 @@ evax_bfd_print_image (bfd *abfd, FILE *file)
|
| }
|
| if (lpfixoff != 0)
|
| {
|
| - fprintf (file, _(" Linkage Pairs Referece Fixups:\n"));
|
| + fprintf (file, _(" Linkage Pairs Reference Fixups:\n"));
|
| evax_bfd_print_reference_fixups (file, buf + lpfixoff);
|
| }
|
| if (chgprtoff)
|
| @@ -9118,7 +9011,8 @@ vms_new_section_hook (bfd * abfd, asection *section)
|
| vms_debug2 ((1, "vms_new_section_hook (%p, [%d]%s)\n",
|
| abfd, section->index, section->name));
|
|
|
| - bfd_set_section_alignment (abfd, section, 0);
|
| + if (! bfd_set_section_alignment (abfd, section, 0))
|
| + return FALSE;
|
|
|
| vms_debug2 ((7, "%d: %s\n", section->index, section->name));
|
|
|
| @@ -9228,7 +9122,6 @@ static bfd_boolean
|
| vms_bfd_is_local_label_name (bfd * abfd ATTRIBUTE_UNUSED,
|
| const char *name)
|
| {
|
| - vms_debug2 ((1, "vms_bfd_is_local_label_name (%p, %s)\n", abfd, name));
|
| return name[0] == '$';
|
| }
|
|
|
| @@ -9322,6 +9215,8 @@ bfd_vms_get_data (bfd *abfd)
|
| #define alpha_vms_find_inliner_info _bfd_nosymbols_find_inliner_info
|
| #define alpha_vms_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol
|
| #define alpha_vms_find_nearest_line _bfd_vms_find_nearest_dst_line
|
| +#define _bfd_generic_find_nearest_line_discriminator \
|
| + _bfd_vms_find_nearest_line_discriminator
|
| #define alpha_vms_bfd_is_local_label_name vms_bfd_is_local_label_name
|
|
|
| /* Generic table. */
|
|
|