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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [insight/] [bfd/] [vms-tir.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

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