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