various evax patches

This commit is contained in:
Ian Lance Taylor 1997-10-20 19:23:09 +00:00
parent d5241511db
commit 412222d910
8 changed files with 215 additions and 39 deletions

View File

@ -1,6 +1,30 @@
Mon Oct 20 15:01:27 1997 Klaus K"ampf <kkaempf@progis.de>
* evax-egsd.c: make section flags dec c compatible
* evax-egsd.c: Weak symbols are global.
* evax-emh.c: Use proper casts.
* evax-egsd.c (_bfd_evax_write_egsd): Remove unneeded uname.
* evax-egsd.c: Section names and symbols have different
length restrictions. Add length parameter to
_bfd_evax_length_hash_symbol.
* evax-etir.c: Likewise.
* evax-misc.c (_bfd_evax_length_hash_symbol): Add length
parameter.
* evax.h (EOBJ_S_C_SECSIZ): Define.
* evax-alpha.c: Remove duplicate test.
* evax-emh.c: SYS$ functions are upper-case.
* evax-egsd.c: Create separate sections for common symbols.
* evax-etir.c: Don't output common section.
* evax.h: Bump up section count.
* configure.com: Use 64bit integers with DEC C.
* evax-egsd.c: Make section flags dec c compatible.
Mon Oct 20 09:38:31 1997 Jeffrey A Law (law@cygnus.com)

135
bfd/configure.com Normal file
View File

@ -0,0 +1,135 @@
$!
$! This file configures the bfd library for use with openVMS/Alpha
$! We do not use the configure script, since we do not have /bin/sh
$! to execute it.
$!
$! Written by Klaus K"ampf (kkaempf@progis.de)
$!
$arch_indx = 1 + ((f$getsyi("CPU").ge.128).and.1) ! vax==1, alpha==2
$arch = f$element(arch_indx,"|","|VAX|Alpha|")
$if arch .eqs. "VAX"
$then
$ write sys$output "Target VAX not supported."
$ exit 2
$endif
$!
$! copy bfd-in2.h to bfd.h, replacing @ macros
$!
$ edit/tpu/nojournal/nosection/nodisplay/command=sys$input -
[]bfd-in2.h /output=[]bfd.h
$DECK
!
! Copy file, changing lines with macros (@@)
!
!
vfile := CREATE_BUFFER("vfile", "VERSION.");
POSITION(BEGINNING_OF(vfile));
vers := CURRENT_LINE;
file := CREATE_BUFFER("file", GET_INFO(COMMAND_LINE, "file_name"));
rang := CREATE_RANGE(BEGINNING_OF(file), END_OF(file));
match_pos := SEARCH_QUIETLY('@VERSION@', FORWARD, EXACT, rang);
IF match_pos <> 0 THEN;
POSITION(BEGINNING_OF(match_pos));
ERASE(match_pos);
COPY_TEXT(vers);
ENDIF;
match_pos := SEARCH_QUIETLY('@wordsize@', FORWARD, EXACT, rang);
IF match_pos <> 0 THEN;
POSITION(BEGINNING_OF(match_pos));
ERASE(match_pos);
COPY_TEXT('64');
ENDIF;
match_pos := SEARCH_QUIETLY('@BFD_HOST_64BIT_LONG@', FORWARD, EXACT, rang);
IF match_pos <> 0 THEN;
POSITION(BEGINNING_OF(match_pos));
ERASE(match_pos);
COPY_TEXT('0');
ENDIF;
match_pos := SEARCH_QUIETLY('@BFD_HOST_64_BIT_DEFINED@', FORWARD, EXACT, rang);
IF match_pos <> 0 THEN;
POSITION(BEGINNING_OF(match_pos));
ERASE(match_pos);
COPY_TEXT('__DECC');
SPLIT_LINE;
COPY_TEXT('#include <ints.h>');
ENDIF;
match_pos := SEARCH_QUIETLY('@BFD_HOST_64_BIT@', FORWARD, EXACT, rang);
IF match_pos <> 0 THEN;
POSITION(BEGINNING_OF(match_pos));
ERASE(match_pos);
COPY_TEXT('int64');
ENDIF;
match_pos := SEARCH_QUIETLY('@BFD_HOST_U_64_BIT@', FORWARD, EXACT, rang);
IF match_pos <> 0 THEN;
POSITION(BEGINNING_OF(match_pos));
ERASE(match_pos);
COPY_TEXT('uint64');
ENDIF;
WRITE_FILE(file, GET_INFO(COMMAND_LINE, "output_file"));
QUIT
$ EOD
$ write sys$output "Generated `bfd.h' from `bfd-in2.h'."
$!
$!
$! create targmatch.h
$!
$ open/write tfile []targmatch.h
$ write tfile "{ " + """alpha-*-*vms*""" + ","
$ write tfile "#if defined (SELECT_VECS)"
$ write tfile "SELECT_VECS"
$ write tfile "#else"
$ write tfile "UNSUPPORTED_TARGET"
$ write tfile "#endif"
$ write tfile "},"
$ close tfile
$ write sys$output "Generated `targmatch.h'"
$!
$!
$! create config.h
$!
$ create []config.h
/* config.h-vms. Generated by hand by Klaus Kämpf, kkaempf@didymus.rmi.de. */
/* config.in. Generated automatically from configure.in by autoheader. */
/* Whether malloc must be declared even if <stdlib.h> is included. */
/* #undef NEED_DECLARATION_MALLOC */
/* Whether free must be declared even if <stdlib.h> is included. */
/* #undef NEED_DECLARATION_FREE */
/* Define if you have a working `mmap' system call. */
/* #define HAVE_MMAP 1 */
/* Do we need to use the b modifier when opening binary files? */
/* #undef USE_BINARY_FOPEN */
/* Name of host specific header file to include in trad-core.c. */
/* #undef TRAD_HEADER */
/* Define only if <sys/procfs.h> is available *and* it defines prstatus_t. */
/* #undef HAVE_SYS_PROCFS_H */
/* Do we really want to use mmap if it's available? */
/* #undef USE_MMAP */
/* Define if you have the fcntl function. */
#define HAVE_FCNTL 1
/* Define if you have the getpagesize function. */
#define HAVE_GETPAGESIZE 1
/* Define if you have the madvise function. */
#define HAVE_MADVISE 1
/* Define if you have the mprotect function. */
#define HAVE_MPROTECT 1
/* Define if you have the <fcntl.h> header file. */
#define HAVE_FCNTL_H 1
/* Define if you have the <stddef.h> header file. */
#define HAVE_STDDEF_H 1
/* Define if you have the <stdlib.h> header file. */
#define HAVE_STDLIB_H 1
/* Define if you have the <string.h> header file. */
#define HAVE_STRING_H 1
/* Define if you have the <strings.h> header file. */
#define HAVE_STRINGS_H 1
/* Define if you have the <sys/file.h> header file. */
#define HAVE_SYS_FILE_H 1
/* Define if you have the <time.h> header file. */
#define HAVE_TIME_H 1
/* Define if you have the <unistd.h> header file. */
#define HAVE_UNISTD_H 1
$!
$ write sys$output "Generated `config.h'"

