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:
Tristan Gingold 2010-05-18 09:37:05 +00:00
parent 0fca53b78d
commit bd7b51b4c6
2 changed files with 184 additions and 147 deletions

View File

@ -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>
* vms-alpha.c (evax_bfd_print_dst): Handle INCR_LINUM_L.

View File

@ -2555,6 +2555,178 @@ alpha_vms_object_p (bfd *abfd)
/* 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
vector_grow1 (struct vector_type *vec, size_t elsz)
{
@ -2988,88 +3160,6 @@ alpha_vms_write_exec (bfd *abfd)
/* 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. */
static bfd_boolean
@ -3297,42 +3387,14 @@ _bfd_vms_write_ehdr (bfd *abfd)
unsigned int symnum;
int had_case = 0;
int had_file = 0;
char version [256];
struct vms_rec_wr *recwr = &PRIV (recwr);
vms_debug2 ((2, "vms_write_ehdr (%p)\n", abfd));
_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);
/* 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);
_bfd_vms_write_emh (abfd);
_bfd_vms_write_lmn (abfd, "GNU AS");
/* SRC. */
_bfd_vms_output_begin (recwr, EOBJ__C_EMH);
@ -3864,41 +3926,6 @@ _bfd_vms_write_etir (bfd * abfd, int objtype ATTRIBUTE_UNUSED)
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. */
static bfd_boolean