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