View File

@ -1109,8 +1109,6 @@ evax_get_symbol_info (abfd, symbol, ret)
ret->type = 'A';
else if (bfd_is_und_section (sec))
ret->type = 'U';
else if (bfd_is_abs_section (sec))
ret->type = 'A';
else if (bfd_is_ind_section (sec))
ret->type = 'I';
else if (bfd_get_section_flags (abfd, sec) & SEC_CODE)

View File

@ -402,7 +402,6 @@ _bfd_evax_write_egsd (abfd)
char dummy_name[10];
char *sname;
flagword new_flags, old_flags;
char uname[200];
char *nptr, *uptr;
#if EVAX_DEBUG
@ -481,12 +480,20 @@ _bfd_evax_write_egsd (abfd)
else if ((*sname == 'l') && (strcmp (sname, "lcomm") == 0))
sname = EVAX_LOCAL_NAME;
}
else
sname = _bfd_evax_length_hash_symbol (abfd, sname, EOBJ_S_C_SECSIZ);
_bfd_evax_output_begin (abfd, EGSD_S_C_PSC, -1);
_bfd_evax_output_short (abfd, section->alignment_power & 0xff);
_bfd_evax_output_short (abfd,
evax_esecflag_by_name (sname,
section->_raw_size));
if (bfd_is_com_section (section))
{
new_flags = (EGPS_S_V_OVR|EGPS_S_V_REL|EGPS_S_V_GBL|EGPS_S_V_RD|EGPS_S_V_WRT|EGPS_S_V_NOMOD|EGPS_S_V_COM);
}
else
{
new_flags = evax_esecflag_by_name (sname, section->_raw_size);
}
_bfd_evax_output_short (abfd, new_flags);
_bfd_evax_output_long (abfd, section->_raw_size);
_bfd_evax_output_counted (abfd, sname);
_bfd_evax_output_flush (abfd);
@ -514,15 +521,10 @@ _bfd_evax_write_egsd (abfd)
}
old_flags = symbol->flags;
if ((*(symbol->section->name+1) == 'c')
&& (strcmp (symbol->section->name+1, "comm") == 0)
&& (strcmp (symbol->name, ".comm") != 0))
old_flags |= BSF_GLOBAL;
if (old_flags & BSF_FILE)
continue;
if (((old_flags & BSF_GLOBAL) == 0) /* not xdef */
if (((old_flags & (BSF_GLOBAL|BSF_WEAK)) == 0) /* not xdef */
&& (!bfd_is_und_section (symbol->section))) /* and not xref */
continue; /* dont output */
@ -542,14 +544,18 @@ _bfd_evax_write_egsd (abfd)
_bfd_evax_output_short (abfd, 0); /* data type, alignment */
new_flags = 0;
if (old_flags & BSF_WEAK)
new_flags |= EGSY_S_V_WEAK;
if (bfd_is_com_section (symbol->section)) /* .comm */
new_flags |= (EGSY_S_V_WEAK|EGSY_S_V_COMM);
if (old_flags & BSF_FUNCTION)
{
new_flags |= EGSY_S_V_NORM;
new_flags |= EGSY_S_V_REL;
}
if (old_flags & BSF_GLOBAL)
if (old_flags & (BSF_GLOBAL|BSF_WEAK))
{
new_flags |= EGSY_S_V_DEF;
if (!bfd_is_abs_section (symbol->section))
@ -557,7 +563,7 @@ _bfd_evax_write_egsd (abfd)
}
_bfd_evax_output_short (abfd, new_flags);
if (old_flags & BSF_GLOBAL) /* symbol definition */
if (old_flags & (BSF_GLOBAL|BSF_WEAK)) /* symbol definition */
{
if (old_flags & BSF_FUNCTION)
{
@ -574,10 +580,10 @@ _bfd_evax_write_egsd (abfd)
_bfd_evax_output_quad (abfd, symbol->value); /* L_VALUE */
_bfd_evax_output_quad (abfd, 0); /* L_CODE_ADDRESS */
_bfd_evax_output_long (abfd, 0); /* L_CA_PSINDX */
_bfd_evax_output_long (abfd, symbol->section->index);/* L_PSINDX, FIXME */
_bfd_evax_output_long (abfd, symbol->section->index);/* L_PSINDX */
}
}
_bfd_evax_output_counted (abfd, _bfd_evax_length_hash_symbol (abfd, symbol->name));
_bfd_evax_output_counted (abfd, _bfd_evax_length_hash_symbol (abfd, symbol->name, EOBJ_S_C_SYMSIZ));
_bfd_evax_output_flush (abfd);

View File

@ -159,7 +159,7 @@ get_vms_time_string ()
} Descriptor;
Descriptor.Size = 17;
Descriptor.Ptr = tbuf;
sys$asctim (0, &Descriptor, 0, 0);
SYS$ASCTIM (0, &Descriptor, 0, 0);
#endif /* not VMS */
#if EVAX_DEBUG
@ -273,7 +273,7 @@ _bfd_evax_write_emh (abfd)
continue;
}
_bfd_evax_output_dump (abfd, (char *)symbol->name, strlen (symbol->name));
_bfd_evax_output_dump (abfd, (unsigned char *)symbol->name, strlen (symbol->name));
if (had_case)
break;
had_file = 1;
@ -281,7 +281,7 @@ _bfd_evax_write_emh (abfd)
}
if (symnum == abfd->symcount)
_bfd_evax_output_dump (abfd, "noname", 6);
_bfd_evax_output_dump (abfd, (unsigned char *)"noname", 6);
_bfd_evax_output_flush (abfd);

