2010-05-18 Tristan Gingold <gingold@adacore.com>
* vms-alpha.c (_bfd_vms_write_emh): New function. (_bfd_vms_write_lmn): New function. (_bfd_vms_write_eeom): Moved. (hash_string): Likewise. (_bfd_vms_length_hash_symbol): Likewise. (_bfd_vms_write_ehdr): Code moved to _bfd_vms_write_emh and _bfd_vms_write_lmn, and call these functions.
This commit is contained in:
parent
0fca53b78d
commit
bd7b51b4c6
2 changed files with 184 additions and 147 deletions
|
@ -1,3 +1,13 @@
|
||||||
|
2010-05-18 Tristan Gingold <gingold@adacore.com>
|
||||||
|
|
||||||
|
* vms-alpha.c (_bfd_vms_write_emh): New function.
|
||||||
|
(_bfd_vms_write_lmn): New function.
|
||||||
|
(_bfd_vms_write_eeom): Moved.
|
||||||
|
(hash_string): Likewise.
|
||||||
|
(_bfd_vms_length_hash_symbol): Likewise.
|
||||||
|
(_bfd_vms_write_ehdr): Code moved to _bfd_vms_write_emh
|
||||||
|
and _bfd_vms_write_lmn, and call these functions.
|
||||||
|
|
||||||
2010-05-18 Tristan Gingold <gingold@adacore.com>
|
2010-05-18 Tristan Gingold <gingold@adacore.com>
|
||||||
|
|
||||||
* vms-alpha.c (evax_bfd_print_dst): Handle INCR_LINUM_L.
|
* vms-alpha.c (evax_bfd_print_dst): Handle INCR_LINUM_L.
|
||||||
|
|
321
bfd/vms-alpha.c
321
bfd/vms-alpha.c
|
@ -2555,6 +2555,178 @@ alpha_vms_object_p (bfd *abfd)
|
||||||
|
|
||||||
/* Image write. */
|
/* Image write. */
|
||||||
|
|
||||||
|
/* Write an EMH/MHD record. */
|
||||||
|
|
||||||
|
static void
|
||||||
|
_bfd_vms_write_emh (bfd *abfd)
|
||||||
|
{
|
||||||
|
struct vms_rec_wr *recwr = &PRIV (recwr);
|
||||||
|
|
||||||
|
_bfd_vms_output_alignment (recwr, 2);
|
||||||
|
|
||||||
|
/* EMH. */
|
||||||
|
_bfd_vms_output_begin (recwr, EOBJ__C_EMH);
|
||||||
|
_bfd_vms_output_short (recwr, EMH__C_MHD);
|
||||||
|
_bfd_vms_output_short (recwr, EOBJ__C_STRLVL);
|
||||||
|
_bfd_vms_output_long (recwr, 0);
|
||||||
|
_bfd_vms_output_long (recwr, 0);
|
||||||
|
_bfd_vms_output_long (recwr, MAX_OUTREC_SIZE);
|
||||||
|
|
||||||
|
/* Create module name from filename. */
|
||||||
|
if (bfd_get_filename (abfd) != 0)
|
||||||
|
{
|
||||||
|
char *module = vms_get_module_name (bfd_get_filename (abfd), TRUE);
|
||||||
|
_bfd_vms_output_counted (recwr, module);
|
||||||
|
free (module);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
_bfd_vms_output_counted (recwr, "NONAME");
|
||||||
|
|
||||||
|
_bfd_vms_output_counted (recwr, BFD_VERSION_STRING);
|
||||||
|
_bfd_vms_output_dump (recwr, get_vms_time_string (), EMH_DATE_LENGTH);
|
||||||
|
_bfd_vms_output_fill (recwr, 0, EMH_DATE_LENGTH);
|
||||||
|
_bfd_vms_output_end (abfd, recwr);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Write an EMH/LMN record. */
|
||||||
|
|
||||||
|
static void
|
||||||
|
_bfd_vms_write_lmn (bfd *abfd, const char *name)
|
||||||
|
{
|
||||||
|
char version [64];
|
||||||
|
struct vms_rec_wr *recwr = &PRIV (recwr);
|
||||||
|
unsigned int ver = BFD_VERSION / 10000;
|
||||||
|
|
||||||
|
/* LMN. */
|
||||||
|
_bfd_vms_output_begin (recwr, EOBJ__C_EMH);
|
||||||
|
_bfd_vms_output_short (recwr, EMH__C_LNM);
|
||||||
|
snprintf (version, sizeof (version), "%s %d.%d.%d", name,
|
||||||
|
ver / 10000, (ver / 100) % 100, ver % 100);
|
||||||
|
_bfd_vms_output_dump (recwr, (unsigned char *)version, strlen (version));
|
||||||
|
_bfd_vms_output_end (abfd, recwr);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Write eom record for bfd abfd. Return FALSE on error. */
|
||||||
|
|
||||||
|
static bfd_boolean
|
||||||
|
_bfd_vms_write_eeom (bfd *abfd)
|
||||||
|
{
|
||||||
|
struct vms_rec_wr *recwr = &PRIV (recwr);
|
||||||
|
|
||||||
|
vms_debug2 ((2, "vms_write_eeom\n"));
|
||||||
|
|
||||||
|
_bfd_vms_output_alignment (recwr, 2);
|
||||||
|
|
||||||
|
_bfd_vms_output_begin (recwr, EOBJ__C_EEOM);
|
||||||
|
_bfd_vms_output_long (recwr, (unsigned long) (PRIV (vms_linkage_index) >> 1));
|
||||||
|
_bfd_vms_output_byte (recwr, 0); /* Completion code. */
|
||||||
|
_bfd_vms_output_byte (recwr, 0); /* Fill byte. */
|
||||||
|
|
||||||
|
if ((abfd->flags & EXEC_P) == 0
|
||||||
|
&& bfd_get_start_address (abfd) != (bfd_vma)-1)
|
||||||
|
{
|
||||||
|
asection *section;
|
||||||
|
|
||||||
|
section = bfd_get_section_by_name (abfd, ".link");
|
||||||
|
if (section == 0)
|
||||||
|
{
|
||||||
|
bfd_set_error (bfd_error_nonrepresentable_section);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
_bfd_vms_output_short (recwr, 0);
|
||||||
|
_bfd_vms_output_long (recwr, (unsigned long) (section->index));
|
||||||
|
_bfd_vms_output_long (recwr,
|
||||||
|
(unsigned long) bfd_get_start_address (abfd));
|
||||||
|
_bfd_vms_output_long (recwr, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
_bfd_vms_output_end (abfd, recwr);
|
||||||
|
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
|
static void
|
||||||
vector_grow1 (struct vector_type *vec, size_t elsz)
|
vector_grow1 (struct vector_type *vec, size_t elsz)
|
||||||
{
|
{
|
||||||
|
@ -2988,88 +3160,6 @@ alpha_vms_write_exec (bfd *abfd)
|
||||||
|
|
||||||
/* Object write. */
|
/* Object write. */
|
||||||
|
|
||||||
/* 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Write section and symbol directory of bfd abfd. Return FALSE on error. */
|
/* Write section and symbol directory of bfd abfd. Return FALSE on error. */
|
||||||
|
|
||||||
static bfd_boolean
|
static bfd_boolean
|
||||||
|
@ -3297,42 +3387,14 @@ _bfd_vms_write_ehdr (bfd *abfd)
|
||||||
unsigned int symnum;
|
unsigned int symnum;
|
||||||
int had_case = 0;
|
int had_case = 0;
|
||||||
int had_file = 0;
|
int had_file = 0;
|
||||||
char version [256];
|
|
||||||
struct vms_rec_wr *recwr = &PRIV (recwr);
|
struct vms_rec_wr *recwr = &PRIV (recwr);
|
||||||
|
|
||||||
vms_debug2 ((2, "vms_write_ehdr (%p)\n", abfd));
|
vms_debug2 ((2, "vms_write_ehdr (%p)\n", abfd));
|
||||||
|
|
||||||
_bfd_vms_output_alignment (recwr, 2);
|
_bfd_vms_output_alignment (recwr, 2);
|
||||||
|
|
||||||
/* EMH. */
|
_bfd_vms_write_emh (abfd);
|
||||||
_bfd_vms_output_begin (recwr, EOBJ__C_EMH);
|
_bfd_vms_write_lmn (abfd, "GNU AS");
|
||||||
_bfd_vms_output_short (recwr, EMH__C_MHD);
|
|
||||||
_bfd_vms_output_short (recwr, EOBJ__C_STRLVL);
|
|
||||||
_bfd_vms_output_long (recwr, 0);
|
|
||||||
_bfd_vms_output_long (recwr, 0);
|
|
||||||
_bfd_vms_output_long (recwr, MAX_OUTREC_SIZE);
|
|
||||||
|
|
||||||
/* Create module name from filename. */
|
|
||||||
if (bfd_get_filename (abfd) != 0)
|
|
||||||
{
|
|
||||||
char *module = vms_get_module_name (bfd_get_filename (abfd), TRUE);
|
|
||||||
_bfd_vms_output_counted (recwr, module);
|
|
||||||
free (module);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
_bfd_vms_output_counted (recwr, "NONAME");
|
|
||||||
|
|
||||||
_bfd_vms_output_counted (recwr, BFD_VERSION_STRING);
|
|
||||||
_bfd_vms_output_dump (recwr, get_vms_time_string (), EMH_DATE_LENGTH);
|
|
||||||
_bfd_vms_output_fill (recwr, 0, EMH_DATE_LENGTH);
|
|
||||||
_bfd_vms_output_end (abfd, recwr);
|
|
||||||
|
|
||||||
/* LMN. */
|
|
||||||
_bfd_vms_output_begin (recwr, EOBJ__C_EMH);
|
|
||||||
_bfd_vms_output_short (recwr, EMH__C_LNM);
|
|
||||||
snprintf (version, sizeof (version), "GAS BFD v%s", BFD_VERSION_STRING);
|
|
||||||
_bfd_vms_output_dump (recwr, (unsigned char *)version, strlen (version));
|
|
||||||
_bfd_vms_output_end (abfd, recwr);
|
|
||||||
|
|
||||||
/* SRC. */
|
/* SRC. */
|
||||||
_bfd_vms_output_begin (recwr, EOBJ__C_EMH);
|
_bfd_vms_output_begin (recwr, EOBJ__C_EMH);
|
||||||
|
@ -3864,41 +3926,6 @@ _bfd_vms_write_etir (bfd * abfd, int objtype ATTRIBUTE_UNUSED)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Write eom record for bfd abfd. Return FALSE on error. */
|
|
||||||
|
|
||||||
static bfd_boolean
|
|
||||||
_bfd_vms_write_eeom (bfd *abfd)
|
|
||||||
{
|
|
||||||
struct vms_rec_wr *recwr = &PRIV (recwr);
|
|
||||||
|
|
||||||
vms_debug2 ((2, "vms_write_eeom\n"));
|
|
||||||
|
|
||||||
_bfd_vms_output_begin (recwr, EOBJ__C_EEOM);
|
|
||||||
_bfd_vms_output_long (recwr, (unsigned long) (PRIV (vms_linkage_index) >> 1));
|
|
||||||
_bfd_vms_output_byte (recwr, 0); /* Completion code. */
|
|
||||||
_bfd_vms_output_byte (recwr, 0); /* Fill byte. */
|
|
||||||
|
|
||||||
if (bfd_get_start_address (abfd) != (bfd_vma)-1)
|
|
||||||
{
|
|
||||||
asection *section;
|
|
||||||
|
|
||||||
section = bfd_get_section_by_name (abfd, ".link");
|
|
||||||
if (section == 0)
|
|
||||||
{
|
|
||||||
bfd_set_error (bfd_error_nonrepresentable_section);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
_bfd_vms_output_short (recwr, 0);
|
|
||||||
_bfd_vms_output_long (recwr, (unsigned long) (section->index));
|
|
||||||
_bfd_vms_output_long (recwr,
|
|
||||||
(unsigned long) bfd_get_start_address (abfd));
|
|
||||||
_bfd_vms_output_long (recwr, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
_bfd_vms_output_end (abfd, recwr);
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Write cached information into a file being written, at bfd_close. */
|
/* Write cached information into a file being written, at bfd_close. */
|
||||||
|
|
||||||
static bfd_boolean
|
static bfd_boolean
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue