/* vms-tir.c -- BFD back-end for VAX (openVMS/VAX) and
EVAX (openVMS/Alpha) files.
- Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002
+ Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2004, 2005, 2007
Free Software Foundation, Inc.
TIR record handling functions
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
+ the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+ Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+ MA 02110-1301, USA. */
+
/* The following type abbreviations are used:
qw quadword (8 byte, 64 bit)
da data stream */
-#include "bfd.h"
#include "sysdep.h"
+#include "bfd.h"
#include "bfdlink.h"
#include "libbfd.h"
-
#include "vms.h"
-
-static void image_set_ptr PARAMS ((bfd *abfd, int psect, uquad offset));
-static void image_inc_ptr PARAMS ((bfd *abfd, uquad offset));
-static void image_dump PARAMS ((bfd *abfd, unsigned char *ptr, int size, int offset));
-static void image_write_b PARAMS ((bfd *abfd, unsigned int value));
-static void image_write_w PARAMS ((bfd *abfd, unsigned int value));
-static void image_write_l PARAMS ((bfd *abfd, unsigned long value));
-static void image_write_q PARAMS ((bfd *abfd, uquad value));
-static int check_section PARAMS ((bfd *, int));
-static boolean etir_sta PARAMS ((bfd *, int, unsigned char *));
-static boolean etir_sto PARAMS ((bfd *, int, unsigned char *));
-static boolean etir_opr PARAMS ((bfd *, int, unsigned char *));
-static boolean etir_ctl PARAMS ((bfd *, int, unsigned char *));
-static boolean etir_stc PARAMS ((bfd *, int, unsigned char *));
-static asection *new_section PARAMS ((bfd *, int));
-static int alloc_section PARAMS ((bfd *, unsigned int));
-static int etir_cmd PARAMS ((bfd *, int, unsigned char *));
-static int analyze_tir PARAMS ((bfd *, unsigned char *, unsigned int));
-static int analyze_etir PARAMS ((bfd *, unsigned char *, unsigned int));
-static unsigned char * tir_opr PARAMS ((bfd *, unsigned char *));
-static const char * tir_cmd_name PARAMS ((int));
-static const char * cmd_name PARAMS ((int));
-
\f
static int
-check_section (abfd, size)
- bfd *abfd;
- int size;
+check_section (bfd * abfd, int size)
{
bfd_size_type offset;
offset = PRIV (image_ptr) - PRIV (image_section)->contents;
- if (offset + size > PRIV (image_section)->_raw_size)
+ if (offset + size > PRIV (image_section)->size)
{
PRIV (image_section)->contents
= bfd_realloc (PRIV (image_section)->contents, offset + size);
(*_bfd_error_handler) (_("No Mem !"));
return -1;
}
- PRIV (image_section)->_raw_size = offset + size;
+ PRIV (image_section)->size = offset + size;
PRIV (image_ptr) = PRIV (image_section)->contents + offset;
}
/* Initialize image buffer pointer to be filled. */
static void
-image_set_ptr (abfd, psect, offset)
- bfd *abfd;
- int psect;
- uquad offset;
+image_set_ptr (bfd * abfd, int psect, uquad offset)
{
#if VMS_DEBUG
_bfd_vms_debug (4, "image_set_ptr (%d=%s, %d)\n",
PRIV (image_ptr) = PRIV (sections)[psect]->contents + offset;
PRIV (image_section) = PRIV (sections)[psect];
- return;
}
/* Increment image buffer pointer by offset. */
static void
-image_inc_ptr (abfd, offset)
- bfd *abfd;
- uquad offset;
+image_inc_ptr (bfd * abfd, uquad offset)
{
#if VMS_DEBUG
_bfd_vms_debug (4, "image_inc_ptr (%d)\n", offset);
#endif
PRIV (image_ptr) += offset;
-
- return;
}
/* Dump multiple bytes to section image. */
static void
-image_dump (abfd, ptr, size, offset)
- bfd *abfd;
- unsigned char *ptr;
- int size;
- int offset ATTRIBUTE_UNUSED;
+image_dump (bfd * abfd,
+ unsigned char *ptr,
+ int size,
+ int offset ATTRIBUTE_UNUSED)
{
#if VMS_DEBUG
_bfd_vms_debug (8, "image_dump from (%p, %d) to (%p)\n", ptr, size,
while (size-- > 0)
*PRIV (image_ptr)++ = *ptr++;
- return;
}
/* Write byte to section image. */
static void
-image_write_b (abfd, value)
- bfd *abfd;
- unsigned int value;
+image_write_b (bfd * abfd, unsigned int value)
{
#if VMS_DEBUG
- _bfd_vms_debug (6, "image_write_b(%02x)\n", (int) value);
+ _bfd_vms_debug (6, "image_write_b (%02x)\n", (int) value);
#endif
if (PRIV (is_vax) && check_section (abfd, 1))
return;
*PRIV (image_ptr)++ = (value & 0xff);
- return;
}
/* Write 2-byte word to image. */
static void
-image_write_w (abfd, value)
- bfd *abfd;
- unsigned int value;
+image_write_w (bfd * abfd, unsigned int value)
{
#if VMS_DEBUG
- _bfd_vms_debug (6, "image_write_w(%04x)\n", (int) value);
+ _bfd_vms_debug (6, "image_write_w (%04x)\n", (int) value);
#endif
if (PRIV (is_vax) && check_section (abfd, 2))
bfd_putl16 ((bfd_vma) value, PRIV (image_ptr));
PRIV (image_ptr) += 2;
-
- return;
}
/* Write 4-byte long to image. */
static void
-image_write_l (abfd, value)
- bfd *abfd;
- unsigned long value;
+image_write_l (bfd * abfd, unsigned long value)
{
#if VMS_DEBUG
_bfd_vms_debug (6, "image_write_l (%08lx)\n", value);
bfd_putl32 ((bfd_vma) value, PRIV (image_ptr));
PRIV (image_ptr) += 4;
-
- return;
}
/* Write 8-byte quad to image. */
static void
-image_write_q (abfd, value)
- bfd *abfd;
- uquad value;
+image_write_q (bfd * abfd, uquad value)
{
#if VMS_DEBUG
_bfd_vms_debug (6, "image_write_q (%016lx)\n", value);
bfd_putl64 (value, PRIV (image_ptr));
PRIV (image_ptr) += 8;
-
- return;
}
\f
static const char *
-cmd_name (cmd)
- int cmd;
+cmd_name (int cmd)
{
switch (cmd)
{
see table B-8 of the openVMS linker manual. */
-static boolean
-etir_sta (abfd, cmd, ptr)
- bfd *abfd;
- int cmd;
- unsigned char *ptr;
+static bfd_boolean
+etir_sta (bfd * abfd, int cmd, unsigned char *ptr)
{
-
#if VMS_DEBUG
_bfd_vms_debug (5, "etir_sta %d/%x\n", cmd, cmd);
_bfd_hexdump (8, ptr, 16, (int) ptr);
switch (cmd)
{
- /* stack */
-
/* stack global
arg: cs symbol name
- stack 32 bit value of symbol (high bits set to 0) */
-
+ stack 32 bit value of symbol (high bits set to 0). */
case ETIR_S_C_STA_GBL:
{
char *name;
name = _bfd_vms_save_counted_string (ptr);
entry = (vms_symbol_entry *)
- bfd_hash_lookup (PRIV (vms_symbol_table), name, false, false);
- if (entry == (vms_symbol_entry *) NULL)
+ bfd_hash_lookup (PRIV (vms_symbol_table), name, FALSE, FALSE);
+ if (entry == NULL)
{
#if VMS_DEBUG
_bfd_vms_debug (3, "%s: no symbol \"%s\"\n",
_bfd_vms_push (abfd, (uquad) 0, -1);
}
else
- {
- _bfd_vms_push (abfd, (uquad) (entry->symbol->value), -1);
- }
+ _bfd_vms_push (abfd, (uquad) (entry->symbol->value), -1);
}
break;
/* stack longword
arg: lw value
- stack 32 bit value, sign extend to 64 bit */
-
+ stack 32 bit value, sign extend to 64 bit. */
case ETIR_S_C_STA_LW:
_bfd_vms_push (abfd, (uquad) bfd_getl32 (ptr), -1);
break;
/* stack global
arg: qw value
- stack 64 bit value of symbol */
-
+ stack 64 bit value of symbol. */
case ETIR_S_C_STA_QW:
_bfd_vms_push (abfd, (uquad) bfd_getl64 (ptr), -1);
break;
qw signed quadword offset (low 32 bits)
stack qw argument and section index
- (see ETIR_S_C_STO_OFF, ETIR_S_C_CTL_SETRB) */
-
+ (see ETIR_S_C_STO_OFF, ETIR_S_C_CTL_SETRB). */
case ETIR_S_C_STA_PQ:
{
uquad dummy;
(*_bfd_error_handler) (_("bad section index in %s"),
cmd_name (cmd));
bfd_set_error (bfd_error_bad_value);
- return false;
+ return FALSE;
}
- dummy = bfd_getl64 (ptr+4);
+ dummy = bfd_getl64 (ptr + 4);
_bfd_vms_push (abfd, dummy, (int) psect);
}
break;
case ETIR_S_C_STA_MOD:
case ETIR_S_C_STA_CKARG:
(*_bfd_error_handler) (_("unsupported STA cmd %s"), cmd_name (cmd));
- return false;
+ return FALSE;
break;
default:
(*_bfd_error_handler) (_("reserved STA cmd %d"), cmd);
- return false;
+ return FALSE;
break;
}
#if VMS_DEBUG
_bfd_vms_debug (5, "etir_sta true\n");
#endif
- return true;
+ return TRUE;
}
-/*
- etir_sto
+/* etir_sto
vms store commands
see table B-9 of the openVMS linker manual. */
-static boolean
-etir_sto (abfd, cmd, ptr)
- bfd *abfd;
- int cmd;
- unsigned char *ptr;
+static bfd_boolean
+etir_sto (bfd * abfd, int cmd, unsigned char *ptr)
{
uquad dummy;
int psect;
switch (cmd)
{
- /* store byte: pop stack, write byte
- arg: - */
-
+ /* Store byte: pop stack, write byte
+ arg: -. */
case ETIR_S_C_STO_B:
dummy = _bfd_vms_pop (abfd, &psect);
-#if 0
- if (is_share) /* FIXME */
- (*_bfd_error_handler) ("%s: byte fixups not supported",
- cmd_name (cmd));
-#endif
- /* FIXME: check top bits */
+ /* FIXME: check top bits. */
image_write_b (abfd, (unsigned int) dummy & 0xff);
break;
- /* store word: pop stack, write word
- arg: - */
-
+ /* Store word: pop stack, write word
+ arg: -. */
case ETIR_S_C_STO_W:
dummy = _bfd_vms_pop (abfd, &psect);
-#if 0
- if (is_share) /* FIXME */
- (*_bfd_error_handler) ("%s: word fixups not supported",
- cmd_name (cmd));
-#endif
/* FIXME: check top bits */
image_write_w (abfd, (unsigned int) dummy & 0xffff);
break;
- /* store longword: pop stack, write longword
- arg: - */
-
+ /* Store longword: pop stack, write longword
+ arg: -. */
case ETIR_S_C_STO_LW:
dummy = _bfd_vms_pop (abfd, &psect);
dummy += (PRIV (sections)[psect])->vma;
image_write_l (abfd, (unsigned int) dummy & 0xffffffff);
break;
- /* store quadword: pop stack, write quadword
- arg: - */
-
+ /* Store quadword: pop stack, write quadword
+ arg: -. */
case ETIR_S_C_STO_QW:
dummy = _bfd_vms_pop (abfd, &psect);
dummy += (PRIV (sections)[psect])->vma;
- image_write_q (abfd, dummy); /* FIXME: check top bits */
+ /* FIXME: check top bits. */
+ image_write_q (abfd, dummy);
break;
- /* store immediate repeated: pop stack for repeat count
+ /* Store immediate repeated: pop stack for repeat count
arg: lw byte count
- da data */
-
+ da data. */
case ETIR_S_C_STO_IMMR:
{
int size;
}
break;
- /* store global: write symbol value
+ /* Store global: write symbol value
arg: cs global symbol name. */
-
case ETIR_S_C_STO_GBL:
{
vms_symbol_entry *entry;
name = _bfd_vms_save_counted_string (ptr);
entry = (vms_symbol_entry *) bfd_hash_lookup (PRIV (vms_symbol_table),
- name, false, false);
- if (entry == (vms_symbol_entry *) NULL)
+ name, FALSE, FALSE);
+ if (entry == NULL)
{
(*_bfd_error_handler) (_("%s: no symbol \"%s\""),
cmd_name (cmd), name);
- return false;
+ return FALSE;
}
else
/* FIXME, reloc. */
}
break;
- /* store code address: write address of entry point
+ /* Store code address: write address of entry point
arg: cs global symbol name (procedure). */
-
case ETIR_S_C_STO_CA:
{
vms_symbol_entry *entry;
name = _bfd_vms_save_counted_string (ptr);
entry = (vms_symbol_entry *) bfd_hash_lookup (PRIV (vms_symbol_table),
- name, false, false);
- if (entry == (vms_symbol_entry *) NULL)
+ name, FALSE, FALSE);
+ if (entry == NULL)
{
(*_bfd_error_handler) (_("%s: no symbol \"%s\""),
cmd_name (cmd), name);
- return false;
+ return FALSE;
}
else
- image_write_q (abfd, (uquad) (entry->symbol->value)); /* FIXME, reloc */
+ /* FIXME, reloc. */
+ image_write_q (abfd, (uquad) (entry->symbol->value));
}
break;
/* Store offset to psect: pop stack, add low 32 bits to base of psect
arg: none. */
-
case ETIR_S_C_STO_OFF:
{
uquad q;
int psect1;
- q = _bfd_vms_pop (abfd, &psect1);
+ q = _bfd_vms_pop (abfd, & psect1);
q += (PRIV (sections)[psect1])->vma;
image_write_q (abfd, q);
}
/* Store immediate
arg: lw count of bytes
da data. */
-
case ETIR_S_C_STO_IMM:
{
int size;
FIXME, since the following is just a guess
store global longword: store 32bit value of symbol
arg: cs symbol name. */
-
case ETIR_S_C_STO_GBL_LW:
{
vms_symbol_entry *entry;
name = _bfd_vms_save_counted_string (ptr);
entry = (vms_symbol_entry *) bfd_hash_lookup (PRIV (vms_symbol_table),
- name, false, false);
- if (entry == (vms_symbol_entry *) NULL)
+ name, FALSE, FALSE);
+ if (entry == NULL)
{
#if VMS_DEBUG
_bfd_vms_debug (3, "%s: no symbol \"%s\"\n", cmd_name (cmd), name);
break;
}
- return true;
+ return TRUE;
}
/* Stack operator commands
see table B-10 of the openVMS linker manual. */
-static boolean
-etir_opr (abfd, cmd, ptr)
- bfd *abfd;
- int cmd;
- unsigned char *ptr ATTRIBUTE_UNUSED;
+static bfd_boolean
+etir_opr (bfd * abfd, int cmd, unsigned char *ptr ATTRIBUTE_UNUSED)
{
long op1, op2;
switch (cmd)
{
- case ETIR_S_C_OPR_NOP: /* no-op */
+ case ETIR_S_C_OPR_NOP: /* No-op. */
break;
- case ETIR_S_C_OPR_ADD: /* add */
+ case ETIR_S_C_OPR_ADD: /* Add. */
op1 = (long) _bfd_vms_pop (abfd, NULL);
op2 = (long) _bfd_vms_pop (abfd, NULL);
_bfd_vms_push (abfd, (uquad) (op1 + op2), -1);
break;
- case ETIR_S_C_OPR_SUB: /* subtract */
+ case ETIR_S_C_OPR_SUB: /* Subtract. */
op1 = (long) _bfd_vms_pop (abfd, NULL);
op2 = (long) _bfd_vms_pop (abfd, NULL);
_bfd_vms_push (abfd, (uquad) (op2 - op1), -1);
break;
- case ETIR_S_C_OPR_MUL: /* multiply */
+ case ETIR_S_C_OPR_MUL: /* Multiply. */
op1 = (long) _bfd_vms_pop (abfd, NULL);
op2 = (long) _bfd_vms_pop (abfd, NULL);
_bfd_vms_push (abfd, (uquad) (op1 * op2), -1);
break;
- case ETIR_S_C_OPR_DIV: /* divide */
+ case ETIR_S_C_OPR_DIV: /* Divide. */
op1 = (long) _bfd_vms_pop (abfd, NULL);
op2 = (long) _bfd_vms_pop (abfd, NULL);
if (op2 == 0)
_bfd_vms_push (abfd, (uquad) (op2 / op1), -1);
break;
- case ETIR_S_C_OPR_AND: /* logical and */
+ case ETIR_S_C_OPR_AND: /* Logical AND. */
op1 = (long) _bfd_vms_pop (abfd, NULL);
op2 = (long) _bfd_vms_pop (abfd, NULL);
_bfd_vms_push (abfd, (uquad) (op1 & op2), -1);
break;
- case ETIR_S_C_OPR_IOR: /* logical inclusive or */
+ case ETIR_S_C_OPR_IOR: /* Logical inclusive OR. */
op1 = (long) _bfd_vms_pop (abfd, NULL);
op2 = (long) _bfd_vms_pop (abfd, NULL);
_bfd_vms_push (abfd, (uquad) (op1 | op2), -1);
break;
- case ETIR_S_C_OPR_EOR: /* logical exclusive or */
+ case ETIR_S_C_OPR_EOR: /* Logical exclusive OR. */
op1 = (long) _bfd_vms_pop (abfd, NULL);
op2 = (long) _bfd_vms_pop (abfd, NULL);
_bfd_vms_push (abfd, (uquad) (op1 ^ op2), -1);
break;
- case ETIR_S_C_OPR_NEG: /* negate */
+ case ETIR_S_C_OPR_NEG: /* Negate. */
op1 = (long) _bfd_vms_pop (abfd, NULL);
_bfd_vms_push (abfd, (uquad) (-op1), -1);
break;
- case ETIR_S_C_OPR_COM: /* complement */
+ case ETIR_S_C_OPR_COM: /* Complement. */
op1 = (long) _bfd_vms_pop (abfd, NULL);
_bfd_vms_push (abfd, (uquad) (op1 ^ -1L), -1);
break;
- case ETIR_S_C_OPR_ASH: /* arithmetic shift */
+ case ETIR_S_C_OPR_ASH: /* Arithmetic shift. */
op1 = (long) _bfd_vms_pop (abfd, NULL);
op2 = (long) _bfd_vms_pop (abfd, NULL);
- if (op2 < 0) /* shift right */
+ if (op2 < 0) /* Shift right. */
op1 >>= -op2;
- else /* shift left */
+ else /* Shift left. */
op1 <<= op2;
_bfd_vms_push (abfd, (uquad) op1, -1);
break;
- case ETIR_S_C_OPR_INSV: /* insert field */
+ case ETIR_S_C_OPR_INSV: /* Insert field. */
(void) _bfd_vms_pop (abfd, NULL);
- case ETIR_S_C_OPR_USH: /* unsigned shift */
- case ETIR_S_C_OPR_ROT: /* rotate */
+ case ETIR_S_C_OPR_USH: /* Unsigned shift. */
+ case ETIR_S_C_OPR_ROT: /* Rotate. */
case ETIR_S_C_OPR_REDEF: /* Redefine symbol to current location. */
case ETIR_S_C_OPR_DFLIT: /* Define a literal. */
(*_bfd_error_handler) (_("%s: not supported"), cmd_name (cmd));
break;
- case ETIR_S_C_OPR_SEL: /* select */
+ case ETIR_S_C_OPR_SEL: /* Select. */
if ((long) _bfd_vms_pop (abfd, NULL) & 0x01L)
(void) _bfd_vms_pop (abfd, NULL);
else
break;
}
- return true;
+ return TRUE;
}
/* Control commands.
See table B-11 of the openVMS linker manual. */
-static boolean
-etir_ctl (abfd, cmd, ptr)
- bfd *abfd;
- int cmd;
- unsigned char *ptr;
+static bfd_boolean
+etir_ctl (bfd * abfd, int cmd, unsigned char *ptr)
{
uquad dummy;
int psect;
switch (cmd)
{
- /* set relocation base: pop stack, set image location counter
+ /* Det relocation base: pop stack, set image location counter
arg: none. */
-
case ETIR_S_C_CTL_SETRB:
dummy = _bfd_vms_pop (abfd, &psect);
image_set_ptr (abfd, psect, dummy);
break;
- /* augment relocation base: increment image location counter by offset
- arg: lw offset value */
-
+ /* Augment relocation base: increment image location counter by offset
+ arg: lw offset value. */
case ETIR_S_C_CTL_AUGRB:
dummy = bfd_getl32 (ptr);
image_inc_ptr (abfd, dummy);
break;
- /* define location: pop index, save location counter under index
+ /* Define location: pop index, save location counter under index
arg: none. */
-
case ETIR_S_C_CTL_DFLOC:
dummy = _bfd_vms_pop (abfd, NULL);
/* FIXME */
break;
- /* set location: pop index, restore location counter from index
+ /* Set location: pop index, restore location counter from index
arg: none. */
-
case ETIR_S_C_CTL_STLOC:
dummy = _bfd_vms_pop (abfd, &psect);
/* FIXME */
break;
- /* stack defined location: pop index, push location counter from index
+ /* Stack defined location: pop index, push location counter from index
arg: none. */
-
case ETIR_S_C_CTL_STKDL:
dummy = _bfd_vms_pop (abfd, &psect);
- /* FIXME */
+ /* FIXME. */
break;
default:
(*_bfd_error_handler) (_("reserved CTL cmd %d"), cmd);
break;
}
- return true;
+ return TRUE;
}
-/* store conditional commands
+/* Store conditional commands
See table B-12 and B-13 of the openVMS linker manual. */
-static boolean
-etir_stc (abfd, cmd, ptr)
- bfd *abfd;
- int cmd;
- unsigned char *ptr ATTRIBUTE_UNUSED;
+static bfd_boolean
+etir_stc (bfd * abfd, int cmd, unsigned char *ptr ATTRIBUTE_UNUSED)
{
#if VMS_DEBUG
_bfd_vms_debug (5, "etir_stc %d/%x\n", cmd, cmd);
{
/* 200 Store-conditional Linkage Pair
arg: none. */
-
case ETIR_S_C_STC_LP:
(*_bfd_error_handler) (_("%s: not supported"), cmd_name (cmd));
break;
/* 201 Store-conditional Linkage Pair with Procedure Signature
arg: lw linkage index
- cs procedure name
- by signature length
- da signature. */
-
+ cs procedure name
+ by signature length
+ da signature. */
case ETIR_S_C_STC_LP_PSB:
image_inc_ptr (abfd, (uquad) 16); /* skip entry,procval */
break;
/* 202 Store-conditional Address at global address
arg: lw linkage index
- cs global name */
+ cs global name. */
case ETIR_S_C_STC_GBL:
(*_bfd_error_handler) (_("%s: not supported"), cmd_name (cmd));
/* 203 Store-conditional Code Address at global address
arg: lw linkage index
- cs procedure name */
-
+ cs procedure name. */
case ETIR_S_C_STC_GCA:
(*_bfd_error_handler) (_("%s: not supported"), cmd_name (cmd));
break;
/* 204 Store-conditional Address at psect + offset
arg: lw linkage index
- lw psect index
- qw offset */
-
+ lw psect index
+ qw offset. */
case ETIR_S_C_STC_PS:
(*_bfd_error_handler) (_("%s: not supported"), cmd_name (cmd));
break;
/* 205 Store-conditional NOP at address of global
arg: none. */
-
case ETIR_S_C_STC_NOP_GBL:
/* 206 Store-conditional NOP at pect + offset
arg: none. */
-
case ETIR_S_C_STC_NOP_PS:
/* 207 Store-conditional BSR at global address
arg: none. */
-
case ETIR_S_C_STC_BSR_GBL:
/* 208 Store-conditional BSR at pect + offset
arg: none. */
-
case ETIR_S_C_STC_BSR_PS:
/* 209 Store-conditional LDA at global address
arg: none. */
-
case ETIR_S_C_STC_LDA_GBL:
/* 210 Store-conditional LDA at psect + offset
arg: none. */
-
case ETIR_S_C_STC_LDA_PS:
/* 211 Store-conditional BSR or Hint at global address
arg: none. */
-
case ETIR_S_C_STC_BOH_GBL:
/* 212 Store-conditional BSR or Hint at pect + offset
arg: none. */
-
case ETIR_S_C_STC_BOH_PS:
/* 213 Store-conditional NOP,BSR or HINT at global address
arg: none. */
-
case ETIR_S_C_STC_NBH_GBL:
/* 214 Store-conditional NOP,BSR or HINT at psect + offset
arg: none. */
-
case ETIR_S_C_STC_NBH_PS:
/* FIXME */
-#if 0
- (*_bfd_error_handler) ("%s: not supported", cmd_name (cmd));
-#endif
break;
default:
#endif
break;
}
- return true;
+ return TRUE;
}
static asection *
-new_section (abfd, idx)
- bfd *abfd ATTRIBUTE_UNUSED;
- int idx;
+new_section (bfd * abfd ATTRIBUTE_UNUSED, int idx)
{
asection *section;
char sname[16];
name = bfd_malloc ((bfd_size_type) strlen (sname) + 1);
if (name == 0)
- return 0;
+ return NULL;
strcpy (name, sname);
section = bfd_malloc ((bfd_size_type) sizeof (asection));
if (section == 0)
{
#if VMS_DEBUG
- _bfd_vms_debug (6, "bfd_make_section (%s) failed", name);
+ _bfd_vms_debug (6, "new_section (%s) failed", name);
#endif
- return 0;
+ return NULL;
}
- section->_raw_size = 0;
+ section->size = 0;
section->vma = 0;
section->contents = 0;
- section->_cooked_size = 0;
section->name = name;
section->index = idx;
}
static int
-alloc_section (abfd, idx)
- bfd *abfd;
- unsigned int idx;
+alloc_section (bfd * abfd, unsigned int idx)
{
bfd_size_type amt;
amt = idx + 1;
amt *= sizeof (asection *);
- PRIV (sections) = (asection **) bfd_realloc (PRIV (sections), amt);
+ PRIV (sections) = bfd_realloc (PRIV (sections), amt);
if (PRIV (sections) == 0)
return -1;
}
/* tir_sta
-
+
vax stack commands
-
+
Handle sta_xxx commands in tir section
ptr points to data area in record
-
+
See table 7-3 of the VAX/VMS linker manual. */
static unsigned char *
-tir_sta (bfd *abfd, unsigned char *ptr)
+tir_sta (bfd * abfd, unsigned char *ptr)
{
int cmd = *ptr++;
/* stack */
case TIR_S_C_STA_GBL:
/* stack global
- arg: cs symbol name
-
- stack 32 bit value of symbol (high bits set to 0). */
+ arg: cs symbol name
+
+ stack 32 bit value of symbol (high bits set to 0). */
{
char *name;
vms_symbol_entry *entry;
name = _bfd_vms_save_counted_string (ptr);
entry = _bfd_vms_enter_symbol (abfd, name);
- if (entry == (vms_symbol_entry *) NULL)
- return 0;
+ if (entry == NULL)
+ return NULL;
_bfd_vms_push (abfd, (uquad) (entry->symbol->value), -1);
ptr += *ptr + 1;
case TIR_S_C_STA_SB:
/* stack signed byte
- arg: by value
-
- stack byte value, sign extend to 32 bit. */
+ arg: by value
+
+ stack byte value, sign extend to 32 bit. */
_bfd_vms_push (abfd, (uquad) *ptr++, -1);
break;
case TIR_S_C_STA_SW:
/* stack signed short word
- arg: sh value
-
- stack 16 bit value, sign extend to 32 bit. */
+ arg: sh value
+
+ stack 16 bit value, sign extend to 32 bit. */
_bfd_vms_push (abfd, (uquad) bfd_getl16 (ptr), -1);
ptr += 2;
break;
case TIR_S_C_STA_LW:
/* stack signed longword
- arg: lw value
-
- stack 32 bit value. */
+ arg: lw value
+
+ stack 32 bit value. */
_bfd_vms_push (abfd, (uquad) bfd_getl32 (ptr), -1);
ptr += 4;
break;
case TIR_S_C_STA_PB:
case TIR_S_C_STA_WPB:
/* stack psect base plus byte offset (word index)
- arg: by section index
- (sh section index)
- by signed byte offset. */
+ arg: by section index
+ (sh section index)
+ by signed byte offset. */
{
unsigned long dummy;
unsigned int psect;
case TIR_S_C_STA_PW:
case TIR_S_C_STA_WPW:
/* stack psect base plus word offset (word index)
- arg: by section index
- (sh section index)
- sh signed short offset. */
+ arg: by section index
+ (sh section index)
+ sh signed short offset. */
{
unsigned long dummy;
unsigned int psect;
case TIR_S_C_STA_PL:
case TIR_S_C_STA_WPL:
/* stack psect base plus long offset (word index)
- arg: by section index
- (sh section index)
- lw signed longword offset. */
+ arg: by section index
+ (sh section index)
+ lw signed longword offset. */
{
unsigned long dummy;
unsigned int psect;
case TIR_S_C_STA_UB:
/* stack unsigned byte
- arg: by value
-
- stack byte value. */
+ arg: by value
+
+ stack byte value. */
_bfd_vms_push (abfd, (uquad) *ptr++, -1);
break;
case TIR_S_C_STA_UW:
/* stack unsigned short word
- arg: sh value
-
- stack 16 bit value. */
+ arg: sh value
+
+ stack 16 bit value. */
_bfd_vms_push (abfd, (uquad) bfd_getl16 (ptr), -1);
ptr += 2;
break;
case TIR_S_C_STA_BFI:
/* stack byte from image
- arg: none. */
+ arg: none. */
/* FALLTHRU */
case TIR_S_C_STA_WFI:
/* stack byte from image
- arg: none. */
+ arg: none. */
/* FALLTHRU */
case TIR_S_C_STA_LFI:
/* stack byte from image
- arg: none. */
+ arg: none. */
(*_bfd_error_handler) (_("stack-from-image not implemented"));
return NULL;
case TIR_S_C_STA_EPM:
/* stack entry point mask
- arg: cs symbol name
-
- stack (unsigned) entry point mask of symbol
- err if symbol is no entry point. */
+ arg: cs symbol name
+
+ stack (unsigned) entry point mask of symbol
+ err if symbol is no entry point. */
{
char *name;
vms_symbol_entry *entry;
name = _bfd_vms_save_counted_string (ptr);
entry = _bfd_vms_enter_symbol (abfd, name);
- if (entry == (vms_symbol_entry *) NULL)
- return 0;
+ if (entry == NULL)
+ return NULL;
(*_bfd_error_handler) (_("stack-entry-mask not fully implemented"));
_bfd_vms_push (abfd, (uquad) 0, -1);
case TIR_S_C_STA_CKARG:
/* compare procedure argument
- arg: cs symbol name
- by argument index
- da argument descriptor
-
- compare argument descriptor with symbol argument (ARG$V_PASSMECH)
- and stack TRUE (args match) or FALSE (args dont match) value. */
+ arg: cs symbol name
+ by argument index
+ da argument descriptor
+
+ compare argument descriptor with symbol argument (ARG$V_PASSMECH)
+ and stack TRUE (args match) or FALSE (args dont match) value. */
(*_bfd_error_handler) (_("PASSMECH not fully implemented"));
_bfd_vms_push (abfd, (uquad) 1, -1);
break;
case TIR_S_C_STA_LSY:
/* stack local symbol value
- arg: sh environment index
- cs symbol name. */
+ arg: sh environment index
+ cs symbol name. */
{
int envidx;
char *name;
ptr += 2;
name = _bfd_vms_save_counted_string (ptr);
entry = _bfd_vms_enter_symbol (abfd, name);
- if (entry == (vms_symbol_entry *) NULL)
- return 0;
+ if (entry == NULL)
+ return NULL;
(*_bfd_error_handler) (_("stack-local-symbol not fully implemented"));
_bfd_vms_push (abfd, (uquad) 0, -1);
ptr += *ptr + 1;
case TIR_S_C_STA_LIT:
/* stack literal
- arg: by literal index
-
- stack literal. */
+ arg: by literal index
+
+ stack literal. */
ptr++;
_bfd_vms_push (abfd, (uquad) 0, -1);
(*_bfd_error_handler) (_("stack-literal not fully implemented"));
case TIR_S_C_STA_LEPM:
/* stack local symbol entry point mask
- arg: sh environment index
- cs symbol name
-
- stack (unsigned) entry point mask of symbol
- err if symbol is no entry point. */
+ arg: sh environment index
+ cs symbol name
+
+ stack (unsigned) entry point mask of symbol
+ err if symbol is no entry point. */
{
int envidx;
char *name;
ptr += 2;
name = _bfd_vms_save_counted_string (ptr);
entry = _bfd_vms_enter_symbol (abfd, name);
- if (entry == (vms_symbol_entry *) NULL)
- return 0;
+ if (entry == NULL)
+ return NULL;
(*_bfd_error_handler) (_("stack-local-symbol-entry-point-mask not fully implemented"));
_bfd_vms_push (abfd, (uquad) 0, -1);
ptr += *ptr + 1;
}
static const char *
-tir_cmd_name (cmd)
- int cmd;
+tir_cmd_name (int cmd)
{
switch (cmd)
{
}
/* tir_sto
-
+
vax store commands
-
+
handle sto_xxx commands in tir section
ptr points to data area in record
-
+
See table 7-4 of the VAX/VMS linker manual. */
static unsigned char *
-tir_sto (bfd *abfd, unsigned char *ptr)
+tir_sto (bfd * abfd, unsigned char *ptr)
{
unsigned long dummy;
int size;
switch (*ptr++)
{
case TIR_S_C_STO_SB:
- /* store signed byte: pop stack, write byte
- arg: none. */
+ /* Store signed byte: pop stack, write byte
+ arg: none. */
dummy = _bfd_vms_pop (abfd, &psect);
image_write_b (abfd, dummy & 0xff); /* FIXME: check top bits */
break;
case TIR_S_C_STO_SW:
- /* store signed word: pop stack, write word
- arg: none. */
+ /* Store signed word: pop stack, write word
+ arg: none. */
dummy = _bfd_vms_pop (abfd, &psect);
image_write_w (abfd, dummy & 0xffff); /* FIXME: check top bits */
break;
case TIR_S_C_STO_LW:
- /* store longword: pop stack, write longword
- arg: none. */
+ /* Store longword: pop stack, write longword
+ arg: none. */
dummy = _bfd_vms_pop (abfd, &psect);
image_write_l (abfd, dummy & 0xffffffff); /* FIXME: check top bits */
break;
case TIR_S_C_STO_BD:
- /* store byte displaced: pop stack, sub lc+1, write byte
- arg: none. */
+ /* Store byte displaced: pop stack, sub lc+1, write byte
+ arg: none. */
dummy = _bfd_vms_pop (abfd, &psect);
dummy -= ((PRIV (sections)[psect])->vma + 1);
image_write_b (abfd, dummy & 0xff);/* FIXME: check top bits */
break;
case TIR_S_C_STO_WD:
- /* store word displaced: pop stack, sub lc+2, write word
- arg: none. */
+ /* Store word displaced: pop stack, sub lc+2, write word
+ arg: none. */
dummy = _bfd_vms_pop (abfd, &psect);
dummy -= ((PRIV (sections)[psect])->vma + 2);
image_write_w (abfd, dummy & 0xffff);/* FIXME: check top bits */
break;
case TIR_S_C_STO_LD:
- /* store long displaced: pop stack, sub lc+4, write long
- arg: none. */
+ /* Store long displaced: pop stack, sub lc+4, write long
+ arg: none. */
dummy = _bfd_vms_pop (abfd, &psect);
dummy -= ((PRIV (sections)[psect])->vma + 4);
image_write_l (abfd, dummy & 0xffffffff);/* FIXME: check top bits */
break;
case TIR_S_C_STO_LI:
- /* store short literal: pop stack, write byte
- arg: none. */
+ /* Store short literal: pop stack, write byte
+ arg: none. */
dummy = _bfd_vms_pop (abfd, &psect);
image_write_b (abfd, dummy & 0xff);/* FIXME: check top bits */
break;
case TIR_S_C_STO_PIDR:
- /* store position independent data reference: pop stack, write longword
- arg: none.
+ /* Store position independent data reference: pop stack, write longword
+ arg: none.
FIXME: incomplete ! */
dummy = _bfd_vms_pop (abfd, &psect);
image_write_l (abfd, dummy & 0xffffffff);
break;
case TIR_S_C_STO_PICR:
- /* store position independent code reference: pop stack, write longword
- arg: none.
- FIXME: incomplete ! */
+ /* Store position independent code reference: pop stack, write longword
+ arg: none.
+ FIXME: incomplete ! */
dummy = _bfd_vms_pop (abfd, &psect);
image_write_b (abfd, 0x9f);
image_write_l (abfd, dummy & 0xffffffff);
break;
case TIR_S_C_STO_RIVB:
- /* store repeated immediate variable bytes
- 1-byte count n field followed by n bytes of data
- pop stack, write n bytes <stack> times. */
+ /* Store repeated immediate variable bytes
+ 1-byte count n field followed by n bytes of data
+ pop stack, write n bytes <stack> times. */
size = *ptr++;
dummy = (unsigned long) _bfd_vms_pop (abfd, NULL);
while (dummy-- > 0L)
break;
case TIR_S_C_STO_B:
- /* store byte from top longword. */
+ /* Store byte from top longword. */
dummy = (unsigned long) _bfd_vms_pop (abfd, NULL);
image_write_b (abfd, dummy & 0xff);
break;
case TIR_S_C_STO_W:
- /* store word from top longword. */
+ /* Store word from top longword. */
dummy = (unsigned long) _bfd_vms_pop (abfd, NULL);
image_write_w (abfd, dummy & 0xffff);
break;
case TIR_S_C_STO_RB:
- /* store repeated byte from top longword. */
+ /* Store repeated byte from top longword. */
size = (unsigned long) _bfd_vms_pop (abfd, NULL);
dummy = (unsigned long) _bfd_vms_pop (abfd, NULL);
while (size-- > 0)
break;
case TIR_S_C_STO_RW:
- /* store repeated word from top longword. */
+ /* Store repeated word from top longword. */
size = (unsigned long) _bfd_vms_pop (abfd, NULL);
dummy = (unsigned long) _bfd_vms_pop (abfd, NULL);
while (size-- > 0)
return ptr;
}
-/* stack operator commands
- all 32 bit signed arithmetic
- all word just like a stack calculator
- arguments are popped from stack, results are pushed on stack
-
+/* Stack operator commands
+ All 32 bit signed arithmetic
+ All word just like a stack calculator
+ Arguments are popped from stack, results are pushed on stack
+
See table 7-5 of the VAX/VMS linker manual. */
static unsigned char *
-tir_opr (abfd, ptr)
- bfd *abfd;
- unsigned char *ptr;
+tir_opr (bfd * abfd, unsigned char *ptr)
{
long op1, op2;
_bfd_vms_debug (5, "tir_opr %d\n", *ptr);
#endif
+ /* Operation. */
switch (*ptr++)
{
- /* operation */
- case TIR_S_C_OPR_NOP: /* no-op */
+ case TIR_S_C_OPR_NOP: /* No-op. */
break;
- case TIR_S_C_OPR_ADD: /* add */
+ case TIR_S_C_OPR_ADD: /* Add. */
op1 = (long) _bfd_vms_pop (abfd, NULL);
op2 = (long) _bfd_vms_pop (abfd, NULL);
_bfd_vms_push (abfd, (uquad) (op1 + op2), -1);
break;
- case TIR_S_C_OPR_SUB: /* subtract */
+ case TIR_S_C_OPR_SUB: /* Subtract. */
op1 = (long) _bfd_vms_pop (abfd, NULL);
op2 = (long) _bfd_vms_pop (abfd, NULL);
_bfd_vms_push (abfd, (uquad) (op2 - op1), -1);
break;
- case TIR_S_C_OPR_MUL: /* multiply */
+ case TIR_S_C_OPR_MUL: /* Multiply. */
op1 = (long) _bfd_vms_pop (abfd, NULL);
op2 = (long) _bfd_vms_pop (abfd, NULL);
_bfd_vms_push (abfd, (uquad) (op1 * op2), -1);
break;
- case TIR_S_C_OPR_DIV: /* divide */
+ case TIR_S_C_OPR_DIV: /* Divide. */
op1 = (long) _bfd_vms_pop (abfd, NULL);
op2 = (long) _bfd_vms_pop (abfd, NULL);
if (op2 == 0)
_bfd_vms_push (abfd, (uquad) (op2 / op1), -1);
break;
- case TIR_S_C_OPR_AND: /* logical and */
+ case TIR_S_C_OPR_AND: /* Logical AND. */
op1 = (long) _bfd_vms_pop (abfd, NULL);
op2 = (long) _bfd_vms_pop (abfd, NULL);
_bfd_vms_push (abfd, (uquad) (op1 & op2), -1);
break;
- case TIR_S_C_OPR_IOR: /* logical inclusive or */
+ case TIR_S_C_OPR_IOR: /* Logical inclusive OR. */
op1 = (long) _bfd_vms_pop (abfd, NULL);
op2 = (long) _bfd_vms_pop (abfd, NULL);
_bfd_vms_push (abfd, (uquad) (op1 | op2), -1);
break;
- case TIR_S_C_OPR_EOR: /* logical exclusive or */
+ case TIR_S_C_OPR_EOR: /* Logical exclusive OR. */
op1 = (long) _bfd_vms_pop (abfd, NULL);
op2 = (long) _bfd_vms_pop (abfd, NULL);
_bfd_vms_push (abfd, (uquad) (op1 ^ op2), -1);
break;
- case TIR_S_C_OPR_NEG: /* negate */
+ case TIR_S_C_OPR_NEG: /* Negate. */
op1 = (long) _bfd_vms_pop (abfd, NULL);
_bfd_vms_push (abfd, (uquad) (-op1), -1);
break;
- case TIR_S_C_OPR_COM: /* complement */
+ case TIR_S_C_OPR_COM: /* Complement. */
op1 = (long) _bfd_vms_pop (abfd, NULL);
_bfd_vms_push (abfd, (uquad) (op1 ^ -1L), -1);
break;
- case TIR_S_C_OPR_INSV: /* insert field */
+ case TIR_S_C_OPR_INSV: /* Insert field. */
(void) _bfd_vms_pop (abfd, NULL);
(*_bfd_error_handler) (_("%s: not fully implemented"),
tir_cmd_name (ptr[-1]));
break;
- case TIR_S_C_OPR_ASH: /* arithmetic shift */
+ case TIR_S_C_OPR_ASH: /* Arithmetic shift. */
op1 = (long) _bfd_vms_pop (abfd, NULL);
op2 = (long) _bfd_vms_pop (abfd, NULL);
- if (HIGHBIT (op1)) /* shift right */
+ if (HIGHBIT (op1)) /* Shift right. */
op2 >>= op1;
- else /* shift left */
+ else /* Shift left. */
op2 <<= op1;
_bfd_vms_push (abfd, (uquad) op2, -1);
(*_bfd_error_handler) (_("%s: not fully implemented"),
tir_cmd_name (ptr[-1]));
break;
- case TIR_S_C_OPR_USH: /* unsigned shift */
+ case TIR_S_C_OPR_USH: /* Unsigned shift. */
op1 = (long) _bfd_vms_pop (abfd, NULL);
op2 = (long) _bfd_vms_pop (abfd, NULL);
- if (HIGHBIT (op1)) /* shift right */
+ if (HIGHBIT (op1)) /* Shift right. */
op2 >>= op1;
- else /* shift left */
+ else /* Shift left. */
op2 <<= op1;
_bfd_vms_push (abfd, (uquad) op2, -1);
(*_bfd_error_handler) (_("%s: not fully implemented"),
tir_cmd_name (ptr[-1]));
break;
- case TIR_S_C_OPR_ROT: /* rotate */
+ case TIR_S_C_OPR_ROT: /* Rotate. */
op1 = (long) _bfd_vms_pop (abfd, NULL);
op2 = (long) _bfd_vms_pop (abfd, NULL);
- if (HIGHBIT (0)) /* shift right */
+ if (HIGHBIT (0)) /* Shift right. */
op2 >>= op1;
- else /* shift left */
+ else /* Shift left. */
op2 <<= op1;
_bfd_vms_push (abfd, (uquad) op2, -1);
(*_bfd_error_handler) (_("%s: not fully implemented"),
tir_cmd_name (ptr[-1]));
break;
- case TIR_S_C_OPR_SEL: /* select */
+ case TIR_S_C_OPR_SEL: /* Select. */
if ((long) _bfd_vms_pop (abfd, NULL) & 0x01L)
(void) _bfd_vms_pop (abfd, NULL);
else
return ptr;
}
-/* control commands
-
+/* Control commands
+
See table 7-6 of the VAX/VMS linker manual. */
static unsigned char *
-tir_ctl (bfd *abfd, unsigned char *ptr)
+tir_ctl (bfd * abfd, unsigned char *ptr)
{
unsigned long dummy;
unsigned int psect;
{
case TIR_S_C_CTL_SETRB:
/* Set relocation base: pop stack, set image location counter
- arg: none. */
- dummy = _bfd_vms_pop (abfd, &psect);
+ arg: none. */
+ dummy = _bfd_vms_pop (abfd, (int *) &psect);
if (psect >= PRIV (section_count))
alloc_section (abfd, psect);
image_set_ptr (abfd, (int) psect, (uquad) dummy);
case TIR_S_C_CTL_AUGRB:
/* Augment relocation base: increment image location counter by offset
- arg: lw offset value. */
+ arg: lw offset value. */
dummy = bfd_getl32 (ptr);
image_inc_ptr (abfd, (uquad) dummy);
break;
case TIR_S_C_CTL_DFLOC:
/* Define location: pop index, save location counter under index
- arg: none. */
+ arg: none. */
dummy = _bfd_vms_pop (abfd, NULL);
(*_bfd_error_handler) (_("%s: not fully implemented"),
tir_cmd_name (ptr[-1]));
case TIR_S_C_CTL_STLOC:
/* Set location: pop index, restore location counter from index
- arg: none. */
- dummy = _bfd_vms_pop (abfd, &psect);
+ arg: none. */
+ dummy = _bfd_vms_pop (abfd, (int *) &psect);
(*_bfd_error_handler) (_("%s: not fully implemented"),
tir_cmd_name (ptr[-1]));
break;
case TIR_S_C_CTL_STKDL:
/* Stack defined location: pop index, push location counter from index
- arg: none. */
- dummy = _bfd_vms_pop (abfd, &psect);
+ arg: none. */
+ dummy = _bfd_vms_pop (abfd, (int *) &psect);
(*_bfd_error_handler) (_("%s: not fully implemented"),
tir_cmd_name (ptr[-1]));
break;
/* Handle command from TIR section. */
static unsigned char *
-tir_cmd (bfd *abfd, unsigned char *ptr)
+tir_cmd (bfd * abfd, unsigned char *ptr)
{
struct
{
}
tir_table[] =
{
- { 0, TIR_S_C_MAXSTACOD, tir_sta },
+ { 0, TIR_S_C_MAXSTACOD, tir_sta },
{ TIR_S_C_MINSTOCOD, TIR_S_C_MAXSTOCOD, tir_sto },
{ TIR_S_C_MINOPRCOD, TIR_S_C_MAXOPRCOD, tir_opr },
{ TIR_S_C_MINCTLCOD, TIR_S_C_MAXCTLCOD, tir_ctl },
_bfd_hexdump (8, ptr, 16, (int) ptr);
#endif
- if (*ptr & 0x80) /* store immediate */
+ if (*ptr & 0x80)
{
+ /* Store immediate. */
i = 128 - (*ptr++ & 0x7f);
image_dump (abfd, ptr, i, 0);
ptr += i;
/* Handle command from ETIR section. */
static int
-etir_cmd (abfd, cmd, ptr)
- bfd *abfd;
- int cmd;
- unsigned char *ptr;
+etir_cmd (bfd * abfd, int cmd, unsigned char *ptr)
{
static struct
{
int mincod;
int maxcod;
- boolean (*explain) PARAMS ((bfd *, int, unsigned char *));
+ bfd_boolean (*explain) (bfd *, int, unsigned char *);
}
etir_table[] =
{
handle tir record. */
static int
-analyze_tir (abfd, ptr, length)
- bfd *abfd;
- unsigned char *ptr;
- unsigned int length;
+analyze_tir (bfd * abfd, unsigned char *ptr, unsigned int length)
{
unsigned char *maxptr;
handle etir record. */
static int
-analyze_etir (abfd, ptr, length)
- bfd *abfd;
- unsigned char *ptr;
- unsigned int length;
+analyze_etir (bfd * abfd, unsigned char *ptr, unsigned int length)
{
int cmd;
unsigned char *maxptr;
Return 0 on success, -1 on error. */
int
-_bfd_vms_slurp_tir (abfd, objtype)
- bfd *abfd;
- int objtype;
+_bfd_vms_slurp_tir (bfd * abfd, int objtype)
{
int result;
switch (objtype)
{
case EOBJ_S_C_ETIR:
- PRIV (vms_rec) += 4; /* skip type, size */
+ PRIV (vms_rec) += 4; /* Skip type, size. */
PRIV (rec_size) -= 4;
result = analyze_etir (abfd, PRIV (vms_rec), (unsigned) PRIV (rec_size));
break;
case OBJ_S_C_TIR:
- PRIV (vms_rec) += 1; /* skip type */
+ PRIV (vms_rec) += 1; /* Skip type. */
PRIV (rec_size) -= 1;
result = analyze_tir (abfd, PRIV (vms_rec), (unsigned) PRIV (rec_size));
break;
Not implemented yet. */
int
-_bfd_vms_slurp_dbg (abfd, objtype)
- bfd *abfd;
- int objtype ATTRIBUTE_UNUSED;
+_bfd_vms_slurp_dbg (bfd * abfd, int objtype ATTRIBUTE_UNUSED)
{
#if VMS_DEBUG
_bfd_vms_debug (2, "DBG/EDBG\n");
Not implemented yet. */
int
-_bfd_vms_slurp_tbt (abfd, objtype)
- bfd *abfd ATTRIBUTE_UNUSED;
- int objtype ATTRIBUTE_UNUSED;
+_bfd_vms_slurp_tbt (bfd * abfd ATTRIBUTE_UNUSED,
+ int objtype ATTRIBUTE_UNUSED)
{
#if VMS_DEBUG
_bfd_vms_debug (2, "TBT/ETBT\n");
Not implemented yet. */
int
-_bfd_vms_slurp_lnk (abfd, objtype)
- bfd *abfd ATTRIBUTE_UNUSED;
- int objtype ATTRIBUTE_UNUSED;
+_bfd_vms_slurp_lnk (bfd * abfd ATTRIBUTE_UNUSED,
+ int objtype ATTRIBUTE_UNUSED)
{
#if VMS_DEBUG
_bfd_vms_debug (2, "LNK\n");
return 0;
}
\f
+/* Start ETIR record for section #index at virtual addr offset. */
+
+static void
+start_etir_record (bfd * abfd, int index, uquad offset, bfd_boolean justoffset)
+{
+ if (!justoffset)
+ {
+ /* One ETIR per section. */
+ _bfd_vms_output_begin (abfd, EOBJ_S_C_ETIR, -1);
+ _bfd_vms_output_push (abfd);
+ }
+
+ /* Push start offset. */
+ _bfd_vms_output_begin (abfd, ETIR_S_C_STA_PQ, -1);
+ _bfd_vms_output_long (abfd, (unsigned long) index);
+ _bfd_vms_output_quad (abfd, (uquad) offset);
+ _bfd_vms_output_flush (abfd);
+
+ /* Start = pop (). */
+ _bfd_vms_output_begin (abfd, ETIR_S_C_CTL_SETRB, -1);
+ _bfd_vms_output_flush (abfd);
+}
+
+static void
+end_etir_record (bfd * abfd)
+{
+ _bfd_vms_output_pop (abfd);
+ _bfd_vms_output_end (abfd);
+}
+
/* WRITE ETIR SECTION
This is still under construction and therefore not documented. */
-static void start_etir_record PARAMS ((bfd *abfd, int index, uquad offset, boolean justoffset));
-static void sto_imm PARAMS ((bfd *abfd, vms_section *sptr, bfd_vma vaddr, int index));
-static void end_etir_record PARAMS ((bfd *abfd));
-
static void
-sto_imm (abfd, sptr, vaddr, index)
- bfd *abfd;
- vms_section *sptr;
- bfd_vma vaddr;
- int index;
+sto_imm (bfd * abfd, vms_section *sptr, bfd_vma vaddr, int index)
{
int size;
int ssize;
while (ssize > 0)
{
- size = ssize; /* try all the rest */
+ /* Try all the rest. */
+ size = ssize;
if (_bfd_vms_output_check (abfd, size) < 0)
- { /* doesn't fit, split ! */
+ {
+ /* Doesn't fit, split ! */
end_etir_record (abfd);
- start_etir_record (abfd, index, vaddr, false);
- size = _bfd_vms_output_check (abfd, 0); /* get max size */
- if (size > ssize) /* more than what's left ? */
+ start_etir_record (abfd, index, vaddr, FALSE);
+ /* Get max size. */
+ size = _bfd_vms_output_check (abfd, 0);
+ /* More than what's left ? */
+ if (size > ssize)
size = ssize;
}
}
}
-/* Start ETIR record for section #index at virtual addr offset. */
-
-static void
-start_etir_record (abfd, index, offset, justoffset)
- bfd *abfd;
- int index;
- uquad offset;
- boolean justoffset;
-{
- if (!justoffset)
- {
- _bfd_vms_output_begin (abfd, EOBJ_S_C_ETIR, -1); /* one ETIR per section */
- _bfd_vms_output_push (abfd);
- }
-
- _bfd_vms_output_begin (abfd, ETIR_S_C_STA_PQ, -1); /* push start offset */
- _bfd_vms_output_long (abfd, (unsigned long) index);
- _bfd_vms_output_quad (abfd, (uquad) offset);
- _bfd_vms_output_flush (abfd);
-
- _bfd_vms_output_begin (abfd, ETIR_S_C_CTL_SETRB, -1); /* start = pop () */
- _bfd_vms_output_flush (abfd);
-}
-
-/* End etir record. */
-
-static void
-end_etir_record (abfd)
- bfd *abfd;
-{
- _bfd_vms_output_pop (abfd);
- _bfd_vms_output_end (abfd);
-}
-
/* Write section contents for bfd abfd. */
int
-_bfd_vms_write_tir (abfd, objtype)
- bfd *abfd;
- int objtype ATTRIBUTE_UNUSED;
+_bfd_vms_write_tir (bfd * abfd, int objtype ATTRIBUTE_UNUSED)
{
asection *section;
vms_section *sptr;
PRIV (vms_linkage_index) = 1;
/* Dump all other sections. */
-
section = abfd->sections;
while (section != NULL)
#if VMS_DEBUG
_bfd_vms_debug (4, "writing %d. section '%s' (%d bytes)\n",
section->index, section->name,
- (int) (section->_raw_size));
+ (int) (section->size));
#endif
if (section->flags & SEC_RELOC)
int i;
if ((i = section->reloc_count) <= 0)
- {
- (*_bfd_error_handler) (_("SEC_RELOC with no relocs in section %s"),
- section->name);
- }
+ (*_bfd_error_handler) (_("SEC_RELOC with no relocs in section %s"),
+ section->name);
#if VMS_DEBUG
else
{
if ((section->flags & SEC_HAS_CONTENTS)
&& (! bfd_is_com_section (section)))
{
- bfd_vma vaddr; /* Virtual addr in section. */
+ /* Virtual addr in section. */
+ bfd_vma vaddr;
sptr = _bfd_get_vms_section (abfd, section->index);
if (sptr == NULL)
vaddr = (bfd_vma) (sptr->offset);
start_etir_record (abfd, section->index, (uquad) sptr->offset,
- false);
+ FALSE);
- while (sptr != NULL) /* one STA_PQ, CTL_SETRB per vms_section */
+ while (sptr != NULL)
{
-
- if (section->flags & SEC_RELOC) /* check for relocs */
+ /* One STA_PQ, CTL_SETRB per vms_section. */
+ if (section->flags & SEC_RELOC)
{
+ /* Check for relocs. */
arelent **rptr = section->orelocation;
int i = section->reloc_count;
{
bfd_size_type addr = (*rptr)->address;
bfd_size_type len = bfd_get_reloc_size ((*rptr)->howto);
- if (sptr->offset < addr) /* sptr starts before reloc */
+ if (sptr->offset < addr)
{
+ /* Sptr starts before reloc. */
bfd_size_type before = addr - sptr->offset;
- if (sptr->size <= before) /* complete before */
+ if (sptr->size <= before)
{
+ /* Complete before. */
sto_imm (abfd, sptr, vaddr, section->index);
vaddr += sptr->size;
break;
}
- else /* partly before */
+ else
{
+ /* Partly before. */
int after = sptr->size - before;
+
sptr->size = before;
sto_imm (abfd, sptr, vaddr, section->index);
vaddr += sptr->size;
sptr->size = after;
}
}
- else if (sptr->offset == addr) /* sptr starts at reloc */
+ else if (sptr->offset == addr)
{
+ /* Sptr starts at reloc. */
asymbol *sym = *(*rptr)->sym_ptr_ptr;
asection *sec = sym->section;
end_etir_record (abfd);
start_etir_record (abfd,
section->index,
- vaddr, false);
+ vaddr, FALSE);
}
_bfd_vms_output_begin (abfd,
ETIR_S_C_STO_GBL_LW,
end_etir_record (abfd);
start_etir_record (abfd,
section->index,
- vaddr, false);
+ vaddr, FALSE);
}
_bfd_vms_output_begin (abfd,
ETIR_S_C_STA_LW,
end_etir_record (abfd);
start_etir_record (abfd,
section->index,
- vaddr, false);
+ vaddr, FALSE);
}
_bfd_vms_output_begin (abfd,
ETIR_S_C_STA_PQ,
{
int slen = strlen ((char *) sym->name);
char *hash;
+
if (_bfd_vms_output_check (abfd, slen) < 0)
{
end_etir_record (abfd);
start_etir_record (abfd,
section->index,
- vaddr, false);
+ vaddr, FALSE);
}
_bfd_vms_output_begin (abfd,
ETIR_S_C_STO_GBL,
end_etir_record (abfd);
start_etir_record (abfd,
section->index,
- vaddr, false);
+ vaddr, FALSE);
}
_bfd_vms_output_begin (abfd,
ETIR_S_C_STA_QW,
end_etir_record (abfd);
start_etir_record (abfd,
section->index,
- vaddr, false);
+ vaddr, FALSE);
}
_bfd_vms_output_begin (abfd,
ETIR_S_C_STA_PQ,
sptr->size = len;
sto_imm (abfd, sptr, vaddr, section->index);
sptr->size = hint_size;
-#if 0
- vms_output_begin (abfd,
- ETIR_S_C_STO_HINT_GBL, -1);
- vms_output_long (abfd,
- (unsigned long) (sec->index));
- vms_output_quad (abfd, (uquad) addr);
-
- hash = (_bfd_vms_length_hash_symbol
- (abfd, sym->name, EOBJ_S_C_SYMSIZ));
- vms_output_counted (abfd, hash);
-
- vms_output_flush (abfd);
-#endif
}
break;
case ALPHA_R_LINKAGE:
{
end_etir_record (abfd);
start_etir_record (abfd, section->index,
- vaddr, false);
+ vaddr, FALSE);
}
_bfd_vms_output_begin (abfd,
ETIR_S_C_STC_LP_PSB,
end_etir_record (abfd);
start_etir_record (abfd,
section->index,
- vaddr, false);
+ vaddr, FALSE);
}
_bfd_vms_output_begin (abfd,
ETIR_S_C_STO_CA,
rptr++;
}
}
- else /* sptr starts after reloc */
+ else
{
- i--; /* check next reloc */
+ /* Sptr starts after reloc. */
+ i--;
+ /* Check next reloc. */
rptr++;
}
- if (i==0) /* all reloc checked */
+ if (i == 0)
{
+ /* All reloc checked. */
if (sptr->size > 0)
{
- /* dump rest */
+ /* Dump rest. */
sto_imm (abfd, sptr, vaddr, section->index);
vaddr += sptr->size;
}
break;
}
- } /* for (;;) */
- } /* if SEC_RELOC */
- else /* no relocs, just dump */
+ }
+ }
+ else
{
+ /* No relocs, just dump. */
sto_imm (abfd, sptr, vaddr, section->index);
vaddr += sptr->size;
}
sptr = sptr->next;
-
- } /* while (sptr != 0) */
+ }
end_etir_record (abfd);
-
- } /* has_contents */
+ }
section = section->next;
}
/* Write traceback data for bfd abfd. */
int
-_bfd_vms_write_tbt (abfd, objtype)
- bfd *abfd ATTRIBUTE_UNUSED;
- int objtype ATTRIBUTE_UNUSED;
+_bfd_vms_write_tbt (bfd * abfd ATTRIBUTE_UNUSED,
+ int objtype ATTRIBUTE_UNUSED)
{
#if VMS_DEBUG
_bfd_vms_debug (2, "vms_write_tbt (%p, %d)\n", abfd, objtype);
/* Write debug info for bfd abfd. */
int
-_bfd_vms_write_dbg (abfd, objtype)
- bfd *abfd ATTRIBUTE_UNUSED;
- int objtype ATTRIBUTE_UNUSED;
+_bfd_vms_write_dbg (bfd * abfd ATTRIBUTE_UNUSED,
+ int objtype ATTRIBUTE_UNUSED)
{
#if VMS_DEBUG
_bfd_vms_debug (2, "vms_write_dbg (%p, objtype)\n", abfd, objtype);