View File

@ -1172,7 +1172,8 @@ _bfd_evax_write_etir (abfd)
#endif
}
if (section->flags & SEC_HAS_CONTENTS)
if ((section->flags & SEC_HAS_CONTENTS)
&& (! bfd_is_com_section (section)))
{
bfd_vma vaddr; /* virtual addr in section */
@ -1246,7 +1247,7 @@ _bfd_evax_write_etir (abfd)
ETIR_S_C_STO_GBL_LW,
-1);
_bfd_evax_output_counted (abfd,
_bfd_evax_length_hash_symbol (abfd, sym->name));
_bfd_evax_length_hash_symbol (abfd, sym->name, EOBJ_S_C_SYMSIZ));
_bfd_evax_output_flush (abfd);
}
else if (bfd_is_abs_section (sym->section))
@ -1312,7 +1313,7 @@ _bfd_evax_write_etir (abfd)
ETIR_S_C_STO_GBL,
-1);
_bfd_evax_output_counted (abfd,
_bfd_evax_length_hash_symbol (abfd, sym->name));
_bfd_evax_length_hash_symbol (abfd, sym->name, EOBJ_S_C_SYMSIZ));
_bfd_evax_output_flush (abfd);
}
else if (bfd_is_abs_section (sym->section))
@ -1374,7 +1375,7 @@ _bfd_evax_write_etir (abfd)
evax_output_long(abfd, (unsigned long)(sec->index));
evax_output_quad(abfd, (uquad)addr);
evax_output_counted(abfd, _bfd_evax_length_hash_symbol (abfd, sym->name));
evax_output_counted(abfd, _bfd_evax_length_hash_symbol (abfd, sym->name, EOBJ_S_C_SYMSIZ));
evax_output_flush(abfd);
#endif
}
@ -1394,7 +1395,7 @@ _bfd_evax_write_etir (abfd)
(unsigned long)PRIV(evax_linkage_index));
PRIV(evax_linkage_index) += 2;
_bfd_evax_output_counted (abfd,
_bfd_evax_length_hash_symbol (abfd, sym->name));
_bfd_evax_length_hash_symbol (abfd, sym->name, EOBJ_S_C_SYMSIZ));
_bfd_evax_output_byte (abfd, 0);
_bfd_evax_output_flush (abfd);
}
@ -1415,7 +1416,7 @@ _bfd_evax_write_etir (abfd)
ETIR_S_C_STO_CA,
-1);
_bfd_evax_output_counted (abfd,
_bfd_evax_length_hash_symbol (abfd, sym->name));
_bfd_evax_length_hash_symbol (abfd, sym->name, EOBJ_S_C_SYMSIZ));
_bfd_evax_output_flush (abfd);
}
break;

