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