1 /* vms-tir.c -- BFD back-end for VAX (openVMS/VAX) and
2    EVAX (openVMS/Alpha) files.
3    Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2004, 2005
4    Free Software Foundation, Inc.
5 
6    TIR record handling functions
7    ETIR record handling functions
8 
9    go and read the openVMS linker manual (esp. appendix B)
10    if you don't know what's going on here :-)
11 
12    Written by Klaus K"ampf (kkaempf@rmi.de)
13 
14    This program is free software; you can redistribute it and/or modify
15    it under the terms of the GNU General Public License as published by
16    the Free Software Foundation; either version 2 of the License, or
17    (at your option) any later version.
18 
19    This program is distributed in the hope that it will be useful,
20    but WITHOUT ANY WARRANTY; without even the implied warranty of
21    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22    GNU General Public License for more details.
23 
24    You should have received a copy of the GNU General Public License
25    along with this program; if not, write to the Free Software
26    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
27 
28 /* The following type abbreviations are used:
29 
30 	cs	counted string (ascii string with length byte)
31 	by	byte (1 byte)
32 	sh	short (2 byte, 16 bit)
33 	lw	longword (4 byte, 32 bit)
34 	qw	quadword (8 byte, 64 bit)
35 	da	data stream  */
36 
37 #include "bfd.h"
38 #include "sysdep.h"
39 #include "bfdlink.h"
40 #include "libbfd.h"
41 #include "vms.h"
42 
43 static int
44 check_section (bfd * abfd, int size)
45 {
46   bfd_size_type offset;
47 
48   offset = PRIV (image_ptr) - PRIV (image_section)->contents;
49   if (offset + size > PRIV (image_section)->size)
50     {
51       PRIV (image_section)->contents
52 	= bfd_realloc (PRIV (image_section)->contents, offset + size);
53       if (PRIV (image_section)->contents == 0)
54 	{
55 	  (*_bfd_error_handler) (_("No Mem !"));
56 	  return -1;
57 	}
58       PRIV (image_section)->size = offset + size;
59       PRIV (image_ptr) = PRIV (image_section)->contents + offset;
60     }
61 
62   return 0;
63 }
64 
65 /* Routines to fill sections contents during tir/etir read.  */
66 
67 /* Initialize image buffer pointer to be filled.  */
68 
69 static void
70 image_set_ptr (bfd * abfd, int psect, uquad offset)
71 {
72 #if VMS_DEBUG
73   _bfd_vms_debug (4, "image_set_ptr (%d=%s, %d)\n",
74 		  psect, PRIV (sections)[psect]->name, offset);
75 #endif
76 
77   PRIV (image_ptr) = PRIV (sections)[psect]->contents + offset;
78   PRIV (image_section) = PRIV (sections)[psect];
79 }
80 
81 /* Increment image buffer pointer by offset.  */
82 
83 static void
84 image_inc_ptr (bfd * abfd, uquad offset)
85 {
86 #if VMS_DEBUG
87   _bfd_vms_debug (4, "image_inc_ptr (%d)\n", offset);
88 #endif
89 
90   PRIV (image_ptr) += offset;
91 }
92 
93 /* Dump multiple bytes to section image.  */
94 
95 static void
96 image_dump (bfd * abfd,
97 	    unsigned char *ptr,
98 	    int size,
99 	    int offset ATTRIBUTE_UNUSED)
100 {
101 #if VMS_DEBUG
102   _bfd_vms_debug (8, "image_dump from (%p, %d) to (%p)\n", ptr, size,
103 		  PRIV (image_ptr));
104   _bfd_hexdump (9, ptr, size, offset);
105 #endif
106 
107   if (PRIV (is_vax) && check_section (abfd, size))
108     return;
109 
110   while (size-- > 0)
111     *PRIV (image_ptr)++ = *ptr++;
112 }
113 
114 /* Write byte to section image.  */
115 
116 static void
117 image_write_b (bfd * abfd, unsigned int value)
118 {
119 #if VMS_DEBUG
120   _bfd_vms_debug (6, "image_write_b (%02x)\n", (int) value);
121 #endif
122 
123   if (PRIV (is_vax) && check_section (abfd, 1))
124     return;
125 
126   *PRIV (image_ptr)++ = (value & 0xff);
127 }
128 
129 /* Write 2-byte word to image.  */
130 
131 static void
132 image_write_w (bfd * abfd, unsigned int value)
133 {
134 #if VMS_DEBUG
135   _bfd_vms_debug (6, "image_write_w (%04x)\n", (int) value);
136 #endif
137 
138   if (PRIV (is_vax) && check_section (abfd, 2))
139     return;
140 
141   bfd_putl16 ((bfd_vma) value, PRIV (image_ptr));
142   PRIV (image_ptr) += 2;
143 }
144 
145 /* Write 4-byte long to image.  */
146 
147 static void
148 image_write_l (bfd * abfd, unsigned long value)
149 {
150 #if VMS_DEBUG
151   _bfd_vms_debug (6, "image_write_l (%08lx)\n", value);
152 #endif
153 
154   if (PRIV (is_vax) && check_section (abfd, 4))
155     return;
156 
157   bfd_putl32 ((bfd_vma) value, PRIV (image_ptr));
158   PRIV (image_ptr) += 4;
159 }
160 
161 /* Write 8-byte quad to image.  */
162 
163 static void
164 image_write_q (bfd * abfd, uquad value)
165 {
166 #if VMS_DEBUG
167   _bfd_vms_debug (6, "image_write_q (%016lx)\n", value);
168 #endif
169 
170   if (PRIV (is_vax) && check_section (abfd, 8))
171     return;
172 
173   bfd_putl64 (value, PRIV (image_ptr));
174   PRIV (image_ptr) += 8;
175 }
176 
177 static const char *
178 cmd_name (int cmd)
179 {
180   switch (cmd)
181     {
182     case ETIR_S_C_STA_GBL: return "ETIR_S_C_STA_GBL";
183     case ETIR_S_C_STA_PQ: return "ETIR_S_C_STA_PQ";
184     case ETIR_S_C_STA_LI: return "ETIR_S_C_STA_LI";
185     case ETIR_S_C_STA_MOD: return "ETIR_S_C_STA_MOD";
186     case ETIR_S_C_STA_CKARG: return "ETIR_S_C_STA_CKARG";
187     case ETIR_S_C_STO_B: return "ETIR_S_C_STO_B";
188     case ETIR_S_C_STO_W: return "ETIR_S_C_STO_W";
189     case ETIR_S_C_STO_GBL: return "ETIR_S_C_STO_GBL";
190     case ETIR_S_C_STO_CA: return "ETIR_S_C_STO_CA";
191     case ETIR_S_C_STO_RB: return "ETIR_S_C_STO_RB";
192     case ETIR_S_C_STO_AB: return "ETIR_S_C_STO_AB";
193     case ETIR_S_C_STO_GBL_LW: return "ETIR_S_C_STO_GBL_LW";
194     case ETIR_S_C_STO_LP_PSB: return "ETIR_S_C_STO_LP_PSB";
195     case ETIR_S_C_STO_HINT_GBL: return "ETIR_S_C_STO_HINT_GBL";
196     case ETIR_S_C_STO_HINT_PS: return "ETIR_S_C_STO_HINT_PS";
197     case ETIR_S_C_OPR_INSV: return "ETIR_S_C_OPR_INSV";
198     case ETIR_S_C_OPR_USH: return "ETIR_S_C_OPR_USH";
199     case ETIR_S_C_OPR_ROT: return "ETIR_S_C_OPR_ROT";
200     case ETIR_S_C_OPR_REDEF: return "ETIR_S_C_OPR_REDEF";
201     case ETIR_S_C_OPR_DFLIT: return "ETIR_S_C_OPR_DFLIT";
202     case ETIR_S_C_STC_LP: return "ETIR_S_C_STC_LP";
203     case ETIR_S_C_STC_GBL: return "ETIR_S_C_STC_GBL";
204     case ETIR_S_C_STC_GCA: return "ETIR_S_C_STC_GCA";
205     case ETIR_S_C_STC_PS: return "ETIR_S_C_STC_PS";
206     case ETIR_S_C_STC_NBH_PS: return "ETIR_S_C_STC_NBH_PS";
207     case ETIR_S_C_STC_NOP_GBL: return "ETIR_S_C_STC_NOP_GBL";
208     case ETIR_S_C_STC_NOP_PS: return "ETIR_S_C_STC_NOP_PS";
209     case ETIR_S_C_STC_BSR_GBL: return "ETIR_S_C_STC_BSR_GBL";
210     case ETIR_S_C_STC_BSR_PS: return "ETIR_S_C_STC_BSR_PS";
211     case ETIR_S_C_STC_LDA_GBL: return "ETIR_S_C_STC_LDA_GBL";
212     case ETIR_S_C_STC_LDA_PS: return "ETIR_S_C_STC_LDA_PS";
213     case ETIR_S_C_STC_BOH_GBL: return "ETIR_S_C_STC_BOH_GBL";
214     case ETIR_S_C_STC_BOH_PS: return "ETIR_S_C_STC_BOH_PS";
215     case ETIR_S_C_STC_NBH_GBL: return "ETIR_S_C_STC_NBH_GBL";
216 
217     default:
218       /* These names have not yet been added to this switch statement.  */
219       abort ();
220     }
221 }
222 #define HIGHBIT(op) ((op & 0x80000000L) == 0x80000000L)
223 
224 /* etir_sta
225 
226    vms stack commands
227 
228    handle sta_xxx commands in etir section
229    ptr points to data area in record
230 
231    see table B-8 of the openVMS linker manual.  */
232 
233 static bfd_boolean
234 etir_sta (bfd * abfd, int cmd, unsigned char *ptr)
235 {
236 #if VMS_DEBUG
237   _bfd_vms_debug (5, "etir_sta %d/%x\n", cmd, cmd);
238   _bfd_hexdump (8, ptr, 16, (int) ptr);
239 #endif
240 
241   switch (cmd)
242     {
243       /* stack global
244 	 arg: cs	symbol name
245 
246 	 stack 32 bit value of symbol (high bits set to 0).  */
247     case ETIR_S_C_STA_GBL:
248       {
249 	char *name;
250 	vms_symbol_entry *entry;
251 
252 	name = _bfd_vms_save_counted_string (ptr);
253 	entry = (vms_symbol_entry *)
254 	  bfd_hash_lookup (PRIV (vms_symbol_table), name, FALSE, FALSE);
255 	if (entry == NULL)
256 	  {
257 #if VMS_DEBUG
258 	    _bfd_vms_debug (3, "%s: no symbol \"%s\"\n",
259 			    cmd_name (cmd), name);
260 #endif
261 	    _bfd_vms_push (abfd, (uquad) 0, -1);
262 	  }
263 	else
264 	  _bfd_vms_push (abfd, (uquad) (entry->symbol->value), -1);
265       }
266       break;
267 
268       /* stack longword
269 	 arg: lw	value
270 
271 	 stack 32 bit value, sign extend to 64 bit.  */
272     case ETIR_S_C_STA_LW:
273       _bfd_vms_push (abfd, (uquad) bfd_getl32 (ptr), -1);
274       break;
275 
276       /* stack global
277 	 arg: qw	value
278 
279 	 stack 64 bit value of symbol.  */
280     case ETIR_S_C_STA_QW:
281       _bfd_vms_push (abfd, (uquad) bfd_getl64 (ptr), -1);
282       break;
283 
284       /* stack psect base plus quadword offset
285 	 arg: lw	section index
286 	 qw	signed quadword offset (low 32 bits)
287 
288 	 stack qw argument and section index
289 	 (see ETIR_S_C_STO_OFF, ETIR_S_C_CTL_SETRB).  */
290     case ETIR_S_C_STA_PQ:
291       {
292 	uquad dummy;
293 	unsigned int psect;
294 
295 	psect = bfd_getl32 (ptr);
296 	if (psect >= PRIV (section_count))
297 	  {
298 	    (*_bfd_error_handler) (_("bad section index in %s"),
299 				   cmd_name (cmd));
300 	    bfd_set_error (bfd_error_bad_value);
301 	    return FALSE;
302 	  }
303 	dummy = bfd_getl64 (ptr + 4);
304 	_bfd_vms_push (abfd, dummy, (int) psect);
305       }
306       break;
307 
308     case ETIR_S_C_STA_LI:
309     case ETIR_S_C_STA_MOD:
310     case ETIR_S_C_STA_CKARG:
311       (*_bfd_error_handler) (_("unsupported STA cmd %s"), cmd_name (cmd));
312       return FALSE;
313       break;
314 
315     default:
316       (*_bfd_error_handler) (_("reserved STA cmd %d"), cmd);
317       return FALSE;
318       break;
319     }
320 #if VMS_DEBUG
321   _bfd_vms_debug (5, "etir_sta true\n");
322 #endif
323   return TRUE;
324 }
325 
326 /* etir_sto
327 
328    vms store commands
329 
330    handle sto_xxx commands in etir section
331    ptr points to data area in record
332 
333    see table B-9 of the openVMS linker manual.  */
334 
335 static bfd_boolean
336 etir_sto (bfd * abfd, int cmd, unsigned char *ptr)
337 {
338   uquad dummy;
339   int psect;
340 
341 #if VMS_DEBUG
342   _bfd_vms_debug (5, "etir_sto %d/%x\n", cmd, cmd);
343   _bfd_hexdump (8, ptr, 16, (int) ptr);
344 #endif
345 
346   switch (cmd)
347     {
348       /* Store byte: pop stack, write byte
349 	 arg: -.  */
350     case ETIR_S_C_STO_B:
351       dummy = _bfd_vms_pop (abfd, &psect);
352       /* FIXME: check top bits.  */
353       image_write_b (abfd, (unsigned int) dummy & 0xff);
354       break;
355 
356       /* Store word: pop stack, write word
357 	 arg: -.  */
358     case ETIR_S_C_STO_W:
359       dummy = _bfd_vms_pop (abfd, &psect);
360       /* FIXME: check top bits */
361       image_write_w (abfd, (unsigned int) dummy & 0xffff);
362       break;
363 
364       /* Store longword: pop stack, write longword
365 	 arg: -.  */
366     case ETIR_S_C_STO_LW:
367       dummy = _bfd_vms_pop (abfd, &psect);
368       dummy += (PRIV (sections)[psect])->vma;
369       /* FIXME: check top bits.  */
370       image_write_l (abfd, (unsigned int) dummy & 0xffffffff);
371       break;
372 
373       /* Store quadword: pop stack, write quadword
374 	 arg: -.  */
375     case ETIR_S_C_STO_QW:
376       dummy = _bfd_vms_pop (abfd, &psect);
377       dummy += (PRIV (sections)[psect])->vma;
378       /* FIXME: check top bits.  */
379       image_write_q (abfd, dummy);
380       break;
381 
382       /* Store immediate repeated: pop stack for repeat count
383 	 arg: lw	byte count
384 	 da	data.  */
385     case ETIR_S_C_STO_IMMR:
386       {
387 	int size;
388 
389 	size = bfd_getl32 (ptr);
390 	dummy = (unsigned long) _bfd_vms_pop (abfd, NULL);
391 	while (dummy-- > 0)
392 	  image_dump (abfd, ptr+4, size, 0);
393       }
394       break;
395 
396       /* Store global: write symbol value
397 	 arg: cs	global symbol name.  */
398     case ETIR_S_C_STO_GBL:
399       {
400 	vms_symbol_entry *entry;
401 	char *name;
402 
403 	name = _bfd_vms_save_counted_string (ptr);
404 	entry = (vms_symbol_entry *) bfd_hash_lookup (PRIV (vms_symbol_table),
405 						      name, FALSE, FALSE);
406 	if (entry == NULL)
407 	  {
408 	    (*_bfd_error_handler) (_("%s: no symbol \"%s\""),
409 				   cmd_name (cmd), name);
410 	    return FALSE;
411 	  }
412 	else
413 	  /* FIXME, reloc.  */
414 	  image_write_q (abfd, (uquad) (entry->symbol->value));
415       }
416       break;
417 
418       /* Store code address: write address of entry point
419 	 arg: cs	global symbol name (procedure).  */
420     case ETIR_S_C_STO_CA:
421       {
422 	vms_symbol_entry *entry;
423 	char *name;
424 
425 	name = _bfd_vms_save_counted_string (ptr);
426 	entry = (vms_symbol_entry *) bfd_hash_lookup (PRIV (vms_symbol_table),
427 						      name, FALSE, FALSE);
428 	if (entry == NULL)
429 	  {
430 	    (*_bfd_error_handler) (_("%s: no symbol \"%s\""),
431 				   cmd_name (cmd), name);
432 	    return FALSE;
433 	  }
434 	else
435 	  /* FIXME, reloc.  */
436 	  image_write_q (abfd, (uquad) (entry->symbol->value));
437       }
438       break;
439 
440       /* Store offset to psect: pop stack, add low 32 bits to base of psect
441 	 arg: none.  */
442     case ETIR_S_C_STO_OFF:
443       {
444 	uquad q;
445 	int psect1;
446 
447 	q = _bfd_vms_pop (abfd, & psect1);
448 	q += (PRIV (sections)[psect1])->vma;
449 	image_write_q (abfd, q);
450       }
451       break;
452 
453       /* Store immediate
454 	 arg: lw	count of bytes
455 	      da	data.  */
456     case ETIR_S_C_STO_IMM:
457       {
458 	int size;
459 
460 	size = bfd_getl32 (ptr);
461 	image_dump (abfd, ptr+4, size, 0);
462       }
463       break;
464 
465       /* This code is 'reserved to digital' according to the openVMS
466 	 linker manual, however it is generated by the DEC C compiler
467 	 and defined in the include file.
468 	 FIXME, since the following is just a guess
469 	 store global longword: store 32bit value of symbol
470 	 arg: cs	symbol name.  */
471     case ETIR_S_C_STO_GBL_LW:
472       {
473 	vms_symbol_entry *entry;
474 	char *name;
475 
476 	name = _bfd_vms_save_counted_string (ptr);
477 	entry = (vms_symbol_entry *) bfd_hash_lookup (PRIV (vms_symbol_table),
478 						      name, FALSE, FALSE);
479 	if (entry == NULL)
480 	  {
481 #if VMS_DEBUG
482 	    _bfd_vms_debug (3, "%s: no symbol \"%s\"\n", cmd_name (cmd), name);
483 #endif
484 	    image_write_l (abfd, (unsigned long) 0);	/* FIXME, reloc */
485 	  }
486 	else
487 	  /* FIXME, reloc.  */
488 	  image_write_l (abfd, (unsigned long) (entry->symbol->value));
489       }
490       break;
491 
492     case ETIR_S_C_STO_RB:
493     case ETIR_S_C_STO_AB:
494     case ETIR_S_C_STO_LP_PSB:
495       (*_bfd_error_handler) (_("%s: not supported"), cmd_name (cmd));
496       break;
497 
498     case ETIR_S_C_STO_HINT_GBL:
499     case ETIR_S_C_STO_HINT_PS:
500       (*_bfd_error_handler) (_("%s: not implemented"), cmd_name (cmd));
501       break;
502 
503     default:
504       (*_bfd_error_handler) (_("reserved STO cmd %d"), cmd);
505       break;
506     }
507 
508   return TRUE;
509 }
510 
511 /* Stack operator commands
512    all 32 bit signed arithmetic
513    all word just like a stack calculator
514    arguments are popped from stack, results are pushed on stack
515 
516    see table B-10 of the openVMS linker manual.  */
517 
518 static bfd_boolean
519 etir_opr (bfd * abfd, int cmd, unsigned char *ptr ATTRIBUTE_UNUSED)
520 {
521   long op1, op2;
522 
523 #if VMS_DEBUG
524   _bfd_vms_debug (5, "etir_opr %d/%x\n", cmd, cmd);
525   _bfd_hexdump (8, ptr, 16, (int) ptr);
526 #endif
527 
528   switch (cmd)
529     {
530     case ETIR_S_C_OPR_NOP:      /* No-op.  */
531       break;
532 
533     case ETIR_S_C_OPR_ADD:      /* Add.  */
534       op1 = (long) _bfd_vms_pop (abfd, NULL);
535       op2 = (long) _bfd_vms_pop (abfd, NULL);
536       _bfd_vms_push (abfd, (uquad) (op1 + op2), -1);
537       break;
538 
539     case ETIR_S_C_OPR_SUB:      /* Subtract.  */
540       op1 = (long) _bfd_vms_pop (abfd, NULL);
541       op2 = (long) _bfd_vms_pop (abfd, NULL);
542       _bfd_vms_push (abfd, (uquad) (op2 - op1), -1);
543       break;
544 
545     case ETIR_S_C_OPR_MUL:      /* Multiply.  */
546       op1 = (long) _bfd_vms_pop (abfd, NULL);
547       op2 = (long) _bfd_vms_pop (abfd, NULL);
548       _bfd_vms_push (abfd, (uquad) (op1 * op2), -1);
549       break;
550 
551     case ETIR_S_C_OPR_DIV:      /* Divide.  */
552       op1 = (long) _bfd_vms_pop (abfd, NULL);
553       op2 = (long) _bfd_vms_pop (abfd, NULL);
554       if (op2 == 0)
555 	_bfd_vms_push (abfd, (uquad) 0, -1);
556       else
557 	_bfd_vms_push (abfd, (uquad) (op2 / op1), -1);
558       break;
559 
560     case ETIR_S_C_OPR_AND:      /* Logical AND.  */
561       op1 = (long) _bfd_vms_pop (abfd, NULL);
562       op2 = (long) _bfd_vms_pop (abfd, NULL);
563       _bfd_vms_push (abfd, (uquad) (op1 & op2), -1);
564       break;
565 
566     case ETIR_S_C_OPR_IOR:      /* Logical inclusive OR.  */
567       op1 = (long) _bfd_vms_pop (abfd, NULL);
568       op2 = (long) _bfd_vms_pop (abfd, NULL);
569       _bfd_vms_push (abfd, (uquad) (op1 | op2), -1);
570       break;
571 
572     case ETIR_S_C_OPR_EOR:      /* Logical exclusive OR.  */
573       op1 = (long) _bfd_vms_pop (abfd, NULL);
574       op2 = (long) _bfd_vms_pop (abfd, NULL);
575       _bfd_vms_push (abfd, (uquad) (op1 ^ op2), -1);
576       break;
577 
578     case ETIR_S_C_OPR_NEG:      /* Negate.  */
579       op1 = (long) _bfd_vms_pop (abfd, NULL);
580       _bfd_vms_push (abfd, (uquad) (-op1), -1);
581       break;
582 
583     case ETIR_S_C_OPR_COM:      /* Complement.  */
584       op1 = (long) _bfd_vms_pop (abfd, NULL);
585       _bfd_vms_push (abfd, (uquad) (op1 ^ -1L), -1);
586       break;
587 
588     case ETIR_S_C_OPR_ASH:      /* Arithmetic shift.  */
589       op1 = (long) _bfd_vms_pop (abfd, NULL);
590       op2 = (long) _bfd_vms_pop (abfd, NULL);
591       if (op2 < 0)		/* Shift right.  */
592 	op1 >>= -op2;
593       else			/* Shift left.  */
594 	op1 <<= op2;
595       _bfd_vms_push (abfd, (uquad) op1, -1);
596       break;
597 
598     case ETIR_S_C_OPR_INSV:      /* Insert field.   */
599       (void) _bfd_vms_pop (abfd, NULL);
600     case ETIR_S_C_OPR_USH:       /* Unsigned shift.   */
601     case ETIR_S_C_OPR_ROT:       /* Rotate.  */
602     case ETIR_S_C_OPR_REDEF:     /* Redefine symbol to current location.  */
603     case ETIR_S_C_OPR_DFLIT:     /* Define a literal.  */
604       (*_bfd_error_handler) (_("%s: not supported"), cmd_name (cmd));
605       break;
606 
607     case ETIR_S_C_OPR_SEL:      /* Select.  */
608       if ((long) _bfd_vms_pop (abfd, NULL) & 0x01L)
609 	(void) _bfd_vms_pop (abfd, NULL);
610       else
611 	{
612 	  op1 = (long) _bfd_vms_pop (abfd, NULL);
613 	  (void) _bfd_vms_pop (abfd, NULL);
614 	  _bfd_vms_push (abfd, (uquad) op1, -1);
615 	}
616       break;
617 
618     default:
619       (*_bfd_error_handler) (_("reserved OPR cmd %d"), cmd);
620       break;
621     }
622 
623   return TRUE;
624 }
625 
626 /* Control commands.
627 
628    See table B-11 of the openVMS linker manual.  */
629 
630 static bfd_boolean
631 etir_ctl (bfd * abfd, int cmd, unsigned char *ptr)
632 {
633   uquad	 dummy;
634   int psect;
635 
636 #if VMS_DEBUG
637   _bfd_vms_debug (5, "etir_ctl %d/%x\n", cmd, cmd);
638   _bfd_hexdump (8, ptr, 16, (int) ptr);
639 #endif
640 
641   switch (cmd)
642     {
643       /* Det relocation base: pop stack, set image location counter
644 	 arg: none.  */
645     case ETIR_S_C_CTL_SETRB:
646       dummy = _bfd_vms_pop (abfd, &psect);
647       image_set_ptr (abfd, psect, dummy);
648       break;
649 
650       /* Augment relocation base: increment image location counter by offset
651 	 arg: lw	offset value.  */
652     case ETIR_S_C_CTL_AUGRB:
653       dummy = bfd_getl32 (ptr);
654       image_inc_ptr (abfd, dummy);
655       break;
656 
657       /* Define location: pop index, save location counter under index
658 	 arg: none.  */
659     case ETIR_S_C_CTL_DFLOC:
660       dummy = _bfd_vms_pop (abfd, NULL);
661       /* FIXME */
662       break;
663 
664       /* Set location: pop index, restore location counter from index
665 	 arg: none.  */
666     case ETIR_S_C_CTL_STLOC:
667       dummy = _bfd_vms_pop (abfd, &psect);
668       /* FIXME */
669       break;
670 
671       /* Stack defined location: pop index, push location counter from index
672 	 arg: none.  */
673     case ETIR_S_C_CTL_STKDL:
674       dummy = _bfd_vms_pop (abfd, &psect);
675       /* FIXME.  */
676       break;
677 
678     default:
679       (*_bfd_error_handler) (_("reserved CTL cmd %d"), cmd);
680       break;
681     }
682   return TRUE;
683 }
684 
685 /* Store conditional commands
686 
687    See table B-12 and B-13 of the openVMS linker manual.  */
688 
689 static bfd_boolean
690 etir_stc (bfd * abfd, int cmd, unsigned char *ptr ATTRIBUTE_UNUSED)
691 {
692 #if VMS_DEBUG
693   _bfd_vms_debug (5, "etir_stc %d/%x\n", cmd, cmd);
694   _bfd_hexdump (8, ptr, 16, (int) ptr);
695 #endif
696 
697   switch (cmd)
698     {
699       /* 200 Store-conditional Linkage Pair
700 	 arg: none.  */
701     case ETIR_S_C_STC_LP:
702       (*_bfd_error_handler) (_("%s: not supported"), cmd_name (cmd));
703       break;
704 
705       /* 201 Store-conditional Linkage Pair with Procedure Signature
706 	 arg:	lw	linkage index
707 		cs	procedure name
708 		by	signature length
709 		da	signature.  */
710     case ETIR_S_C_STC_LP_PSB:
711       image_inc_ptr (abfd, (uquad) 16);	/* skip entry,procval */
712       break;
713 
714       /* 202 Store-conditional Address at global address
715 	 arg:	lw	linkage index
716 		cs	global name.  */
717 
718     case ETIR_S_C_STC_GBL:
719       (*_bfd_error_handler) (_("%s: not supported"), cmd_name (cmd));
720       break;
721 
722       /* 203 Store-conditional Code Address at global address
723 	 arg:	lw	linkage index
724 		cs	procedure name.  */
725     case ETIR_S_C_STC_GCA:
726       (*_bfd_error_handler) (_("%s: not supported"), cmd_name (cmd));
727       break;
728 
729       /* 204 Store-conditional Address at psect + offset
730 	 arg:	lw	linkage index
731 		lw	psect index
732 		qw	offset.  */
733     case ETIR_S_C_STC_PS:
734       (*_bfd_error_handler) (_("%s: not supported"), cmd_name (cmd));
735       break;
736 
737       /* 205 Store-conditional NOP at address of global
738 	 arg: none.  */
739     case ETIR_S_C_STC_NOP_GBL:
740 
741       /* 206 Store-conditional NOP at pect + offset
742 	 arg: none.  */
743     case ETIR_S_C_STC_NOP_PS:
744 
745       /* 207 Store-conditional BSR at global address
746 	 arg: none.  */
747     case ETIR_S_C_STC_BSR_GBL:
748 
749       /* 208 Store-conditional BSR at pect + offset
750 	 arg: none.  */
751     case ETIR_S_C_STC_BSR_PS:
752 
753       /* 209 Store-conditional LDA at global address
754 	 arg: none.  */
755     case ETIR_S_C_STC_LDA_GBL:
756 
757       /* 210 Store-conditional LDA at psect + offset
758 	 arg: none.  */
759     case ETIR_S_C_STC_LDA_PS:
760 
761       /* 211 Store-conditional BSR or Hint at global address
762 	 arg: none.  */
763     case ETIR_S_C_STC_BOH_GBL:
764 
765       /* 212 Store-conditional BSR or Hint at pect + offset
766 	 arg: none.  */
767     case ETIR_S_C_STC_BOH_PS:
768 
769       /* 213 Store-conditional NOP,BSR or HINT at global address
770 	 arg: none.  */
771     case ETIR_S_C_STC_NBH_GBL:
772 
773       /* 214 Store-conditional NOP,BSR or HINT at psect + offset
774 	 arg: none.  */
775     case ETIR_S_C_STC_NBH_PS:
776       /* FIXME */
777       break;
778 
779     default:
780 #if VMS_DEBUG
781       _bfd_vms_debug (3,  "reserved STC cmd %d", cmd);
782 #endif
783       break;
784     }
785   return TRUE;
786 }
787 
788 static asection *
789 new_section (bfd * abfd ATTRIBUTE_UNUSED, int idx)
790 {
791   asection *section;
792   char sname[16];
793   char *name;
794 
795 #if VMS_DEBUG
796   _bfd_vms_debug (5, "new_section %d\n", idx);
797 #endif
798   sprintf (sname, SECTION_NAME_TEMPLATE, idx);
799 
800   name = bfd_malloc ((bfd_size_type) strlen (sname) + 1);
801   if (name == 0)
802     return NULL;
803   strcpy (name, sname);
804 
805   section = bfd_malloc ((bfd_size_type) sizeof (asection));
806   if (section == 0)
807     {
808 #if VMS_DEBUG
809       _bfd_vms_debug (6,  "bfd_make_section (%s) failed", name);
810 #endif
811       return NULL;
812     }
813 
814   section->size = 0;
815   section->vma = 0;
816   section->contents = 0;
817   section->name = name;
818   section->index = idx;
819 
820   return section;
821 }
822 
823 static int
824 alloc_section (bfd * abfd, unsigned int idx)
825 {
826   bfd_size_type amt;
827 
828 #if VMS_DEBUG
829   _bfd_vms_debug (4, "alloc_section %d\n", idx);
830 #endif
831 
832   amt = idx + 1;
833   amt *= sizeof (asection *);
834   PRIV (sections) = bfd_realloc (PRIV (sections), amt);
835   if (PRIV (sections) == 0)
836     return -1;
837 
838   while (PRIV (section_count) <= idx)
839     {
840       PRIV (sections)[PRIV (section_count)]
841 	= new_section (abfd, (int) PRIV (section_count));
842       if (PRIV (sections)[PRIV (section_count)] == 0)
843 	return -1;
844       PRIV (section_count)++;
845     }
846 
847   return 0;
848 }
849 
850 /* tir_sta
851 
852    vax stack commands
853 
854    Handle sta_xxx commands in tir section
855    ptr points to data area in record
856 
857    See table 7-3 of the VAX/VMS linker manual.  */
858 
859 static unsigned char *
860 tir_sta (bfd * abfd, unsigned char *ptr)
861 {
862   int cmd = *ptr++;
863 
864 #if VMS_DEBUG
865   _bfd_vms_debug (5, "tir_sta %d\n", cmd);
866 #endif
867 
868   switch (cmd)
869     {
870       /* stack */
871     case TIR_S_C_STA_GBL:
872       /* stack global
873 	 arg: cs	symbol name
874 
875 	 stack 32 bit value of symbol (high bits set to 0).  */
876       {
877 	char *name;
878 	vms_symbol_entry *entry;
879 
880 	name = _bfd_vms_save_counted_string (ptr);
881 
882 	entry = _bfd_vms_enter_symbol (abfd, name);
883 	if (entry == NULL)
884 	  return NULL;
885 
886 	_bfd_vms_push (abfd, (uquad) (entry->symbol->value), -1);
887 	ptr += *ptr + 1;
888       }
889       break;
890 
891     case TIR_S_C_STA_SB:
892       /* stack signed byte
893 	 arg: by	value
894 
895 	 stack byte value, sign extend to 32 bit.  */
896       _bfd_vms_push (abfd, (uquad) *ptr++, -1);
897       break;
898 
899     case TIR_S_C_STA_SW:
900       /* stack signed short word
901 	 arg: sh	value
902 
903 	 stack 16 bit value, sign extend to 32 bit.  */
904       _bfd_vms_push (abfd, (uquad) bfd_getl16 (ptr), -1);
905       ptr += 2;
906       break;
907 
908     case TIR_S_C_STA_LW:
909       /* stack signed longword
910 	 arg: lw	value
911 
912 	 stack 32 bit value.  */
913       _bfd_vms_push (abfd, (uquad) bfd_getl32 (ptr), -1);
914       ptr += 4;
915       break;
916 
917     case TIR_S_C_STA_PB:
918     case TIR_S_C_STA_WPB:
919       /* stack psect base plus byte offset (word index)
920 	 arg: by	section index
921 		(sh	section index)
922 		by	signed byte offset.  */
923       {
924 	unsigned long dummy;
925 	unsigned int psect;
926 
927 	if (cmd == TIR_S_C_STA_PB)
928 	  psect = *ptr++;
929 	else
930 	  {
931 	    psect = bfd_getl16 (ptr);
932 	    ptr += 2;
933 	  }
934 
935 	if (psect >= PRIV (section_count))
936 	  alloc_section (abfd, psect);
937 
938 	dummy = (long) *ptr++;
939 	dummy += (PRIV (sections)[psect])->vma;
940 	_bfd_vms_push (abfd, (uquad) dummy, (int) psect);
941       }
942       break;
943 
944     case TIR_S_C_STA_PW:
945     case TIR_S_C_STA_WPW:
946       /* stack psect base plus word offset (word index)
947 	 arg: by	section index
948 		(sh	section index)
949 		sh	signed short offset.  */
950       {
951 	unsigned long dummy;
952 	unsigned int psect;
953 
954 	if (cmd == TIR_S_C_STA_PW)
955 	  psect = *ptr++;
956 	else
957 	  {
958 	    psect = bfd_getl16 (ptr);
959 	    ptr += 2;
960 	  }
961 
962 	if (psect >= PRIV (section_count))
963 	  alloc_section (abfd, psect);
964 
965 	dummy = bfd_getl16 (ptr); ptr+=2;
966 	dummy += (PRIV (sections)[psect])->vma;
967 	_bfd_vms_push (abfd, (uquad) dummy, (int) psect);
968       }
969       break;
970 
971     case TIR_S_C_STA_PL:
972     case TIR_S_C_STA_WPL:
973       /* stack psect base plus long offset (word index)
974 	 arg: by	section index
975 		(sh	section index)
976 		lw	signed longword offset.	 */
977       {
978 	unsigned long dummy;
979 	unsigned int psect;
980 
981 	if (cmd == TIR_S_C_STA_PL)
982 	  psect = *ptr++;
983 	else
984 	  {
985 	    psect = bfd_getl16 (ptr);
986 	    ptr += 2;
987 	  }
988 
989 	if (psect >= PRIV (section_count))
990 	  alloc_section (abfd, psect);
991 
992 	dummy = bfd_getl32 (ptr); ptr += 4;
993 	dummy += (PRIV (sections)[psect])->vma;
994 	_bfd_vms_push (abfd, (uquad) dummy, (int) psect);
995       }
996       break;
997 
998     case TIR_S_C_STA_UB:
999       /* stack unsigned byte
1000 	 arg: by	value
1001 
1002 	 stack byte value.  */
1003       _bfd_vms_push (abfd, (uquad) *ptr++, -1);
1004       break;
1005 
1006     case TIR_S_C_STA_UW:
1007       /* stack unsigned short word
1008 	 arg: sh	value
1009 
1010 	 stack 16 bit value.  */
1011       _bfd_vms_push (abfd, (uquad) bfd_getl16 (ptr), -1);
1012       ptr += 2;
1013       break;
1014 
1015     case TIR_S_C_STA_BFI:
1016       /* stack byte from image
1017 	 arg: none.  */
1018       /* FALLTHRU  */
1019     case TIR_S_C_STA_WFI:
1020       /* stack byte from image
1021 	 arg: none.  */
1022       /* FALLTHRU */
1023     case TIR_S_C_STA_LFI:
1024       /* stack byte from image
1025 	 arg: none.  */
1026       (*_bfd_error_handler) (_("stack-from-image not implemented"));
1027       return NULL;
1028 
1029     case TIR_S_C_STA_EPM:
1030       /* stack entry point mask
1031 	 arg: cs	symbol name
1032 
1033 	 stack (unsigned) entry point mask of symbol
1034 	 err if symbol is no entry point.  */
1035       {
1036 	char *name;
1037 	vms_symbol_entry *entry;
1038 
1039 	name = _bfd_vms_save_counted_string (ptr);
1040 	entry = _bfd_vms_enter_symbol (abfd, name);
1041 	if (entry == NULL)
1042 	  return NULL;
1043 
1044 	(*_bfd_error_handler) (_("stack-entry-mask not fully implemented"));
1045 	_bfd_vms_push (abfd, (uquad) 0, -1);
1046 	ptr += *ptr + 1;
1047       }
1048       break;
1049 
1050     case TIR_S_C_STA_CKARG:
1051       /* compare procedure argument
1052 	 arg: cs	symbol name
1053 		by	argument index
1054 		da	argument descriptor
1055 
1056 	 compare argument descriptor with symbol argument (ARG$V_PASSMECH)
1057 	 and stack TRUE (args match) or FALSE (args dont match) value.  */
1058       (*_bfd_error_handler) (_("PASSMECH not fully implemented"));
1059       _bfd_vms_push (abfd, (uquad) 1, -1);
1060       break;
1061 
1062     case TIR_S_C_STA_LSY:
1063       /* stack local symbol value
1064 	 arg:	sh	environment index
1065 		cs	symbol name.  */
1066       {
1067 	int envidx;
1068 	char *name;
1069 	vms_symbol_entry *entry;
1070 
1071 	envidx = bfd_getl16 (ptr);
1072 	ptr += 2;
1073 	name = _bfd_vms_save_counted_string (ptr);
1074 	entry = _bfd_vms_enter_symbol (abfd, name);
1075 	if (entry == NULL)
1076 	  return NULL;
1077 	(*_bfd_error_handler) (_("stack-local-symbol not fully implemented"));
1078 	_bfd_vms_push (abfd, (uquad) 0, -1);
1079 	ptr += *ptr + 1;
1080       }
1081       break;
1082 
1083     case TIR_S_C_STA_LIT:
1084       /* stack literal
1085 	 arg:	by	literal index
1086 
1087 	 stack literal.  */
1088       ptr++;
1089       _bfd_vms_push (abfd, (uquad) 0, -1);
1090       (*_bfd_error_handler) (_("stack-literal not fully implemented"));
1091       break;
1092 
1093     case TIR_S_C_STA_LEPM:
1094       /* stack local symbol entry point mask
1095 	 arg:	sh	environment index
1096 		cs	symbol name
1097 
1098 	 stack (unsigned) entry point mask of symbol
1099 	 err if symbol is no entry point.  */
1100       {
1101 	int envidx;
1102 	char *name;
1103 	vms_symbol_entry *entry;
1104 
1105 	envidx = bfd_getl16 (ptr);
1106 	ptr += 2;
1107 	name = _bfd_vms_save_counted_string (ptr);
1108 	entry = _bfd_vms_enter_symbol (abfd, name);
1109 	if (entry == NULL)
1110 	  return NULL;
1111 	(*_bfd_error_handler) (_("stack-local-symbol-entry-point-mask not fully implemented"));
1112 	_bfd_vms_push (abfd, (uquad) 0, -1);
1113 	ptr += *ptr + 1;
1114       }
1115       break;
1116 
1117     default:
1118       (*_bfd_error_handler) (_("reserved STA cmd %d"), ptr[-1]);
1119       return NULL;
1120       break;
1121     }
1122 
1123   return ptr;
1124 }
1125 
1126 static const char *
1127 tir_cmd_name (int cmd)
1128 {
1129   switch (cmd)
1130     {
1131     case TIR_S_C_STO_RSB: return "TIR_S_C_STO_RSB";
1132     case TIR_S_C_STO_RSW: return "TIR_S_C_STO_RSW";
1133     case TIR_S_C_STO_RL: return "TIR_S_C_STO_RL";
1134     case TIR_S_C_STO_VPS: return "TIR_S_C_STO_VPS";
1135     case TIR_S_C_STO_USB: return "TIR_S_C_STO_USB";
1136     case TIR_S_C_STO_USW: return "TIR_S_C_STO_USW";
1137     case TIR_S_C_STO_RUB: return "TIR_S_C_STO_RUB";
1138     case TIR_S_C_STO_RUW: return "TIR_S_C_STO_RUW";
1139     case TIR_S_C_STO_PIRR: return "TIR_S_C_STO_PIRR";
1140     case TIR_S_C_OPR_INSV: return "TIR_S_C_OPR_INSV";
1141     case TIR_S_C_OPR_DFLIT: return "TIR_S_C_OPR_DFLIT";
1142     case TIR_S_C_OPR_REDEF: return "TIR_S_C_OPR_REDEF";
1143     case TIR_S_C_OPR_ROT: return "TIR_S_C_OPR_ROT";
1144     case TIR_S_C_OPR_USH: return "TIR_S_C_OPR_USH";
1145     case TIR_S_C_OPR_ASH: return "TIR_S_C_OPR_ASH";
1146     case TIR_S_C_CTL_DFLOC: return "TIR_S_C_CTL_DFLOC";
1147     case TIR_S_C_CTL_STLOC: return "TIR_S_C_CTL_STLOC";
1148     case TIR_S_C_CTL_STKDL: return "TIR_S_C_CTL_STKDL";
1149 
1150     default:
1151       /* These strings have not been added yet.  */
1152       abort ();
1153     }
1154 }
1155 
1156 /* tir_sto
1157 
1158    vax store commands
1159 
1160    handle sto_xxx commands in tir section
1161    ptr points to data area in record
1162 
1163    See table 7-4 of the VAX/VMS linker manual.  */
1164 
1165 static unsigned char *
1166 tir_sto (bfd * abfd, unsigned char *ptr)
1167 {
1168   unsigned long dummy;
1169   int size;
1170   int psect;
1171 
1172 #if VMS_DEBUG
1173   _bfd_vms_debug (5, "tir_sto %d\n", *ptr);
1174 #endif
1175 
1176   switch (*ptr++)
1177     {
1178     case TIR_S_C_STO_SB:
1179       /* Store signed byte: pop stack, write byte
1180 	 arg: none.  */
1181       dummy = _bfd_vms_pop (abfd, &psect);
1182       image_write_b (abfd, dummy & 0xff);	/* FIXME: check top bits */
1183       break;
1184 
1185     case TIR_S_C_STO_SW:
1186       /* Store signed word: pop stack, write word
1187 	 arg: none.  */
1188       dummy = _bfd_vms_pop (abfd, &psect);
1189       image_write_w (abfd, dummy & 0xffff);	/* FIXME: check top bits */
1190       break;
1191 
1192     case TIR_S_C_STO_LW:
1193       /* Store longword: pop stack, write longword
1194 	 arg: none.  */
1195       dummy = _bfd_vms_pop (abfd, &psect);
1196       image_write_l (abfd, dummy & 0xffffffff);	/* FIXME: check top bits */
1197       break;
1198 
1199     case TIR_S_C_STO_BD:
1200       /* Store byte displaced: pop stack, sub lc+1, write byte
1201 	 arg: none.  */
1202       dummy = _bfd_vms_pop (abfd, &psect);
1203       dummy -= ((PRIV (sections)[psect])->vma + 1);
1204       image_write_b (abfd, dummy & 0xff);/* FIXME: check top bits */
1205       break;
1206 
1207     case TIR_S_C_STO_WD:
1208       /* Store word displaced: pop stack, sub lc+2, write word
1209 	 arg: none.  */
1210       dummy = _bfd_vms_pop (abfd, &psect);
1211       dummy -= ((PRIV (sections)[psect])->vma + 2);
1212       image_write_w (abfd, dummy & 0xffff);/* FIXME: check top bits */
1213       break;
1214 
1215     case TIR_S_C_STO_LD:
1216       /* Store long displaced: pop stack, sub lc+4, write long
1217 	 arg: none.  */
1218       dummy = _bfd_vms_pop (abfd, &psect);
1219       dummy -= ((PRIV (sections)[psect])->vma + 4);
1220       image_write_l (abfd, dummy & 0xffffffff);/* FIXME: check top bits */
1221       break;
1222 
1223     case TIR_S_C_STO_LI:
1224       /* Store short literal: pop stack, write byte
1225 	 arg: none.  */
1226       dummy = _bfd_vms_pop (abfd, &psect);
1227       image_write_b (abfd, dummy & 0xff);/* FIXME: check top bits */
1228       break;
1229 
1230     case TIR_S_C_STO_PIDR:
1231       /* Store position independent data reference: pop stack, write longword
1232 	 arg: none.
1233 	 FIXME: incomplete !  */
1234       dummy = _bfd_vms_pop (abfd, &psect);
1235       image_write_l (abfd, dummy & 0xffffffff);
1236       break;
1237 
1238     case TIR_S_C_STO_PICR:
1239       /* Store position independent code reference: pop stack, write longword
1240 	 arg: none.
1241 	 FIXME: incomplete !  */
1242       dummy = _bfd_vms_pop (abfd, &psect);
1243       image_write_b (abfd, 0x9f);
1244       image_write_l (abfd, dummy & 0xffffffff);
1245       break;
1246 
1247     case TIR_S_C_STO_RIVB:
1248       /* Store repeated immediate variable bytes
1249 	 1-byte count n field followed by n bytes of data
1250 	 pop stack, write n bytes <stack> times.  */
1251       size = *ptr++;
1252       dummy = (unsigned long) _bfd_vms_pop (abfd, NULL);
1253       while (dummy-- > 0L)
1254 	image_dump (abfd, ptr, size, 0);
1255       ptr += size;
1256       break;
1257 
1258     case TIR_S_C_STO_B:
1259       /* Store byte from top longword.  */
1260       dummy = (unsigned long) _bfd_vms_pop (abfd, NULL);
1261       image_write_b (abfd, dummy & 0xff);
1262       break;
1263 
1264     case TIR_S_C_STO_W:
1265       /* Store word from top longword.  */
1266       dummy = (unsigned long) _bfd_vms_pop (abfd, NULL);
1267       image_write_w (abfd, dummy & 0xffff);
1268       break;
1269 
1270     case TIR_S_C_STO_RB:
1271       /* Store repeated byte from top longword.  */
1272       size = (unsigned long) _bfd_vms_pop (abfd, NULL);
1273       dummy = (unsigned long) _bfd_vms_pop (abfd, NULL);
1274       while (size-- > 0)
1275 	image_write_b (abfd, dummy & 0xff);
1276       break;
1277 
1278     case TIR_S_C_STO_RW:
1279       /* Store repeated word from top longword.  */
1280       size = (unsigned long) _bfd_vms_pop (abfd, NULL);
1281       dummy = (unsigned long) _bfd_vms_pop (abfd, NULL);
1282       while (size-- > 0)
1283 	image_write_w (abfd, dummy & 0xffff);
1284       break;
1285 
1286     case TIR_S_C_STO_RSB:
1287     case TIR_S_C_STO_RSW:
1288     case TIR_S_C_STO_RL:
1289     case TIR_S_C_STO_VPS:
1290     case TIR_S_C_STO_USB:
1291     case TIR_S_C_STO_USW:
1292     case TIR_S_C_STO_RUB:
1293     case TIR_S_C_STO_RUW:
1294     case TIR_S_C_STO_PIRR:
1295       (*_bfd_error_handler) (_("%s: not implemented"), tir_cmd_name (ptr[-1]));
1296       break;
1297 
1298     default:
1299       (*_bfd_error_handler) (_("reserved STO cmd %d"), ptr[-1]);
1300       break;
1301     }
1302 
1303   return ptr;
1304 }
1305 
1306 /* Stack operator commands
1307    All 32 bit signed arithmetic
1308    All word just like a stack calculator
1309    Arguments are popped from stack, results are pushed on stack
1310 
1311    See table 7-5 of the VAX/VMS linker manual.  */
1312 
1313 static unsigned char *
1314 tir_opr (bfd * abfd, unsigned char *ptr)
1315 {
1316   long op1, op2;
1317 
1318 #if VMS_DEBUG
1319   _bfd_vms_debug (5, "tir_opr %d\n", *ptr);
1320 #endif
1321 
1322   /* Operation.  */
1323   switch (*ptr++)
1324     {
1325     case TIR_S_C_OPR_NOP: /* No-op.  */
1326       break;
1327 
1328     case TIR_S_C_OPR_ADD: /* Add.  */
1329       op1 = (long) _bfd_vms_pop (abfd, NULL);
1330       op2 = (long) _bfd_vms_pop (abfd, NULL);
1331       _bfd_vms_push (abfd, (uquad) (op1 + op2), -1);
1332       break;
1333 
1334     case TIR_S_C_OPR_SUB: /* Subtract.  */
1335       op1 = (long) _bfd_vms_pop (abfd, NULL);
1336       op2 = (long) _bfd_vms_pop (abfd, NULL);
1337       _bfd_vms_push (abfd, (uquad) (op2 - op1), -1);
1338       break;
1339 
1340     case TIR_S_C_OPR_MUL: /* Multiply.  */
1341       op1 = (long) _bfd_vms_pop (abfd, NULL);
1342       op2 = (long) _bfd_vms_pop (abfd, NULL);
1343       _bfd_vms_push (abfd, (uquad) (op1 * op2), -1);
1344       break;
1345 
1346     case TIR_S_C_OPR_DIV: /* Divide.  */
1347       op1 = (long) _bfd_vms_pop (abfd, NULL);
1348       op2 = (long) _bfd_vms_pop (abfd, NULL);
1349       if (op2 == 0)
1350 	_bfd_vms_push (abfd, (uquad) 0, -1);
1351       else
1352 	_bfd_vms_push (abfd, (uquad) (op2 / op1), -1);
1353       break;
1354 
1355     case TIR_S_C_OPR_AND: /* Logical AND.  */
1356       op1 = (long) _bfd_vms_pop (abfd, NULL);
1357       op2 = (long) _bfd_vms_pop (abfd, NULL);
1358       _bfd_vms_push (abfd, (uquad) (op1 & op2), -1);
1359       break;
1360 
1361     case TIR_S_C_OPR_IOR: /* Logical inclusive OR.  */
1362       op1 = (long) _bfd_vms_pop (abfd, NULL);
1363       op2 = (long) _bfd_vms_pop (abfd, NULL);
1364       _bfd_vms_push (abfd, (uquad) (op1 | op2), -1);
1365       break;
1366 
1367     case TIR_S_C_OPR_EOR: /* Logical exclusive OR.  */
1368       op1 = (long) _bfd_vms_pop (abfd, NULL);
1369       op2 = (long) _bfd_vms_pop (abfd, NULL);
1370       _bfd_vms_push (abfd, (uquad) (op1 ^ op2), -1);
1371       break;
1372 
1373     case TIR_S_C_OPR_NEG: /* Negate.  */
1374       op1 = (long) _bfd_vms_pop (abfd, NULL);
1375       _bfd_vms_push (abfd, (uquad) (-op1), -1);
1376       break;
1377 
1378     case TIR_S_C_OPR_COM: /* Complement.  */
1379       op1 = (long) _bfd_vms_pop (abfd, NULL);
1380       _bfd_vms_push (abfd, (uquad) (op1 ^ -1L), -1);
1381       break;
1382 
1383     case TIR_S_C_OPR_INSV: /* Insert field.  */
1384       (void) _bfd_vms_pop (abfd, NULL);
1385       (*_bfd_error_handler)  (_("%s: not fully implemented"),
1386 			      tir_cmd_name (ptr[-1]));
1387       break;
1388 
1389     case TIR_S_C_OPR_ASH: /* Arithmetic shift.  */
1390       op1 = (long) _bfd_vms_pop (abfd, NULL);
1391       op2 = (long) _bfd_vms_pop (abfd, NULL);
1392       if (HIGHBIT (op1))	/* Shift right.  */
1393 	op2 >>= op1;
1394       else			/* Shift left.  */
1395 	op2 <<= op1;
1396       _bfd_vms_push (abfd, (uquad) op2, -1);
1397       (*_bfd_error_handler)  (_("%s: not fully implemented"),
1398 			      tir_cmd_name (ptr[-1]));
1399       break;
1400 
1401     case TIR_S_C_OPR_USH: /* Unsigned shift.  */
1402       op1 = (long) _bfd_vms_pop (abfd, NULL);
1403       op2 = (long) _bfd_vms_pop (abfd, NULL);
1404       if (HIGHBIT (op1))	/* Shift right.  */
1405 	op2 >>= op1;
1406       else			/* Shift left.  */
1407 	op2 <<= op1;
1408       _bfd_vms_push (abfd, (uquad) op2, -1);
1409       (*_bfd_error_handler)  (_("%s: not fully implemented"),
1410 			      tir_cmd_name (ptr[-1]));
1411       break;
1412 
1413     case TIR_S_C_OPR_ROT: /* Rotate.  */
1414       op1 = (long) _bfd_vms_pop (abfd, NULL);
1415       op2 = (long) _bfd_vms_pop (abfd, NULL);
1416       if (HIGHBIT (0))	/* Shift right.  */
1417 	op2 >>= op1;
1418       else		/* Shift left.  */
1419 	op2 <<= op1;
1420       _bfd_vms_push (abfd, (uquad) op2, -1);
1421       (*_bfd_error_handler)  (_("%s: not fully implemented"),
1422 			      tir_cmd_name (ptr[-1]));
1423       break;
1424 
1425     case TIR_S_C_OPR_SEL: /* Select.  */
1426       if ((long) _bfd_vms_pop (abfd, NULL) & 0x01L)
1427 	(void) _bfd_vms_pop (abfd, NULL);
1428       else
1429 	{
1430 	  op1 = (long) _bfd_vms_pop (abfd, NULL);
1431 	  (void) _bfd_vms_pop (abfd, NULL);
1432 	  _bfd_vms_push (abfd, (uquad) op1, -1);
1433 	}
1434       break;
1435 
1436     case TIR_S_C_OPR_REDEF: /* Redefine symbol to current location.  */
1437     case TIR_S_C_OPR_DFLIT: /* Define a literal.  */
1438       (*_bfd_error_handler) (_("%s: not supported"),
1439 			     tir_cmd_name (ptr[-1]));
1440       break;
1441 
1442     default:
1443       (*_bfd_error_handler) (_("reserved OPR cmd %d"), ptr[-1]);
1444       break;
1445     }
1446 
1447   return ptr;
1448 }
1449 
1450 /* Control commands
1451 
1452    See table 7-6 of the VAX/VMS linker manual.  */
1453 
1454 static unsigned char *
1455 tir_ctl (bfd * abfd, unsigned char *ptr)
1456 {
1457   unsigned long dummy;
1458   unsigned int psect;
1459 
1460 #if VMS_DEBUG
1461   _bfd_vms_debug (5, "tir_ctl %d\n", *ptr);
1462 #endif
1463 
1464   switch (*ptr++)
1465     {
1466     case TIR_S_C_CTL_SETRB:
1467       /* Set relocation base: pop stack, set image location counter
1468 	 arg: none.  */
1469       dummy = _bfd_vms_pop (abfd, (int *) &psect);
1470       if (psect >= PRIV (section_count))
1471 	alloc_section (abfd, psect);
1472       image_set_ptr (abfd, (int) psect, (uquad) dummy);
1473       break;
1474 
1475     case TIR_S_C_CTL_AUGRB:
1476       /* Augment relocation base: increment image location counter by offset
1477 	 arg: lw	offset value.  */
1478       dummy = bfd_getl32 (ptr);
1479       image_inc_ptr (abfd, (uquad) dummy);
1480       break;
1481 
1482     case TIR_S_C_CTL_DFLOC:
1483       /* Define location: pop index, save location counter under index
1484 	 arg: none.  */
1485       dummy = _bfd_vms_pop (abfd, NULL);
1486       (*_bfd_error_handler) (_("%s: not fully implemented"),
1487 			     tir_cmd_name (ptr[-1]));
1488       break;
1489 
1490     case TIR_S_C_CTL_STLOC:
1491       /* Set location: pop index, restore location counter from index
1492 	 arg: none.  */
1493       dummy = _bfd_vms_pop (abfd, (int *) &psect);
1494       (*_bfd_error_handler) (_("%s: not fully implemented"),
1495 			     tir_cmd_name (ptr[-1]));
1496       break;
1497 
1498     case TIR_S_C_CTL_STKDL:
1499       /* Stack defined location: pop index, push location counter from index
1500 	 arg: none.  */
1501       dummy = _bfd_vms_pop (abfd, (int *) &psect);
1502       (*_bfd_error_handler) (_("%s: not fully implemented"),
1503 			     tir_cmd_name (ptr[-1]));
1504       break;
1505 
1506     default:
1507       (*_bfd_error_handler) (_("reserved CTL cmd %d"), ptr[-1]);
1508       break;
1509     }
1510   return ptr;
1511 }
1512 
1513 /* Handle command from TIR section.  */
1514 
1515 static unsigned char *
1516 tir_cmd (bfd * abfd, unsigned char *ptr)
1517 {
1518   struct
1519   {
1520     int mincod;
1521     int maxcod;
1522     unsigned char * (*explain) (bfd *, unsigned char *);
1523   }
1524   tir_table[] =
1525   {
1526     { 0,		 TIR_S_C_MAXSTACOD, tir_sta },
1527     { TIR_S_C_MINSTOCOD, TIR_S_C_MAXSTOCOD, tir_sto },
1528     { TIR_S_C_MINOPRCOD, TIR_S_C_MAXOPRCOD, tir_opr },
1529     { TIR_S_C_MINCTLCOD, TIR_S_C_MAXCTLCOD, tir_ctl },
1530     { -1, -1, NULL }
1531   };
1532   int i = 0;
1533 
1534 #if VMS_DEBUG
1535   _bfd_vms_debug (4, "tir_cmd %d/%x\n", *ptr, *ptr);
1536   _bfd_hexdump (8, ptr, 16, (int) ptr);
1537 #endif
1538 
1539   if (*ptr & 0x80)
1540     {
1541       /* Store immediate.  */
1542       i = 128 - (*ptr++ & 0x7f);
1543       image_dump (abfd, ptr, i, 0);
1544       ptr += i;
1545     }
1546   else
1547     {
1548       while (tir_table[i].mincod >= 0)
1549 	{
1550 	  if ( (tir_table[i].mincod <= *ptr)
1551 	       && (*ptr <= tir_table[i].maxcod))
1552 	    {
1553 	      ptr = tir_table[i].explain (abfd, ptr);
1554 	      break;
1555 	    }
1556 	  i++;
1557 	}
1558       if (tir_table[i].mincod < 0)
1559 	{
1560 	  (*_bfd_error_handler) (_("obj code %d not found"), *ptr);
1561 	  ptr = 0;
1562 	}
1563     }
1564 
1565   return ptr;
1566 }
1567 
1568 /* Handle command from ETIR section.  */
1569 
1570 static int
1571 etir_cmd (bfd * abfd, int cmd, unsigned char *ptr)
1572 {
1573   static struct
1574   {
1575     int mincod;
1576     int maxcod;
1577     bfd_boolean (*explain) (bfd *, int, unsigned char *);
1578   }
1579   etir_table[] =
1580   {
1581     { ETIR_S_C_MINSTACOD, ETIR_S_C_MAXSTACOD, etir_sta },
1582     { ETIR_S_C_MINSTOCOD, ETIR_S_C_MAXSTOCOD, etir_sto },
1583     { ETIR_S_C_MINOPRCOD, ETIR_S_C_MAXOPRCOD, etir_opr },
1584     { ETIR_S_C_MINCTLCOD, ETIR_S_C_MAXCTLCOD, etir_ctl },
1585     { ETIR_S_C_MINSTCCOD, ETIR_S_C_MAXSTCCOD, etir_stc },
1586     { -1, -1, NULL }
1587   };
1588 
1589   int i = 0;
1590 
1591 #if VMS_DEBUG
1592   _bfd_vms_debug (4, "etir_cmd %d/%x\n", cmd, cmd);
1593   _bfd_hexdump (8, ptr, 16, (int) ptr);
1594 #endif
1595 
1596   while (etir_table[i].mincod >= 0)
1597     {
1598       if ( (etir_table[i].mincod <= cmd)
1599 	   && (cmd <= etir_table[i].maxcod))
1600 	{
1601 	  if (!etir_table[i].explain (abfd, cmd, ptr))
1602 	    return -1;
1603 	  break;
1604 	}
1605       i++;
1606     }
1607 
1608 #if VMS_DEBUG
1609   _bfd_vms_debug (4, "etir_cmd: = 0\n");
1610 #endif
1611   return 0;
1612 }
1613 
1614 /* Text Information and Relocation Records (OBJ$C_TIR)
1615    handle tir record.  */
1616 
1617 static int
1618 analyze_tir (bfd * abfd, unsigned char *ptr, unsigned int length)
1619 {
1620   unsigned char *maxptr;
1621 
1622 #if VMS_DEBUG
1623   _bfd_vms_debug (3, "analyze_tir: %d bytes\n", length);
1624 #endif
1625 
1626   maxptr = ptr + length;
1627 
1628   while (ptr < maxptr)
1629     {
1630       ptr = tir_cmd (abfd, ptr);
1631       if (ptr == 0)
1632 	return -1;
1633     }
1634 
1635   return 0;
1636 }
1637 
1638 /* Text Information and Relocation Records (EOBJ$C_ETIR)
1639    handle etir record.  */
1640 
1641 static int
1642 analyze_etir (bfd * abfd, unsigned char *ptr, unsigned int length)
1643 {
1644   int cmd;
1645   unsigned char *maxptr;
1646   int result = 0;
1647 
1648 #if VMS_DEBUG
1649   _bfd_vms_debug (3, "analyze_etir: %d bytes\n", length);
1650 #endif
1651 
1652   maxptr = ptr + length;
1653 
1654   while (ptr < maxptr)
1655     {
1656       cmd = bfd_getl16 (ptr);
1657       length = bfd_getl16 (ptr + 2);
1658       result = etir_cmd (abfd, cmd, ptr+4);
1659       if (result != 0)
1660 	break;
1661       ptr += length;
1662     }
1663 
1664 #if VMS_DEBUG
1665   _bfd_vms_debug (3, "analyze_etir: = %d\n", result);
1666 #endif
1667 
1668   return result;
1669 }
1670 
1671 /* Process ETIR record
1672    Return 0 on success, -1 on error.  */
1673 
1674 int
1675 _bfd_vms_slurp_tir (bfd * abfd, int objtype)
1676 {
1677   int result;
1678 
1679 #if VMS_DEBUG
1680   _bfd_vms_debug (2, "TIR/ETIR\n");
1681 #endif
1682 
1683   switch (objtype)
1684     {
1685     case EOBJ_S_C_ETIR:
1686       PRIV (vms_rec) += 4;	/* Skip type, size.  */
1687       PRIV (rec_size) -= 4;
1688       result = analyze_etir (abfd, PRIV (vms_rec), (unsigned) PRIV (rec_size));
1689       break;
1690     case OBJ_S_C_TIR:
1691       PRIV (vms_rec) += 1;	/* Skip type.  */
1692       PRIV (rec_size) -= 1;
1693       result = analyze_tir (abfd, PRIV (vms_rec), (unsigned) PRIV (rec_size));
1694       break;
1695     default:
1696       result = -1;
1697       break;
1698     }
1699 
1700   return result;
1701 }
1702 
1703 /* Process EDBG record
1704    Return 0 on success, -1 on error
1705 
1706    Not implemented yet.  */
1707 
1708 int
1709 _bfd_vms_slurp_dbg (bfd * abfd, int objtype ATTRIBUTE_UNUSED)
1710 {
1711 #if VMS_DEBUG
1712   _bfd_vms_debug (2, "DBG/EDBG\n");
1713 #endif
1714 
1715   abfd->flags |= (HAS_DEBUG | HAS_LINENO);
1716   return 0;
1717 }
1718 
1719 /* Process ETBT record
1720    Return 0 on success, -1 on error
1721 
1722    Not implemented yet.  */
1723 
1724 int
1725 _bfd_vms_slurp_tbt (bfd * abfd ATTRIBUTE_UNUSED,
1726 		    int objtype ATTRIBUTE_UNUSED)
1727 {
1728 #if VMS_DEBUG
1729   _bfd_vms_debug (2, "TBT/ETBT\n");
1730 #endif
1731 
1732   return 0;
1733 }
1734 
1735 /* Process LNK record
1736    Return 0 on success, -1 on error
1737 
1738    Not implemented yet.  */
1739 
1740 int
1741 _bfd_vms_slurp_lnk (bfd * abfd ATTRIBUTE_UNUSED,
1742 		    int objtype ATTRIBUTE_UNUSED)
1743 {
1744 #if VMS_DEBUG
1745   _bfd_vms_debug (2, "LNK\n");
1746 #endif
1747 
1748   return 0;
1749 }
1750 
1751 /* Start ETIR record for section #index at virtual addr offset.  */
1752 
1753 static void
1754 start_etir_record (bfd * abfd, int index, uquad offset, bfd_boolean justoffset)
1755 {
1756   if (!justoffset)
1757     {
1758       /* One ETIR per section.  */
1759       _bfd_vms_output_begin (abfd, EOBJ_S_C_ETIR, -1);
1760       _bfd_vms_output_push (abfd);
1761     }
1762 
1763   /* Push start offset.  */
1764   _bfd_vms_output_begin (abfd, ETIR_S_C_STA_PQ, -1);
1765   _bfd_vms_output_long (abfd, (unsigned long) index);
1766   _bfd_vms_output_quad (abfd, (uquad) offset);
1767   _bfd_vms_output_flush (abfd);
1768 
1769   /* Start = pop ().  */
1770   _bfd_vms_output_begin (abfd, ETIR_S_C_CTL_SETRB, -1);
1771   _bfd_vms_output_flush (abfd);
1772 }
1773 
1774 static void
1775 end_etir_record (bfd * abfd)
1776 {
1777   _bfd_vms_output_pop (abfd);
1778   _bfd_vms_output_end (abfd);
1779 }
1780 
1781 /* WRITE ETIR SECTION
1782 
1783    This is still under construction and therefore not documented.  */
1784 
1785 static void
1786 sto_imm (bfd * abfd, vms_section *sptr, bfd_vma vaddr, int index)
1787 {
1788   int size;
1789   int ssize;
1790   unsigned char *cptr;
1791 
1792 #if VMS_DEBUG
1793   _bfd_vms_debug (8, "sto_imm %d bytes\n", sptr->size);
1794   _bfd_hexdump (9, sptr->contents, (int) sptr->size, (int) vaddr);
1795 #endif
1796 
1797   ssize = sptr->size;
1798   cptr = sptr->contents;
1799 
1800   while (ssize > 0)
1801     {
1802       /* Try all the rest.  */
1803       size = ssize;
1804 
1805       if (_bfd_vms_output_check (abfd, size) < 0)
1806 	{
1807 	  /* Doesn't fit, split !  */
1808 	  end_etir_record (abfd);
1809 	  start_etir_record (abfd, index, vaddr, FALSE);
1810 	  /* Get max size.  */
1811 	  size = _bfd_vms_output_check (abfd, 0);
1812 	  /* More than what's left ?  */
1813 	  if (size > ssize)
1814 	    size = ssize;
1815 	}
1816 
1817       _bfd_vms_output_begin (abfd, ETIR_S_C_STO_IMM, -1);
1818       _bfd_vms_output_long (abfd, (unsigned long) (size));
1819       _bfd_vms_output_dump (abfd, cptr, size);
1820       _bfd_vms_output_flush (abfd);
1821 
1822 #if VMS_DEBUG
1823       _bfd_vms_debug (10, "dumped %d bytes\n", size);
1824       _bfd_hexdump (10, cptr, (int) size, (int) vaddr);
1825 #endif
1826 
1827       vaddr += size;
1828       ssize -= size;
1829       cptr += size;
1830     }
1831 }
1832 
1833 /* Write section contents for bfd abfd.  */
1834 
1835 int
1836 _bfd_vms_write_tir (bfd * abfd, int objtype ATTRIBUTE_UNUSED)
1837 {
1838   asection *section;
1839   vms_section *sptr;
1840   int nextoffset;
1841 
1842 #if VMS_DEBUG
1843   _bfd_vms_debug (2, "vms_write_tir (%p, %d)\n", abfd, objtype);
1844 #endif
1845 
1846   _bfd_vms_output_alignment (abfd, 4);
1847 
1848   nextoffset = 0;
1849   PRIV (vms_linkage_index) = 1;
1850 
1851   /* Dump all other sections.  */
1852   section = abfd->sections;
1853 
1854   while (section != NULL)
1855     {
1856 
1857 #if VMS_DEBUG
1858       _bfd_vms_debug (4, "writing %d. section '%s' (%d bytes)\n",
1859 		      section->index, section->name,
1860 		      (int) (section->size));
1861 #endif
1862 
1863       if (section->flags & SEC_RELOC)
1864 	{
1865 	  int i;
1866 
1867 	  if ((i = section->reloc_count) <= 0)
1868 	    (*_bfd_error_handler) (_("SEC_RELOC with no relocs in section %s"),
1869 				   section->name);
1870 #if VMS_DEBUG
1871 	  else
1872 	    {
1873 	      arelent **rptr;
1874 	      _bfd_vms_debug (4, "%d relocations:\n", i);
1875 	      rptr = section->orelocation;
1876 	      while (i-- > 0)
1877 		{
1878 		  _bfd_vms_debug (4, "sym %s in sec %s, value %08lx, addr %08lx, off %08lx, len %d: %s\n",
1879 				  (*(*rptr)->sym_ptr_ptr)->name,
1880 				  (*(*rptr)->sym_ptr_ptr)->section->name,
1881 				  (long) (*(*rptr)->sym_ptr_ptr)->value,
1882 				  (*rptr)->address, (*rptr)->addend,
1883 				  bfd_get_reloc_size ((*rptr)->howto),
1884 				  (*rptr)->howto->name);
1885 		  rptr++;
1886 		}
1887 	    }
1888 #endif
1889 	}
1890 
1891       if ((section->flags & SEC_HAS_CONTENTS)
1892 	  && (! bfd_is_com_section (section)))
1893 	{
1894 	  /* Virtual addr in section.  */
1895 	  bfd_vma vaddr;
1896 
1897 	  sptr = _bfd_get_vms_section (abfd, section->index);
1898 	  if (sptr == NULL)
1899 	    {
1900 	      bfd_set_error (bfd_error_no_contents);
1901 	      return -1;
1902 	    }
1903 
1904 	  vaddr = (bfd_vma) (sptr->offset);
1905 
1906 	  start_etir_record (abfd, section->index, (uquad) sptr->offset,
1907 			     FALSE);
1908 
1909 	  while (sptr != NULL)
1910 	    {
1911 	      /* One STA_PQ, CTL_SETRB per vms_section.  */
1912 	      if (section->flags & SEC_RELOC)
1913 		{
1914 		  /* Check for relocs.  */
1915 		  arelent **rptr = section->orelocation;
1916 		  int i = section->reloc_count;
1917 
1918 		  for (;;)
1919 		    {
1920 		      bfd_size_type addr = (*rptr)->address;
1921 		      bfd_size_type len = bfd_get_reloc_size ((*rptr)->howto);
1922 		      if (sptr->offset < addr)
1923 			{
1924 			  /* Sptr starts before reloc.  */
1925 			  bfd_size_type before = addr - sptr->offset;
1926 			  if (sptr->size <= before)
1927 			    {
1928 			      /* Complete before.  */
1929 			      sto_imm (abfd, sptr, vaddr, section->index);
1930 			      vaddr += sptr->size;
1931 			      break;
1932 			    }
1933 			  else
1934 			    {
1935 			      /* Partly before.  */
1936 			      int after = sptr->size - before;
1937 
1938 			      sptr->size = before;
1939 			      sto_imm (abfd, sptr, vaddr, section->index);
1940 			      vaddr += sptr->size;
1941 			      sptr->contents += before;
1942 			      sptr->offset += before;
1943 			      sptr->size = after;
1944 			    }
1945 			}
1946 		      else if (sptr->offset == addr)
1947 			{
1948 			  /* Sptr starts at reloc.  */
1949 			  asymbol *sym = *(*rptr)->sym_ptr_ptr;
1950 			  asection *sec = sym->section;
1951 
1952 			  switch ((*rptr)->howto->type)
1953 			    {
1954 			    case ALPHA_R_IGNORE:
1955 			      break;
1956 
1957 			    case ALPHA_R_REFLONG:
1958 			      {
1959 				if (bfd_is_und_section (sym->section))
1960 				  {
1961 				    int slen = strlen ((char *) sym->name);
1962 				    char *hash;
1963 
1964 				    if (_bfd_vms_output_check (abfd, slen) < 0)
1965 				      {
1966 					end_etir_record (abfd);
1967 					start_etir_record (abfd,
1968 							   section->index,
1969 							   vaddr, FALSE);
1970 				      }
1971 				    _bfd_vms_output_begin (abfd,
1972 							   ETIR_S_C_STO_GBL_LW,
1973 							   -1);
1974 				    hash = (_bfd_vms_length_hash_symbol
1975 					    (abfd, sym->name, EOBJ_S_C_SYMSIZ));
1976 				    _bfd_vms_output_counted (abfd, hash);
1977 				    _bfd_vms_output_flush (abfd);
1978 				  }
1979 				else if (bfd_is_abs_section (sym->section))
1980 				  {
1981 				    if (_bfd_vms_output_check (abfd, 16) < 0)
1982 				      {
1983 					end_etir_record (abfd);
1984 					start_etir_record (abfd,
1985 							   section->index,
1986 							   vaddr, FALSE);
1987 				      }
1988 				    _bfd_vms_output_begin (abfd,
1989 							   ETIR_S_C_STA_LW,
1990 							   -1);
1991 				    _bfd_vms_output_quad (abfd,
1992 							  (uquad) sym->value);
1993 				    _bfd_vms_output_flush (abfd);
1994 				    _bfd_vms_output_begin (abfd,
1995 							   ETIR_S_C_STO_LW,
1996 							   -1);
1997 				    _bfd_vms_output_flush (abfd);
1998 				  }
1999 				else
2000 				  {
2001 				    if (_bfd_vms_output_check (abfd, 32) < 0)
2002 				      {
2003 					end_etir_record (abfd);
2004 					start_etir_record (abfd,
2005 							   section->index,
2006 							   vaddr, FALSE);
2007 				      }
2008 				    _bfd_vms_output_begin (abfd,
2009 							   ETIR_S_C_STA_PQ,
2010 							   -1);
2011 				    _bfd_vms_output_long (abfd,
2012 							  (unsigned long) (sec->index));
2013 				    _bfd_vms_output_quad (abfd,
2014 							  ((uquad) (*rptr)->addend
2015 							   + (uquad) sym->value));
2016 				    _bfd_vms_output_flush (abfd);
2017 				    _bfd_vms_output_begin (abfd,
2018 							   ETIR_S_C_STO_LW,
2019 							   -1);
2020 				    _bfd_vms_output_flush (abfd);
2021 				  }
2022 			      }
2023 			      break;
2024 
2025 			    case ALPHA_R_REFQUAD:
2026 			      {
2027 				if (bfd_is_und_section (sym->section))
2028 				  {
2029 				    int slen = strlen ((char *) sym->name);
2030 				    char *hash;
2031 
2032 				    if (_bfd_vms_output_check (abfd, slen) < 0)
2033 				      {
2034 					end_etir_record (abfd);
2035 					start_etir_record (abfd,
2036 							   section->index,
2037 							   vaddr, FALSE);
2038 				      }
2039 				    _bfd_vms_output_begin (abfd,
2040 							   ETIR_S_C_STO_GBL,
2041 							   -1);
2042 				    hash = (_bfd_vms_length_hash_symbol
2043 					    (abfd, sym->name, EOBJ_S_C_SYMSIZ));
2044 				    _bfd_vms_output_counted (abfd, hash);
2045 				    _bfd_vms_output_flush (abfd);
2046 				  }
2047 				else if (bfd_is_abs_section (sym->section))
2048 				  {
2049 				    if (_bfd_vms_output_check (abfd, 16) < 0)
2050 				      {
2051 					end_etir_record (abfd);
2052 					start_etir_record (abfd,
2053 							   section->index,
2054 							   vaddr, FALSE);
2055 				      }
2056 				    _bfd_vms_output_begin (abfd,
2057 							   ETIR_S_C_STA_QW,
2058 							   -1);
2059 				    _bfd_vms_output_quad (abfd,
2060 							  (uquad) sym->value);
2061 				    _bfd_vms_output_flush (abfd);
2062 				    _bfd_vms_output_begin (abfd,
2063 							   ETIR_S_C_STO_QW,
2064 							   -1);
2065 				    _bfd_vms_output_flush (abfd);
2066 				  }
2067 				else
2068 				  {
2069 				    if (_bfd_vms_output_check (abfd, 32) < 0)
2070 				      {
2071 					end_etir_record (abfd);
2072 					start_etir_record (abfd,
2073 							   section->index,
2074 							   vaddr, FALSE);
2075 				      }
2076 				    _bfd_vms_output_begin (abfd,
2077 							   ETIR_S_C_STA_PQ,
2078 							   -1);
2079 				    _bfd_vms_output_long (abfd,
2080 							  (unsigned long) (sec->index));
2081 				    _bfd_vms_output_quad (abfd,
2082 							  ((uquad) (*rptr)->addend
2083 							   + (uquad) sym->value));
2084 				    _bfd_vms_output_flush (abfd);
2085 				    _bfd_vms_output_begin (abfd,
2086 							   ETIR_S_C_STO_OFF,
2087 							   -1);
2088 				    _bfd_vms_output_flush (abfd);
2089 				  }
2090 			      }
2091 			      break;
2092 
2093 			    case ALPHA_R_HINT:
2094 			      {
2095 				int hint_size;
2096 				char *hash ATTRIBUTE_UNUSED;
2097 
2098 				hint_size = sptr->size;
2099 				sptr->size = len;
2100 				sto_imm (abfd, sptr, vaddr, section->index);
2101 				sptr->size = hint_size;
2102 			      }
2103 			      break;
2104 			    case ALPHA_R_LINKAGE:
2105 			      {
2106 				char *hash;
2107 
2108 				if (_bfd_vms_output_check (abfd, 64) < 0)
2109 				  {
2110 				    end_etir_record (abfd);
2111 				    start_etir_record (abfd, section->index,
2112 						       vaddr, FALSE);
2113 				  }
2114 				_bfd_vms_output_begin (abfd,
2115 						       ETIR_S_C_STC_LP_PSB,
2116 						       -1);
2117 				_bfd_vms_output_long (abfd,
2118 						      (unsigned long) PRIV (vms_linkage_index));
2119 				PRIV (vms_linkage_index) += 2;
2120 				hash = (_bfd_vms_length_hash_symbol
2121 					(abfd, sym->name, EOBJ_S_C_SYMSIZ));
2122 				_bfd_vms_output_counted (abfd, hash);
2123 				_bfd_vms_output_byte (abfd, 0);
2124 				_bfd_vms_output_flush (abfd);
2125 			      }
2126 			      break;
2127 
2128 			    case ALPHA_R_CODEADDR:
2129 			      {
2130 				int slen = strlen ((char *) sym->name);
2131 				char *hash;
2132 				if (_bfd_vms_output_check (abfd, slen) < 0)
2133 				  {
2134 				    end_etir_record (abfd);
2135 				    start_etir_record (abfd,
2136 						       section->index,
2137 						       vaddr, FALSE);
2138 				  }
2139 				_bfd_vms_output_begin (abfd,
2140 						       ETIR_S_C_STO_CA,
2141 						       -1);
2142 				hash = (_bfd_vms_length_hash_symbol
2143 					(abfd, sym->name, EOBJ_S_C_SYMSIZ));
2144 				_bfd_vms_output_counted (abfd, hash);
2145 				_bfd_vms_output_flush (abfd);
2146 			      }
2147 			      break;
2148 
2149 			    default:
2150 			      (*_bfd_error_handler) (_("Unhandled relocation %s"),
2151 						     (*rptr)->howto->name);
2152 			      break;
2153 			    }
2154 
2155 			  vaddr += len;
2156 
2157 			  if (len == sptr->size)
2158 			    {
2159 			      break;
2160 			    }
2161 			  else
2162 			    {
2163 			      sptr->contents += len;
2164 			      sptr->offset += len;
2165 			      sptr->size -= len;
2166 			      i--;
2167 			      rptr++;
2168 			    }
2169 			}
2170 		      else
2171 			{
2172 			  /* Sptr starts after reloc.  */
2173 			  i--;
2174 			  /* Check next reloc.  */
2175 			  rptr++;
2176 			}
2177 
2178 		      if (i == 0)
2179 			{
2180 			  /* All reloc checked.  */
2181 			  if (sptr->size > 0)
2182 			    {
2183 			      /* Dump rest.  */
2184 			      sto_imm (abfd, sptr, vaddr, section->index);
2185 			      vaddr += sptr->size;
2186 			    }
2187 			  break;
2188 			}
2189 		    }
2190 		}
2191 	      else
2192 		{
2193 		  /* No relocs, just dump.  */
2194 		  sto_imm (abfd, sptr, vaddr, section->index);
2195 		  vaddr += sptr->size;
2196 		}
2197 
2198 	      sptr = sptr->next;
2199 	    }
2200 
2201 	  end_etir_record (abfd);
2202 	}
2203 
2204       section = section->next;
2205     }
2206 
2207   _bfd_vms_output_alignment (abfd, 2);
2208   return 0;
2209 }
2210 
2211 /* Write traceback data for bfd abfd.  */
2212 
2213 int
2214 _bfd_vms_write_tbt (bfd * abfd ATTRIBUTE_UNUSED,
2215 		    int objtype ATTRIBUTE_UNUSED)
2216 {
2217 #if VMS_DEBUG
2218   _bfd_vms_debug (2, "vms_write_tbt (%p, %d)\n", abfd, objtype);
2219 #endif
2220 
2221   return 0;
2222 }
2223 
2224 /* Write debug info for bfd abfd.  */
2225 
2226 int
2227 _bfd_vms_write_dbg (bfd * abfd ATTRIBUTE_UNUSED,
2228 		    int objtype ATTRIBUTE_UNUSED)
2229 {
2230 #if VMS_DEBUG
2231   _bfd_vms_debug (2, "vms_write_dbg (%p, objtype)\n", abfd, objtype);
2232 #endif
2233 
2234   return 0;
2235 }
2236