View File

@ -972,12 +972,13 @@ hash_string (ptr)
return hash;
}
/* Generate a length-hashed VMS symbol name (limited to 64 chars). */
/* Generate a length-hashed VMS symbol name (limited to maxlen chars). */
char *
_bfd_evax_length_hash_symbol (abfd, in)
_bfd_evax_length_hash_symbol (abfd, in, maxlen)
bfd *abfd;
const char *in;
int maxlen;
{
long int init;
long int result;
@ -986,45 +987,55 @@ _bfd_evax_length_hash_symbol (abfd, in)
char *new_name;
const char *old_name;
int i;
static char outbuf[65];
static char outbuf[EOBJ_S_C_SYMSIZ+1];
char *out = outbuf;
#if EVAX_DEBUG
evax_debug(4, "_bfd_evax_length_hash_symbol \"%s\"\n", in);
#endif
if (maxlen > EOBJ_S_C_SYMSIZ)
maxlen = EOBJ_S_C_SYMSIZ;
new_name = out; /* save this for later. */
/* We may need to truncate the symbol, save the hash for later. */
in_len = strlen (in);
result = (in_len > 64) ? hash_string (in) : 0;
result = (in_len > maxlen) ? hash_string (in) : 0;
old_name = in;
/* Do the length checking. */
if (in_len <= 64)
i = in_len;
if (in_len <= maxlen)
{
i = in_len;
}
else
{
if (PRIV(flag_hash_long_names))
i = maxlen-9;
else
i = 55;
i = maxlen;
}
strncpy (out, in, i);
in += i;
out += i;
if ((in_len > 64)
if ((in_len > maxlen)
&& PRIV(flag_hash_long_names))
sprintf (out, "_%08x", result);
else
*out = 0;
*out = 0;
#if EVAX_DEBUG
evax_debug(4, "--> [%d]\"%s\"\n", strlen (outbuf), outbuf);
#endif
if (in_len > 64
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);

View File

@ -195,7 +195,8 @@ extern int _bfd_evax_write_edbg PARAMS ((bfd *abfd));
#define EOBJ_S_C_SUBTYP 4
#define EOBJ_S_C_MAXRECSIZ 8192 /*Maximum legal record size */
#define EOBJ_S_C_STRLVL 2 /*Structure level */
#define EOBJ_S_C_SYMSIZ 64 /*Maxymum symbol length */
#define EOBJ_S_C_SYMSIZ 64 /*Maximum symbol length */
#define EOBJ_S_C_SECSIZ 31 /*Maximum section name length */
#define EOBJ_S_C_STOREPLIM -1 /*Maximum repeat count on store commands */
#define EOBJ_S_C_PSCALILIM 16 /*Maximum p-sect alignment */
@ -278,7 +279,7 @@ struct location_struct {
};
#define LOCATION_SAVE_SIZE 32
#define EVAX_SECTION_COUNT 32
#define EVAX_SECTION_COUNT 1024
struct evax_private_data_struct {
boolean fixup_done; /* Flag to indicate if all
@ -377,6 +378,6 @@ extern void _bfd_evax_output_counted PARAMS ((bfd *abfd, char *value));
extern void _bfd_evax_output_dump PARAMS ((bfd *abfd, unsigned char *data,
int length));
extern void _bfd_evax_output_fill PARAMS ((bfd *abfd, int value, int length));
extern char *_bfd_evax_length_hash_symbol PARAMS ((bfd *abfd, const char *in));
extern char *_bfd_evax_length_hash_symbol PARAMS ((bfd *abfd, const char *in, int maxlen));
#endif /* EVAX_H */