OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [gdb-5.0/] [bfd/] [vms-tir.c] - Blame information for rev 1783

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.