/* obj-evax.c - EVAX (openVMS/Alpha) object file format.
- Copyright 1996, 1997, 2005, 2007, 2008, 2009 Free Software Foundation, Inc.
+ Copyright (C) 1996-2019 Free Software Foundation, Inc.
Contributed by Klaus Kämpf (kkaempf@progis.de) of
proGIS Software, Aachen, Germany.
Extensively enhanced by Douglas Rupp of AdaCore.
#define OBJ_HEADER "obj-evax.h"
+#include "as.h"
#include "bfd.h"
#include "vms.h"
-#include "as.h"
#include "subsegs.h"
-#include "struc-symbol.h"
#include "safe-ctype.h"
static void s_evax_weak (int);
do
{
- name = input_line_pointer;
- c = get_symbol_end ();
+ c = get_symbol_name (&name);
symbolP = symbol_find_or_make (name);
- *input_line_pointer = c;
+ (void) restore_line_pointer (c);
SKIP_WHITESPACE ();
S_SET_WEAK (symbolP);
if (c == ',')
{
struct evax_private_udata_struct *udata;
- udata = (struct evax_private_udata_struct *)
- xmalloc (sizeof (struct evax_private_udata_struct));
+ udata = XNEW (struct evax_private_udata_struct);
udata->bsym = symbol_get_bfdsym (sym);
udata->enbsym = NULL;
O_symbol and we hope the equated symbol is still there. */
sym = symbol_get_value_expression (sym)->X_add_symbol;
if (sym == NULL)
- abort ();
+ {
+ as_bad (_("no entry symbol for global function '%s'"), symname);
+ return;
+ }
symbol = symbol_get_bfdsym (sym);
udata->enbsym
= ((struct evax_private_udata_struct *)symbol->udata.p)->enbsym;
{
if (S_GET_SEGMENT (l->fixp->fx_addsy) == alpha_link_section)
{
- symbolS * entry_sym;
+ /* The symbol is defined in the file. The linkage entry decays to
+ two relocs. */
+ symbolS *entry_sym;
fixS *fixpentry, *fixppdesc, *fixtail;
fixtail = seginfo->fix_tail;
fixpentry = fix_new (l->fixp->fx_frag, l->fixp->fx_where, 8,
entry_sym, l->fixp->fx_offset, 0,
BFD_RELOC_64);
- fixppdesc = fix_new (l->fixp->fx_frag, l->fixp->fx_where+8, 8,
+ fixppdesc = fix_new (l->fixp->fx_frag, l->fixp->fx_where + 8, 8,
l->fixp->fx_addsy, l->fixp->fx_offset, 0,
BFD_RELOC_64);
l->fixp->fx_size = 0;
}
else
{
+ /* Assign a linkage index. */
((struct evax_private_udata_struct *)
symbol_get_bfdsym (l->label)->udata.p)->lkindex = linkage_index;
/* The length is computed from the maximum allowable length of 64 less the
4 character ..xx extension that must be preserved (removed before
- krunching and appended back on afterwards). The $<nnn>.. prefix is
+ crunching and appended back on afterwards). The $<nnn>.. prefix is
also removed and prepened back on, but doesn't enter into the length
computation because symbols with that prefix are always resolved
by the assembler and will never appear in the symbol table. At least
}
}
- /* We only need worry about krunching the base symbol. */
- base_id = xmalloc (suffix_dotdot - prefix_dotdot + 1);
- strncpy (base_id, &id[prefix_dotdot], suffix_dotdot - prefix_dotdot);
- base_id [suffix_dotdot - prefix_dotdot] = 0;
+ /* We only need worry about crunching the base symbol. */
+ base_id = xmemdup0 (&id[prefix_dotdot], suffix_dotdot - prefix_dotdot);
if (strlen (base_id) > MAX_LABEL_LENGTH)
{
strcat (new_id, suffix);
/* Save it on the heap and return. */
- return_id = xmalloc (strlen (new_id) + 1);
- strcpy (return_id, new_id);
+ return_id = xstrdup (new_id);
return return_id;
}
which further designates that the name was truncated):
"original_identifier"_haaaaabbbccc
-
+
aaaaa = 32-bit CRC
bbb = length of original identifier
ccc = sum of 32-bit CRC characters
an integer. */
static char decodings[256];
-/* Table used by the crc32 function to calcuate the checksum. */
+/* Table used by the crc32 function to calculate the checksum. */
static unsigned int crc32_table[256] = {0, 0};
-/* Given a string in BUF, calculate a 32-bit CRC for it.
+/* Given a string in BUF, calculate a 32-bit CRC for it.
This is used as a reasonably unique hash for the given string. */
newname [MAX_LABEL_LENGTH] = 0;
/* Now append the suffix of the original identifier, if any. */
if (suffix_length)
- strncpy (newname + MAX_LABEL_LENGTH - suffix_length,
- name + len - suffix_length,
- suffix_length);
- strncpy (newname + final_len, "_h", 2);
- strncpy (newname + final_len + 2 , crc_chars, 5);
- strncpy (newname + final_len + 2 + 5, encode_16 (len), 3);
- strncpy (newname + final_len + 2 + 5 + 3, encode_16 (sum), 3);
+ strncpy (newname + MAX_LABEL_LENGTH - suffix_length,
+ name + len - suffix_length,
+ suffix_length);
+ memcpy (newname + final_len, "_h", 2);
+ memcpy (newname + final_len + 2 , crc_chars, 5);
+ memcpy (newname + final_len + 2 + 5, encode_16 (len), 3);
+ memcpy (newname + final_len + 2 + 5 + 3, encode_16 (sum), 3);
if (!is_truncated_identifier (newname))
abort ();
return newname;
a truncated identifier. */
if (len != MAX_LABEL_LENGTH)
return 0;
-
+
/* Start scanning backwards for a _h. */
len = len - 3 - 3 - 5 - 2;
ptr = id + len;
{
if (ptr[0] == '_' && ptr[1] == 'h')
{
- /* Now see if the sum encoded in the identifer matches. */
+ /* Now see if the sum encoded in the identifier matches. */
int x, sum;
sum = 0;
for (x = 0; x < 5; x++)