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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [gdb-7.1/] [bfd/] [vms-hdr.c] - Blame information for rev 856

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

Line No. Rev Author Line
1 227 jeremybenn
/* vms-hdr.c -- BFD back-end for VMS/VAX (openVMS/VAX) and
2
   EVAX (openVMS/Alpha) files.
3
   Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005, 2006,
4
   2007, 2008, 2009 Free Software Foundation, Inc.
5
 
6
   HDR record handling functions
7
   EMH record handling functions
8
 
9
   EOM record handling functions
10
   EEOM record handling functions
11
 
12
   IHD record handling functions
13
   EIHD record handling functions
14
 
15
   ISD record handling functions
16
   EISD record handling functions
17
 
18
   IHS record handling functions
19
   EIHS record handling functions
20
 
21
   DBG record handling functions
22
   EDBG record handling functions
23
 
24
   TBT record handling functions
25
   ETBT record handling functions
26
 
27
   DST/DMT section handling functions
28
 
29
   Written by Klaus K"ampf (kkaempf@rmi.de)
30
 
31
   This program is free software; you can redistribute it and/or modify
32
   it under the terms of the GNU General Public License as published by
33
   the Free Software Foundation; either version 3 of the License, or
34
   (at your option) any later version.
35
 
36
   This program is distributed in the hope that it will be useful,
37
   but WITHOUT ANY WARRANTY; without even the implied warranty of
38
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
39
   GNU General Public License for more details.
40
 
41
   You should have received a copy of the GNU General Public License
42
   along with this program; if not, write to the Free Software
43
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
44
   MA 02110-1301, USA.  */
45
 
46
#include "sysdep.h"
47
#include "bfd.h"
48
#include "bfdver.h"
49
#include "bfdlink.h"
50
#include "safe-ctype.h"
51
#include "libbfd.h"
52
 
53
#include "vms.h"
54
 
55
static struct module *new_module (bfd *);
56
static void parse_module
57
  (bfd *, struct module *, unsigned char *, unsigned int);
58
static struct module *build_module_list (bfd *);
59
static bfd_boolean module_find_nearest_line
60
  (bfd *, struct module *, bfd_vma, const char **, const char **,
61
   unsigned int *);
62
static int vms_slurp_debug (bfd *);
63
 
64
#define SET_MODULE_PARSED(m) \
65
  do { if ((m)->name == NULL) (m)->name = ""; } while (0)
66
#define IS_MODULE_PARSED(m) ((m)->name != NULL)
67
 
68
 
69
/* Read & process emh record
70
   return 0 on success, -1 on error.  */
71
 
72
int
73
_bfd_vms_slurp_hdr (bfd *abfd, int objtype)
74
{
75
  unsigned char *ptr;
76
  unsigned char *vms_rec;
77
  int subtype;
78
 
79
  vms_rec = PRIV(vms_rec);
80
 
81
#if VMS_DEBUG
82
  vms_debug(2, "HDR/EMH\n");
83
#endif
84
 
85
  switch (objtype)
86
    {
87
    case OBJ_S_C_HDR:
88
      subtype = vms_rec[1];
89
      break;
90
    case EOBJ_S_C_EMH:
91
      subtype = bfd_getl16 (vms_rec + 4) + EVAX_OFFSET;
92
      break;
93
    default:
94
      subtype = -1;
95
    }
96
 
97
#if VMS_DEBUG
98
  vms_debug(3, "subtype %d\n", subtype);
99
#endif
100
 
101
  switch (subtype)
102
    {
103
    case MHD_S_C_MHD:
104
      /* Module header.  */
105
      PRIV (hdr_data).hdr_b_strlvl = vms_rec[2];
106
      PRIV (hdr_data).hdr_l_recsiz = bfd_getl16 (vms_rec + 3);
107
      PRIV (hdr_data).hdr_t_name = _bfd_vms_save_counted_string (vms_rec + 5);
108
      ptr = vms_rec + 5 + vms_rec[5] + 1;
109
      PRIV (hdr_data).hdr_t_version = _bfd_vms_save_counted_string (ptr);
110
      ptr += *ptr + 1;
111
      PRIV (hdr_data).hdr_t_date = _bfd_vms_save_sized_string (ptr, 17);
112
      break;
113
 
114
    case MHD_S_C_LNM:
115
      PRIV (hdr_data).hdr_c_lnm = _bfd_vms_save_sized_string (vms_rec, PRIV (rec_size - 2));
116
      break;
117
 
118
    case MHD_S_C_SRC:
119
      PRIV (hdr_data).hdr_c_src = _bfd_vms_save_sized_string (vms_rec, PRIV (rec_size - 2));
120
      break;
121
 
122
    case MHD_S_C_TTL:
123
      PRIV (hdr_data).hdr_c_ttl = _bfd_vms_save_sized_string (vms_rec, PRIV (rec_size - 2));
124
      break;
125
 
126
    case EMH_S_C_MHD + EVAX_OFFSET:
127
      /* Module header.  */
128
      PRIV (hdr_data).hdr_b_strlvl = vms_rec[6];
129
      PRIV (hdr_data).hdr_l_arch1  = bfd_getl32 (vms_rec + 8);
130
      PRIV (hdr_data).hdr_l_arch2  = bfd_getl32 (vms_rec + 12);
131
      PRIV (hdr_data).hdr_l_recsiz = bfd_getl32 (vms_rec + 16);
132
      PRIV (hdr_data).hdr_t_name   = _bfd_vms_save_counted_string (vms_rec + 20);
133
      ptr = vms_rec + 20 + vms_rec[20] + 1;
134
      PRIV (hdr_data).hdr_t_version =_bfd_vms_save_counted_string (ptr);
135
      ptr += *ptr + 1;
136
      PRIV (hdr_data).hdr_t_date = _bfd_vms_save_sized_string (ptr, 17);
137
      break;
138
 
139
    case EMH_S_C_LNM + EVAX_OFFSET:
140
      PRIV (hdr_data).hdr_c_lnm = _bfd_vms_save_sized_string (vms_rec, PRIV (rec_size - 6));
141
      break;
142
 
143
    case EMH_S_C_SRC + EVAX_OFFSET:
144
      PRIV (hdr_data).hdr_c_src = _bfd_vms_save_sized_string (vms_rec, PRIV (rec_size - 6));
145
      break;
146
 
147
    case EMH_S_C_TTL + EVAX_OFFSET:
148
      PRIV (hdr_data).hdr_c_ttl = _bfd_vms_save_sized_string (vms_rec, PRIV (rec_size - 6));
149
      break;
150
 
151
    case MHD_S_C_CPR:
152
    case MHD_S_C_MTC:
153
    case MHD_S_C_GTX:
154
    case EMH_S_C_CPR + EVAX_OFFSET:
155
    case EMH_S_C_MTC + EVAX_OFFSET:
156
    case EMH_S_C_GTX + EVAX_OFFSET:
157
      break;
158
 
159
    default:
160
      bfd_set_error (bfd_error_wrong_format);
161
      return -1;
162
    }
163
 
164
  return 0;
165
}
166
 
167
/* Output routines.  */
168
 
169
/* Manufacture a VMS like time on a unix based system.
170
   stolen from obj-vms.c.  */
171
 
172
static unsigned char *
173
get_vms_time_string (void)
174
{
175
  static unsigned char tbuf[18];
176
#ifndef VMS
177
#include <time.h>
178
 
179
  char *pnt;
180
  time_t timeb;
181
 
182
  time (& timeb);
183
  pnt = ctime (&timeb);
184
  pnt[3] = 0;
185
  pnt[7] = 0;
186
  pnt[10] = 0;
187
  pnt[16] = 0;
188
  pnt[24] = 0;
189
  sprintf ((char *) tbuf, "%2s-%3s-%s %s",
190
           pnt + 8, pnt + 4, pnt + 20, pnt + 11);
191
#else
192
#include <starlet.h>
193
  struct
194
  {
195
    int Size;
196
    unsigned char *Ptr;
197
  } Descriptor;
198
  Descriptor.Size = 17;
199
  Descriptor.Ptr = tbuf;
200
  SYS$ASCTIM (0, &Descriptor, 0, 0);
201
#endif /* not VMS */
202
 
203
#if VMS_DEBUG
204
  vms_debug (6, "vmstimestring:'%s'\n", tbuf);
205
#endif
206
 
207
  return tbuf;
208
}
209
 
210
/* Write object header for bfd abfd.  */
211
 
212
int
213
_bfd_vms_write_hdr (bfd *abfd, int objtype)
214
{
215
  asymbol *symbol;
216
  unsigned int symnum;
217
  int had_case = 0;
218
  int had_file = 0;
219
  char version [256];
220
 
221
#if VMS_DEBUG
222
  vms_debug (2, "vms_write_hdr (%p)\n", abfd);
223
#endif
224
 
225
  _bfd_vms_output_alignment (abfd, 2);
226
 
227
  /* MHD.  */
228
  if (objtype != OBJ_S_C_HDR)
229
    {
230
      _bfd_vms_output_begin (abfd, EOBJ_S_C_EMH, EMH_S_C_MHD);
231
      _bfd_vms_output_short (abfd, EOBJ_S_C_STRLVL);
232
      _bfd_vms_output_long (abfd, 0);
233
      _bfd_vms_output_long (abfd, 0);
234
      _bfd_vms_output_long (abfd, MAX_OUTREC_SIZE);
235
    }
236
 
237
  /* Create module name from filename.  */
238
  if (bfd_get_filename (abfd) != 0)
239
    {
240
      /* Strip path and suffix information.  */
241
      char *fname, *fout, *fptr;
242
 
243
      fptr = bfd_get_filename (abfd);
244
      fname = strdup (fptr);
245
 
246
      /* Strip VMS path.  */
247
      fout = strrchr (fname, ']');
248
      if (fout == NULL)
249
        fout = strchr (fname, ':');
250
      if (fout != NULL)
251
        fout++;
252
      else
253
        fout = fname;
254
 
255
      /* Strip UNIX path.  */
256
      fptr = strrchr (fout, '/');
257
      if (fptr != NULL)
258
        fout = fptr + 1;
259
 
260
      /* Strip suffix.  */
261
      fptr = strrchr (fout, '.');
262
      if (fptr != 0)
263
        *fptr = 0;
264
 
265
      /* Convert to upper case and truncate at 31 characters.
266
         (VMS object file format restricts module name length to 31).  */
267
      fptr = fout;
268
      while (*fptr != 0)
269
        {
270
          *fptr = TOUPPER (*fptr);
271
          fptr++;
272
          if (*fptr == ';' || (fptr - fout) >= 31)
273
            *fptr = 0;
274
        }
275
      _bfd_vms_output_counted (abfd, fout);
276
      free (fname);
277
    }
278
  else
279
    _bfd_vms_output_counted (abfd, "NONAME");
280
 
281
  _bfd_vms_output_counted (abfd, BFD_VERSION_STRING);
282
  _bfd_vms_output_dump (abfd, get_vms_time_string (), EMH_DATE_LENGTH);
283
  _bfd_vms_output_fill (abfd, 0, EMH_DATE_LENGTH);
284
  _bfd_vms_output_flush (abfd);
285
 
286
  /* LMN.  */
287
  _bfd_vms_output_begin (abfd, EOBJ_S_C_EMH, EMH_S_C_LNM);
288
  snprintf (version, sizeof (version), "GAS BFD v%s", BFD_VERSION_STRING);
289
  _bfd_vms_output_dump (abfd, (unsigned char *)version, strlen (version));
290
  _bfd_vms_output_flush (abfd);
291
 
292
  /* SRC.  */
293
  _bfd_vms_output_begin (abfd, EOBJ_S_C_EMH, EMH_S_C_SRC);
294
 
295
  for (symnum = 0; symnum < abfd->symcount; symnum++)
296
    {
297
      symbol = abfd->outsymbols[symnum];
298
 
299
      if (symbol->flags & BSF_FILE)
300
        {
301
          if (CONST_STRNEQ ((char *)symbol->name, "<CASE:"))
302
            {
303
              PRIV (flag_hash_long_names) = symbol->name[6] - '0';
304
              PRIV (flag_show_after_trunc) = symbol->name[7] - '0';
305
 
306
              if (had_file)
307
                break;
308
              had_case = 1;
309
              continue;
310
            }
311
 
312
          _bfd_vms_output_dump (abfd, (unsigned char *) symbol->name,
313
                                (int) strlen (symbol->name));
314
          if (had_case)
315
            break;
316
          had_file = 1;
317
        }
318
    }
319
 
320
  if (symnum == abfd->symcount)
321
    _bfd_vms_output_dump (abfd, (unsigned char *) STRING_COMMA_LEN ("noname"));
322
 
323
  _bfd_vms_output_flush (abfd);
324
 
325
  /* TTL.  */
326
  _bfd_vms_output_begin (abfd, EOBJ_S_C_EMH, EMH_S_C_TTL);
327
  _bfd_vms_output_dump (abfd, (unsigned char *) STRING_COMMA_LEN ("TTL"));
328
  _bfd_vms_output_flush (abfd);
329
 
330
  /* CPR.  */
331
  _bfd_vms_output_begin (abfd, EOBJ_S_C_EMH, EMH_S_C_CPR);
332
  _bfd_vms_output_dump (abfd,
333
                         (unsigned char *)"GNU BFD ported by Klaus Kämpf 1994-1996",
334
                         39);
335
  _bfd_vms_output_flush (abfd);
336
 
337
  return 0;
338
}
339
 
340
/* Process EOM/EEOM record
341
   return 0 on success, -1 on error.  */
342
 
343
int
344
_bfd_vms_slurp_eom (bfd *abfd, int objtype)
345
{
346
  unsigned char *vms_rec;
347
 
348
#if VMS_DEBUG
349
  vms_debug(2, "EOM/EEOM\n");
350
#endif
351
 
352
  vms_rec = PRIV (vms_rec);
353
 
354
  if ((objtype == OBJ_S_C_EOM)
355
     || (objtype == OBJ_S_C_EOMW))
356
    {
357
    }
358
  else
359
    {
360
      PRIV (eom_data).eom_l_total_lps
361
        = bfd_getl32 (vms_rec + EEOM_S_L_TOTAL_LPS);
362
      PRIV (eom_data).eom_w_comcod = bfd_getl16 (vms_rec + EEOM_S_W_COMCOD);
363
      if (PRIV (eom_data).eom_w_comcod > 1)
364
        {
365
          (*_bfd_error_handler) (_("Object module NOT error-free !\n"));
366
          bfd_set_error (bfd_error_bad_value);
367
          return -1;
368
        }
369
      PRIV (eom_data).eom_has_transfer = FALSE;
370
      if (PRIV (rec_size) > 10)
371
        {
372
           PRIV (eom_data).eom_has_transfer = TRUE;
373
           PRIV (eom_data).eom_b_tfrflg = vms_rec[EEOM_S_B_TFRFLG];
374
           PRIV (eom_data).eom_l_psindx
375
             = bfd_getl32 (vms_rec + EEOM_S_L_PSINDX);
376
           PRIV (eom_data).eom_l_tfradr
377
             = bfd_getl32 (vms_rec + EEOM_S_L_TFRADR);
378
 
379
           abfd->start_address = PRIV (eom_data).eom_l_tfradr;
380
        }
381
    }
382
  return 0;
383
}
384
 
385
/* Write eom record for bfd abfd.  */
386
 
387
int
388
_bfd_vms_write_eom (bfd *abfd, int objtype)
389
{
390
#if VMS_DEBUG
391
  vms_debug (2, "vms_write_eom (%p, %d)\n", abfd, objtype);
392
#endif
393
 
394
  _bfd_vms_output_begin (abfd, objtype, -1);
395
  _bfd_vms_output_long (abfd, (unsigned long) (PRIV (vms_linkage_index) >> 1));
396
  _bfd_vms_output_byte (abfd, 0);        /* Completion code.  */
397
  _bfd_vms_output_byte (abfd, 0);        /* Fill byte.  */
398
 
399
  if (bfd_get_start_address (abfd) != (bfd_vma)-1)
400
    {
401
      asection *section;
402
 
403
      section = bfd_get_section_by_name (abfd, ".link");
404
      if (section == 0)
405
        {
406
          bfd_set_error (bfd_error_nonrepresentable_section);
407
          return -1;
408
        }
409
      _bfd_vms_output_short (abfd, 0);
410
      _bfd_vms_output_long (abfd, (unsigned long) (section->index));
411
      _bfd_vms_output_long (abfd,
412
                             (unsigned long) bfd_get_start_address (abfd));
413
      _bfd_vms_output_long (abfd, 0);
414
    }
415
 
416
  _bfd_vms_output_end (abfd);
417
  return 0;
418
}
419
 
420
/* Read & process IHD/EIHD record.
421
   Return 0 on success, -1 on error  */
422
int
423
_bfd_vms_slurp_ihd (bfd *abfd, unsigned int *isd_offset,
424
                    unsigned int *ihs_offset)
425
{
426
  unsigned int imgtype, size;
427
  bfd_vma symvva;
428
 
429
#if VMS_DEBUG
430
  vms_debug (8, "_bfd_vms_slurp_ihd\n");
431
#endif
432
 
433
  size = bfd_getl32 (PRIV (vms_rec) + EIHD_S_L_SIZE);
434
  imgtype = bfd_getl32 (PRIV (vms_rec) + EIHD_S_L_IMGTYPE);
435
 
436
  if (imgtype == EIHD_S_K_EXE)
437
    abfd->flags |= EXEC_P;
438
 
439
  symvva = bfd_getl64 (PRIV (vms_rec) + EIHD_S_Q_SYMVVA);
440
  if (symvva != 0)
441
    {
442
      PRIV (symvva) = symvva;
443
      abfd->flags |= DYNAMIC;
444
    }
445
 
446
  *isd_offset = bfd_getl32 (PRIV (vms_rec) + EIHD_S_L_ISDOFF);
447
  *ihs_offset = bfd_getl32 (PRIV (vms_rec) + EIHD_S_L_SYMDBGOFF);
448
 
449
#if VMS_DEBUG
450
  vms_debug (4, "EIHD record size %d imgtype %d symvva 0x%llx isd %d ihs %d\n",
451
             size, imgtype, symvva, *isd_offset, *ihs_offset);
452
#endif
453
 
454
  return 0;
455
}
456
 
457
/* Read & process ISD/EISD record
458
   return 0 on success, -1 on error  */
459
 
460
int
461
_bfd_vms_slurp_isd (bfd *abfd, unsigned int offset)
462
{
463
  int section_count = 0;
464
  unsigned char *p;
465
  unsigned int rec_size;
466
 
467
#if VMS_DEBUG
468
  vms_debug (8, "_bfd_vms_slurp_isd\n");
469
#endif
470
 
471
  for (p = PRIV (vms_rec) + offset;
472
       (rec_size = bfd_getl32 (p + EISD_S_L_EISDSIZE)) != 0;
473
       p += rec_size)
474
    {
475
      unsigned long long vaddr = bfd_getl64 (p + EISD_S_Q_VIR_ADDR);
476
      unsigned int size = bfd_getl32 (p + EISD_S_L_SECSIZE);
477
      unsigned int flags = bfd_getl32 (p + EISD_S_L_FLAGS);
478
      unsigned int vbn = bfd_getl32 (p + EISD_S_L_VBN);
479
      char *name = NULL;
480
      asection *section;
481
      flagword bfd_flags;
482
 
483
#if VMS_DEBUG
484
      vms_debug (4, "EISD record at 0x%x size 0x%x addr 0x%x bfd_flags 0x%x block %d\n",
485
                 p - PRIV (vms_rec), size, vaddr, flags, vbn);
486
#endif
487
 
488
      /* VMS combines psects from .obj files into isects in the .exe.  This
489
         process doesn't preserve enough information to reliably determine
490
         what's in each section without examining the data.  This is
491
         especially true of DWARF debug sections.  */
492
      bfd_flags = SEC_ALLOC;
493
 
494
      if (flags & EISD_S_M_EXE)
495
        bfd_flags |= SEC_CODE | SEC_HAS_CONTENTS | SEC_LOAD;
496
 
497
      if (flags & EISD_S_M_NONSHRADR)
498
        bfd_flags |= SEC_DATA | SEC_HAS_CONTENTS | SEC_LOAD;
499
 
500
      if (!(flags & EISD_S_M_WRT))
501
        bfd_flags |= SEC_READONLY;
502
 
503
      if (flags & EISD_S_M_DZRO)
504
        bfd_flags |= SEC_DATA;
505
 
506
      if (flags & EISD_S_M_FIXUPVEC)
507
        bfd_flags |= SEC_DATA | SEC_HAS_CONTENTS | SEC_LOAD;
508
 
509
      if (flags & EISD_S_M_CRF)
510
        bfd_flags |= SEC_HAS_CONTENTS | SEC_LOAD;
511
 
512
      if (flags & EISD_S_M_GBL)
513
        {
514
          name = _bfd_vms_save_counted_string (p + EISD_S_T_GBLNAM);
515
          bfd_flags |= SEC_COFF_SHARED_LIBRARY;
516
          bfd_flags &= ~(SEC_ALLOC | SEC_LOAD);
517
        }
518
      else
519
        {
520
          name = (char*) bfd_alloc (abfd, 32);
521
          sprintf (name, "$LOCAL_%03d$", section_count++);
522
        }
523
 
524
      section = bfd_make_section (abfd, name);
525
 
526
      if (!section)
527
        return -1;
528
 
529
      section->filepos = vbn ? VMS_BLOCK_SIZE * (vbn - 1) : (unsigned int)-1;
530
      section->size = size;
531
      section->vma = vaddr;
532
 
533
      if (!bfd_set_section_flags (abfd, section, bfd_flags))
534
        return -1;
535
    }
536
 
537
  return 0;
538
}
539
 
540
/* Read & process IHS/EIHS record
541
   return 0 on success, -1 on error  */
542
int
543
_bfd_vms_slurp_ihs (bfd *abfd, unsigned int offset)
544
{
545
  unsigned char *p = PRIV (vms_rec) + offset;
546
  unsigned int gstvbn = bfd_getl32 (p + EIHS_S_L_GSTVBN);
547
  unsigned int gstsize ATTRIBUTE_UNUSED = bfd_getl32 (p + EIHS_S_L_GSTSIZE);
548
  unsigned int dstvbn = bfd_getl32 (p + EIHS_S_L_DSTVBN);
549
  unsigned int dstsize = bfd_getl32 (p + EIHS_S_L_DSTSIZE);
550
  unsigned int dmtvbn = bfd_getl32 (p + EIHS_S_L_DMTVBN);
551
  unsigned int dmtbytes = bfd_getl32 (p + EIHS_S_L_DMTBYTES);
552
  asection *section;
553
 
554
#if VMS_DEBUG
555
  vms_debug (8, "_bfd_vms_slurp_ihs\n");
556
  vms_debug (4, "EIHS record gstvbn %d gstsize %d dstvbn %d dstsize %d dmtvbn %d dmtbytes %d\n",
557
             gstvbn, gstsize, dstvbn, dstsize, dmtvbn, dmtbytes);
558
#endif
559
 
560
  if (dstvbn)
561
    {
562
      flagword bfd_flags = SEC_HAS_CONTENTS | SEC_DEBUGGING;
563
 
564
      section = bfd_make_section (abfd, "$DST$");
565
      if (!section)
566
        return -1;
567
 
568
      section->size = dstsize;
569
      section->filepos = VMS_BLOCK_SIZE * (dstvbn - 1);
570
 
571
      if (!bfd_set_section_flags (abfd, section, bfd_flags))
572
        return -1;
573
 
574
      PRIV (dst_section) = section;
575
      abfd->flags |= (HAS_DEBUG | HAS_LINENO);
576
    }
577
 
578
  if (dmtvbn)
579
    {
580
      flagword bfd_flags = SEC_HAS_CONTENTS | SEC_DEBUGGING;
581
 
582
      section = bfd_make_section (abfd, "$DMT$");
583
      if (!section)
584
        return -1;
585
 
586
      section->size = dmtbytes;
587
      section->filepos = VMS_BLOCK_SIZE * (dmtvbn - 1);
588
 
589
      if (!bfd_set_section_flags (abfd, section, bfd_flags))
590
        return -1;
591
    }
592
 
593
  if (gstvbn)
594
    {
595
      flagword bfd_flags = SEC_HAS_CONTENTS;
596
 
597
      section = bfd_make_section (abfd, "$GST$");
598
      if (!section)
599
        return -1;
600
 
601
      if (bfd_seek (abfd, VMS_BLOCK_SIZE * (gstvbn - 1), SEEK_SET))
602
        {
603
          bfd_set_error (bfd_error_file_truncated);
604
          return -1;
605
        }
606
 
607
      if (_bfd_vms_slurp_object_records (abfd) != 0)
608
        return -1;
609
 
610
      section->filepos = VMS_BLOCK_SIZE * (gstvbn - 1);
611
      section->size = bfd_tell (abfd) - section->filepos;
612
 
613
      if (!bfd_set_section_flags (abfd, section, bfd_flags))
614
        return -1;
615
 
616
      abfd->flags |= HAS_SYMS;
617
    }
618
 
619
  return 0;
620
}
621
 
622
/* Build a new module for the specified BFD.  */
623
 
624
static struct module *
625
new_module (bfd *abfd)
626
{
627
  struct module *module
628
    = (struct module *) bfd_zalloc (abfd, sizeof (struct module));
629
  module->file_table_count = 16; /* Arbitrary.  */
630
  module->file_table
631
    = bfd_malloc (module->file_table_count * sizeof (struct fileinfo));
632
  return module;
633
}
634
 
635
/* Parse debug info for a module and internalize it.  */
636
 
637
static void
638
parse_module (bfd *abfd, struct module *module, unsigned char *ptr,
639
              unsigned int length)
640
{
641
  unsigned char *maxptr = ptr + length, *src_ptr, *pcl_ptr;
642
  unsigned int prev_linum = 0, curr_linenum = 0;
643
  bfd_vma prev_pc = 0, curr_pc = 0;
644
  struct srecinfo *curr_srec, *srec;
645
  struct lineinfo *curr_line, *line;
646
  struct funcinfo *funcinfo;
647
 
648
  /* Initialize tables with zero element.  */
649
  curr_srec = (struct srecinfo *) bfd_zalloc (abfd, sizeof (struct srecinfo));
650
  module->srec_table = curr_srec;
651
 
652
  curr_line = (struct lineinfo *) bfd_zalloc (abfd, sizeof (struct lineinfo));
653
  module->line_table = curr_line;
654
 
655
  while (ptr < maxptr)
656
    {
657
      /* The first byte is not counted in the recorded length.  */
658
      int rec_length = bfd_getl16 (ptr) + 1;
659
      int rec_type = bfd_getl16 (ptr + 2);
660
 
661
#if VMS_DEBUG
662
      _bfd_vms_debug (2, "DST record: length %d, type %d\n",
663
                      rec_length, rec_type);
664
#endif
665
 
666
      switch (rec_type)
667
        {
668
        case DST_S_C_MODBEG:
669
          module->name
670
            = _bfd_vms_save_counted_string (ptr + DST_S_B_MODBEG_NAME);
671
 
672
          curr_pc = 0;
673
          prev_pc = 0;
674
          curr_linenum = 0;
675
          prev_linum = 0;
676
 
677
#if VMS_DEBUG
678
          _bfd_vms_debug (3, "module: %s\n", module->name);
679
#endif
680
          break;
681
 
682
        case DST_S_C_MODEND:
683
#if VMS_DEBUG
684
          _bfd_vms_debug (3, "end module\n");
685
#endif
686
          break;
687
 
688
        case DST_S_C_RTNBEG:
689
          funcinfo = (struct funcinfo *)
690
            bfd_zalloc (abfd, sizeof (struct funcinfo));
691
          funcinfo->name
692
            = _bfd_vms_save_counted_string (ptr + DST_S_B_RTNBEG_NAME);
693
          funcinfo->low = bfd_getl32 (ptr + DST_S_L_RTNBEG_ADDRESS);
694
          funcinfo->next = module->func_table;
695
          module->func_table = funcinfo;
696
 
697
#if VMS_DEBUG
698
          _bfd_vms_debug (3, "routine: %s at 0x%x\n",
699
                          funcinfo->name, funcinfo->low);
700
#endif
701
          break;
702
 
703
        case DST_S_C_RTNEND:
704
          module->func_table->high = module->func_table->low
705
            + bfd_getl32 (ptr + DST_S_L_RTNEND_SIZE) - 1;
706
 
707
          if (module->func_table->high > module->high)
708
            module->high = module->func_table->high;
709
 
710
#if VMS_DEBUG
711
          _bfd_vms_debug (3, "end routine\n");
712
#endif
713
          break;
714
 
715
        case DST_S_C_PROLOG:
716
#if VMS_DEBUG
717
          _bfd_vms_debug (3, "prologue\n");
718
#endif
719
          break;
720
 
721
        case DST_S_C_EPILOG:
722
#if VMS_DEBUG
723
          _bfd_vms_debug (3, "epilog\n");
724
#endif
725
          break;
726
 
727
        case DST_S_C_BLKBEG:
728
#if VMS_DEBUG
729
          _bfd_vms_debug (3, "block\n");
730
#endif
731
          break;
732
 
733
        case DST_S_C_BLKEND:
734
#if VMS_DEBUG
735
          _bfd_vms_debug (3, "end block\n");
736
#endif
737
          break;
738
 
739
        case DST_S_C_SOURCE:
740
          src_ptr = ptr + DST_S_C_SOURCE_HEADER_SIZE;
741
 
742
#if VMS_DEBUG
743
          _bfd_vms_debug (3, "source info\n");
744
#endif
745
 
746
          while (src_ptr < ptr + rec_length)
747
            {
748
              int cmd = src_ptr[0], cmd_length, data;
749
 
750
              switch (cmd)
751
                {
752
                case DST_S_C_SRC_DECLFILE:
753
                  {
754
                    unsigned int fileid
755
                      = bfd_getl16 (src_ptr + DST_S_W_SRC_DF_FILEID);
756
                    char *filename
757
                      = _bfd_vms_save_counted_string (src_ptr
758
                          + DST_S_B_SRC_DF_FILENAME);
759
 
760
                    while (fileid >= module->file_table_count)
761
                      {
762
                        module->file_table_count *= 2;
763
                        module->file_table
764
                          = bfd_realloc (module->file_table,
765
                                         module->file_table_count
766
                                           * sizeof (struct fileinfo));
767
                      }
768
 
769
                    module->file_table [fileid].name = filename;
770
                    module->file_table [fileid].srec = 1;
771
                    cmd_length = src_ptr[DST_S_B_SRC_DF_LENGTH] + 2;
772
#if VMS_DEBUG
773
                    _bfd_vms_debug (4, "DST_S_C_SRC_DECLFILE: %d, %s\n",
774
                                    fileid,
775
                                    module->file_table [fileid].name);
776
#endif
777
                  }
778
                  break;
779
 
780
                case DST_S_C_SRC_DEFLINES_B:
781
                  /* Perform the association and set the next higher index
782
                     to the limit.  */
783
                  data = src_ptr[DST_S_B_SRC_UNSBYTE];
784
                  srec = (struct srecinfo *)
785
                    bfd_zalloc (abfd, sizeof (struct srecinfo));
786
                  srec->line = curr_srec->line + data;
787
                  srec->srec = curr_srec->srec + data;
788
                  srec->sfile = curr_srec->sfile;
789
                  curr_srec->next = srec;
790
                  curr_srec = srec;
791
                  cmd_length = 2;
792
#if VMS_DEBUG
793
                  _bfd_vms_debug (4, "DST_S_C_SRC_DEFLINES_B: %d\n", data);
794
#endif
795
                  break;
796
 
797
                case DST_S_C_SRC_DEFLINES_W:
798
                  /* Perform the association and set the next higher index
799
                     to the limit.  */
800
                  data = bfd_getl16 (src_ptr + DST_S_W_SRC_UNSWORD);
801
                  srec = (struct srecinfo *)
802
                    bfd_zalloc (abfd, sizeof (struct srecinfo));
803
                  srec->line = curr_srec->line + data;
804
                  srec->srec = curr_srec->srec + data,
805
                  srec->sfile = curr_srec->sfile;
806
                  curr_srec->next = srec;
807
                  curr_srec = srec;
808
                  cmd_length = 3;
809
#if VMS_DEBUG
810
                  _bfd_vms_debug (4, "DST_S_C_SRC_DEFLINES_W: %d\n", data);
811
#endif
812
                  break;
813
 
814
                case DST_S_C_SRC_INCRLNUM_B:
815
                  data = src_ptr[DST_S_B_SRC_UNSBYTE];
816
                  curr_srec->line += data;
817
                  cmd_length = 2;
818
#if VMS_DEBUG
819
                  _bfd_vms_debug (4, "DST_S_C_SRC_INCRLNUM_B: %d\n", data);
820
#endif
821
                  break;
822
 
823
                case DST_S_C_SRC_SETFILE:
824
                  data = bfd_getl16 (src_ptr + DST_S_W_SRC_UNSWORD);
825
                  curr_srec->sfile = data;
826
                  curr_srec->srec = module->file_table[data].srec;
827
                  cmd_length = 3;
828
#if VMS_DEBUG
829
                  _bfd_vms_debug (4, "DST_S_C_SRC_SETFILE: %d\n", data);
830
#endif
831
                  break;
832
 
833
                case DST_S_C_SRC_SETLNUM_L:
834
                  data = bfd_getl32 (src_ptr + DST_S_L_SRC_UNSLONG);
835
                  curr_srec->line = data;
836
                  cmd_length = 5;
837
#if VMS_DEBUG
838
                  _bfd_vms_debug (4, "DST_S_C_SRC_SETLNUM_L: %d\n", data);
839
#endif
840
                  break;
841
 
842
                case DST_S_C_SRC_SETLNUM_W:
843
                  data = bfd_getl16 (src_ptr + DST_S_W_SRC_UNSWORD);
844
                  curr_srec->line = data;
845
                  cmd_length = 3;
846
#if VMS_DEBUG
847
                  _bfd_vms_debug (4, "DST_S_C_SRC_SETLNUM_W: %d\n", data);
848
#endif
849
                  break;
850
 
851
                case DST_S_C_SRC_SETREC_L:
852
                  data = bfd_getl32 (src_ptr + DST_S_L_SRC_UNSLONG);
853
                  curr_srec->srec = data;
854
                  module->file_table[curr_srec->sfile].srec = data;
855
                  cmd_length = 5;
856
#if VMS_DEBUG
857
                  _bfd_vms_debug (4, "DST_S_C_SRC_SETREC_L: %d\n", data);
858
#endif
859
                  break;
860
 
861
                case DST_S_C_SRC_SETREC_W:
862
                  data = bfd_getl16 (src_ptr + DST_S_W_SRC_UNSWORD);
863
                  curr_srec->srec = data;
864
                  module->file_table[curr_srec->sfile].srec = data;
865
                  cmd_length = 3;
866
#if VMS_DEBUG
867
                  _bfd_vms_debug (4, "DST_S_C_SRC_SETREC_W: %d\n", data);
868
#endif
869
                  break;
870
 
871
                case DST_S_C_SRC_FORMFEED:
872
                  cmd_length = 1;
873
#if VMS_DEBUG
874
                  _bfd_vms_debug (4, "DST_S_C_SRC_FORMFEED\n");
875
#endif
876
                  break;
877
 
878
                default:
879
                  (*_bfd_error_handler) (_("unknown source command %d"),
880
                                         cmd);
881
                  cmd_length = 2;
882
                  break;
883
                }
884
 
885
              src_ptr += cmd_length;
886
            }
887
          break;
888
 
889
        case DST_S_C_LINE_NUM:
890
          pcl_ptr = ptr + DST_S_C_LINE_NUM_HEADER_SIZE;
891
 
892
#if VMS_DEBUG
893
          _bfd_vms_debug (3, "line info\n");
894
#endif
895
 
896
          while (pcl_ptr < ptr + rec_length)
897
            {
898
              /* The command byte is signed so we must sign-extend it.  */
899
              int cmd = ((signed char *)pcl_ptr)[0], cmd_length, data;
900
 
901
              switch (cmd)
902
                {
903
                case DST_S_C_DELTA_PC_W:
904
                  data = bfd_getl16 (pcl_ptr + DST_S_W_PCLINE_UNSWORD);
905
                  curr_pc += data;
906
                  curr_linenum += 1;
907
                  cmd_length = 3;
908
#if VMS_DEBUG
909
                  _bfd_vms_debug (4, "DST_S_C_DELTA_PC_W: %d\n", data);
910
#endif
911
                  break;
912
 
913
                case DST_S_C_DELTA_PC_L:
914
                  data = bfd_getl32 (pcl_ptr + DST_S_L_PCLINE_UNSLONG);
915
                  curr_pc += data;
916
                  curr_linenum += 1;
917
                  cmd_length = 5;
918
#if VMS_DEBUG
919
                  _bfd_vms_debug (4, "DST_S_C_DELTA_PC_L: %d\n", data);
920
#endif
921
                  break;
922
 
923
                case DST_S_C_INCR_LINUM:
924
                  data = pcl_ptr[DST_S_B_PCLINE_UNSBYTE];
925
                  curr_linenum += data;
926
                  cmd_length = 2;
927
#if VMS_DEBUG
928
                  _bfd_vms_debug (4, "DST_S_C_INCR_LINUM: %d\n", data);
929
#endif
930
                  break;
931
 
932
                case DST_S_C_INCR_LINUM_W:
933
                  data = bfd_getl16 (pcl_ptr + DST_S_W_PCLINE_UNSWORD);
934
                  curr_linenum += data;
935
                  cmd_length = 3;
936
#if VMS_DEBUG
937
                  _bfd_vms_debug (4, "DST_S_C_INCR_LINUM_W: %d\n", data);
938
#endif
939
                  break;
940
 
941
                case DST_S_C_INCR_LINUM_L:
942
                  data = bfd_getl32 (pcl_ptr + DST_S_L_PCLINE_UNSLONG);
943
                  curr_linenum += data;
944
                  cmd_length = 5;
945
#if VMS_DEBUG
946
                  _bfd_vms_debug (4, "DST_S_C_INCR_LINUM_L: %d\n", data);
947
#endif
948
                  break;
949
 
950
                case DST_S_C_SET_LINUM_INCR:
951
                  (*_bfd_error_handler)
952
                    (_("DST_S_C_SET_LINUM_INCR not implemented"));
953
                  cmd_length = 2;
954
                  break;
955
 
956
                case DST_S_C_SET_LINUM_INCR_W:
957
                  (*_bfd_error_handler)
958
                    (_("DST_S_C_SET_LINUM_INCR_W not implemented"));
959
                  cmd_length = 3;
960
                  break;
961
 
962
                case DST_S_C_RESET_LINUM_INCR:
963
                  (*_bfd_error_handler)
964
                    (_("DST_S_C_RESET_LINUM_INCR not implemented"));
965
                  cmd_length = 1;
966
                  break;
967
 
968
                case DST_S_C_BEG_STMT_MODE:
969
                  (*_bfd_error_handler)
970
                    (_("DST_S_C_BEG_STMT_MODE not implemented"));
971
                  cmd_length = 1;
972
                  break;
973
 
974
                case DST_S_C_END_STMT_MODE:
975
                  (*_bfd_error_handler)
976
                    (_("DST_S_C_END_STMT_MODE not implemented"));
977
                  cmd_length = 1;
978
                  break;
979
 
980
                case DST_S_C_SET_LINUM_B:
981
                  data = pcl_ptr[DST_S_B_PCLINE_UNSBYTE];
982
                  curr_linenum = data;
983
                  cmd_length = 2;
984
#if VMS_DEBUG
985
                  _bfd_vms_debug (4, "DST_S_C_SET_LINUM_B: %d\n", data);
986
#endif
987
                  break;
988
 
989
                case DST_S_C_SET_LINE_NUM:
990
                  data = bfd_getl16 (pcl_ptr + DST_S_W_PCLINE_UNSWORD);
991
                  curr_linenum = data;
992
                  cmd_length = 3;
993
#if VMS_DEBUG
994
                  _bfd_vms_debug (4, "DST_S_C_SET_LINE_NUM: %d\n", data);
995
#endif
996
                  break;
997
 
998
                case DST_S_C_SET_LINUM_L:
999
                  data = bfd_getl32 (pcl_ptr + DST_S_L_PCLINE_UNSLONG);
1000
                  curr_linenum = data;
1001
                  cmd_length = 5;
1002
#if VMS_DEBUG
1003
                  _bfd_vms_debug (4, "DST_S_C_SET_LINUM_L: %d\n", data);
1004
#endif
1005
                  break;
1006
 
1007
                case DST_S_C_SET_PC:
1008
                  (*_bfd_error_handler)
1009
                    (_("DST_S_C_SET_PC not implemented"));
1010
                  cmd_length = 2;
1011
                  break;
1012
 
1013
                case DST_S_C_SET_PC_W:
1014
                  (*_bfd_error_handler)
1015
                    (_("DST_S_C_SET_PC_W not implemented"));
1016
                  cmd_length = 3;
1017
                  break;
1018
 
1019
                case DST_S_C_SET_PC_L:
1020
                  (*_bfd_error_handler)
1021
                    (_("DST_S_C_SET_PC_L not implemented"));
1022
                  cmd_length = 5;
1023
                  break;
1024
 
1025
                case DST_S_C_SET_STMTNUM:
1026
                  (*_bfd_error_handler)
1027
                    (_("DST_S_C_SET_STMTNUM not implemented"));
1028
                  cmd_length = 2;
1029
                  break;
1030
 
1031
                case DST_S_C_TERM:
1032
                  data = pcl_ptr[DST_S_B_PCLINE_UNSBYTE];
1033
                  curr_pc += data;
1034
                  cmd_length = 2;
1035
#if VMS_DEBUG
1036
                  _bfd_vms_debug (4, "DST_S_C_TERM: %d\n", data);
1037
#endif
1038
                  break;
1039
 
1040
                case DST_S_C_TERM_W:
1041
                  data = bfd_getl16 (pcl_ptr + DST_S_W_PCLINE_UNSWORD);
1042
                  curr_pc += data;
1043
                  cmd_length = 3;
1044
#if VMS_DEBUG
1045
                  _bfd_vms_debug (4, "DST_S_C_TERM_W: %d\n", data);
1046
#endif
1047
                  break;
1048
 
1049
                case DST_S_C_TERM_L:
1050
                  data = bfd_getl32 (pcl_ptr + DST_S_L_PCLINE_UNSLONG);
1051
                  curr_pc += data;
1052
                  cmd_length = 5;
1053
#if VMS_DEBUG
1054
                  _bfd_vms_debug (4, "DST_S_C_TERM_L: %d\n", data);
1055
#endif
1056
                  break;
1057
 
1058
                case DST_S_C_SET_ABS_PC:
1059
                  data = bfd_getl32 (pcl_ptr + DST_S_L_PCLINE_UNSLONG);
1060
                  curr_pc = data;
1061
                  cmd_length = 5;
1062
#if VMS_DEBUG
1063
                  _bfd_vms_debug (4, "DST_S_C_SET_ABS_PC: 0x%x\n", data);
1064
#endif
1065
                  break;
1066
 
1067
                default:
1068
                  if (cmd <= 0)
1069
                    {
1070
                      curr_pc -= cmd;
1071
                      curr_linenum += 1;
1072
                      cmd_length = 1;
1073
#if VMS_DEBUG
1074
                      _bfd_vms_debug (4, "bump pc to 0x%llx and line to %d\n",
1075
                                      curr_pc, curr_linenum);
1076
#endif
1077
                    }
1078
                  else
1079
                    {
1080
                      (*_bfd_error_handler) (_("unknown line command %d"),
1081
                                             cmd);
1082
                      cmd_length = 2;
1083
                    }
1084
                  break;
1085
                }
1086
 
1087
              if ((curr_linenum != prev_linum && curr_pc != prev_pc)
1088
                  || cmd <= 0
1089
                  || cmd == DST_S_C_DELTA_PC_L
1090
                  || cmd == DST_S_C_DELTA_PC_W)
1091
                {
1092
                  line = (struct lineinfo *)
1093
                    bfd_zalloc (abfd, sizeof (struct lineinfo));
1094
                  line->address = curr_pc;
1095
                  line->line = curr_linenum;
1096
 
1097
                  curr_line->next = line;
1098
                  curr_line = line;
1099
 
1100
                  prev_linum = curr_linenum;
1101
                  prev_pc = curr_pc;
1102
#if VMS_DEBUG
1103
                  _bfd_vms_debug (4, "-> correlate pc 0x%llx with line %d\n",
1104
                                  curr_pc, curr_linenum);
1105
#endif
1106
                }
1107
 
1108
              pcl_ptr += cmd_length;
1109
            }
1110
          break;
1111
 
1112
        case 0x17: /* Undocumented type used by DEC C to declare equates.  */
1113
#if VMS_DEBUG
1114
          _bfd_vms_debug (3, "undocumented type 0x17\n");
1115
#endif
1116
          break;
1117
 
1118
        default:
1119
#if VMS_DEBUG
1120
          _bfd_vms_debug (3, "ignoring record\n");
1121
#endif
1122
          break;
1123
 
1124
        }
1125
 
1126
      ptr += rec_length;
1127
    }
1128
 
1129
  /* Finalize tables with EOL marker.  */
1130
  srec = (struct srecinfo *) bfd_zalloc (abfd, sizeof (struct srecinfo));
1131
  srec->line = (unsigned int) -1;
1132
  srec->srec = (unsigned int) -1;
1133
  curr_srec->next = srec;
1134
 
1135
  line = (struct lineinfo *) bfd_zalloc (abfd, sizeof (struct lineinfo));
1136
  line->line = (unsigned int) -1;
1137
  line->address = (bfd_vma) -1;
1138
  curr_line->next = line;
1139
 
1140
  /* Advertise that this module has been parsed.  This is needed
1141
     because parsing can be either performed at module creation
1142
     or deferred until debug info is consumed.  */
1143
  SET_MODULE_PARSED (module);
1144
}
1145
 
1146
/* Build the list of modules for the specified BFD.  */
1147
 
1148
static struct module *
1149
build_module_list (bfd *abfd)
1150
{
1151
  struct module *module, *list = NULL;
1152
  asection *dmt;
1153
 
1154
  if ((dmt = bfd_get_section_by_name (abfd, "$DMT$")))
1155
    {
1156
      /* We have a DMT section so this must be an image.  Parse the
1157
         section and build the list of modules.  This is sufficient
1158
         since we can compute the start address and the end address
1159
         of every module from the section contents.  */
1160
      bfd_size_type size = bfd_get_section_size (dmt);
1161
      unsigned char *ptr, *end;
1162
 
1163
      ptr = (unsigned char *) bfd_alloc (abfd, size);
1164
      if (! ptr)
1165
        return NULL;
1166
 
1167
      if (! bfd_get_section_contents (abfd, dmt, ptr, 0, size))
1168
        return NULL;
1169
 
1170
#if VMS_DEBUG
1171
      _bfd_vms_debug (2, "DMT\n");
1172
#endif
1173
 
1174
      end = ptr + size;
1175
 
1176
      while (ptr < end)
1177
        {
1178
          /* Each header declares a module with its start offset and size
1179
             of debug info in the DST section, as well as the count of
1180
             program sections (i.e. address spans) it contains.  */
1181
          int modbeg = bfd_getl32 (ptr + DBG_S_L_DMT_MODBEG);
1182
          int msize = bfd_getl32 (ptr + DBG_S_L_DST_SIZE);
1183
          int count = bfd_getl16 (ptr + DBG_S_W_DMT_PSECT_COUNT);
1184
          ptr += DBG_S_C_DMT_HEADER_SIZE;
1185
 
1186
#if VMS_DEBUG
1187
          _bfd_vms_debug (3, "module: modbeg = %d, size = %d, count = %d\n",
1188
                          modbeg, msize, count);
1189
#endif
1190
 
1191
          /* We create a 'module' structure for each program section since
1192
             we only support contiguous addresses in a 'module' structure.
1193
             As a consequence, the actual debug info in the DST section is
1194
             shared and can be parsed multiple times; that doesn't seem to
1195
             cause problems in practice.  */
1196
          while (count-- > 0)
1197
            {
1198
              int start = bfd_getl32 (ptr + DBG_S_L_DMT_PSECT_START);
1199
              int length = bfd_getl32 (ptr + DBG_S_L_DMT_PSECT_LENGTH);
1200
              module = new_module (abfd);
1201
              module->modbeg = modbeg;
1202
              module->size = msize;
1203
              module->low = start;
1204
              module->high = start + length;
1205
              module->next = list;
1206
              list = module;
1207
              ptr += DBG_S_C_DMT_PSECT_SIZE;
1208
 
1209
#if VMS_DEBUG
1210
              _bfd_vms_debug (4, "section: start = 0x%x, length = %d\n",
1211
                              start, length);
1212
#endif
1213
            }
1214
        }
1215
    }
1216
  else
1217
    {
1218
      /* We don't have a DMT section so this must be an object.  Parse
1219
         the module right now in order to compute its start address and
1220
         end address.  */
1221
      module = new_module (abfd);
1222
      parse_module (abfd, module, PRIV (dst_section)->contents,
1223
                    PRIV (dst_ptr_end) - PRIV (dst_section)->contents);
1224
      list = module;
1225
    }
1226
 
1227
  return list;
1228
}
1229
 
1230
/* Calculate and return the name of the source file and the line nearest
1231
   to the wanted location in the specified module.  */
1232
 
1233
static bfd_boolean
1234
module_find_nearest_line (bfd *abfd, struct module *module, bfd_vma addr,
1235
                          const char **file, const char **func,
1236
                          unsigned int *line)
1237
{
1238
  struct funcinfo *funcinfo;
1239
  struct lineinfo *lineinfo;
1240
  struct srecinfo *srecinfo;
1241
  bfd_boolean ret = FALSE;
1242
 
1243
  /* Parse this module if that was not done at module creation.  */
1244
  if (! IS_MODULE_PARSED (module))
1245
    {
1246
      unsigned int size = module->size;
1247
      unsigned int modbeg = PRIV (dst_section)->filepos + module->modbeg;
1248
      unsigned char *buffer = (unsigned char *) bfd_malloc (module->size);
1249
 
1250
      if (bfd_seek (abfd, modbeg, SEEK_SET) != 0
1251
          || bfd_bread (buffer, size, abfd) != size)
1252
        {
1253
          bfd_set_error (bfd_error_no_debug_section);
1254
          return FALSE;
1255
        }
1256
 
1257
      parse_module (abfd, module, buffer, size);
1258
      free (buffer);
1259
    }
1260
 
1261
  /* Find out the function (if any) that contains the address.  */
1262
  for (funcinfo = module->func_table; funcinfo; funcinfo = funcinfo->next)
1263
    if (addr >= funcinfo->low && addr <= funcinfo->high)
1264
      {
1265
        *func = funcinfo->name;
1266
        ret = TRUE;
1267
        break;
1268
      }
1269
 
1270
  /* Find out the source file and the line nearest to the address.  */
1271
  for (lineinfo = module->line_table; lineinfo; lineinfo = lineinfo->next)
1272
    if (lineinfo->next && addr < lineinfo->next->address)
1273
      {
1274
        for (srecinfo = module->srec_table; srecinfo; srecinfo = srecinfo->next)
1275
          if (srecinfo->next && lineinfo->line < srecinfo->next->line)
1276
            {
1277
              if (srecinfo->sfile > 0)
1278
                {
1279
                  *file = module->file_table[srecinfo->sfile].name;
1280
                  *line = srecinfo->srec + lineinfo->line - srecinfo->line;
1281
                }
1282
              else
1283
                {
1284
                  *file = module->name;
1285
                  *line = lineinfo->line;
1286
                }
1287
              return TRUE;
1288
            }
1289
 
1290
        break;
1291
      }
1292
 
1293
  return ret;
1294
}
1295
 
1296
/* Provided a BFD, a section and an offset into the section, calculate and
1297
   return the name of the source file and the line nearest to the wanted
1298
   location.  */
1299
 
1300
bfd_boolean
1301
_bfd_vms_find_nearest_dst_line (bfd *abfd, asection *section,
1302
                                asymbol **symbols ATTRIBUTE_UNUSED,
1303
                                bfd_vma offset, const char **file,
1304
                                const char **func, unsigned int *line)
1305
{
1306
  struct module *module;
1307
 
1308
  /* What address are we looking for?  */
1309
  bfd_vma addr = section->vma + offset;
1310
 
1311
  *file = NULL;
1312
  *func = NULL;
1313
  *line = 0;
1314
 
1315
  if (PRIV (dst_section) == NULL)
1316
    return FALSE;
1317
 
1318
  if (PRIV (modules) == NULL)
1319
    {
1320
      PRIV (modules) = build_module_list (abfd);
1321
      if (PRIV (modules) == NULL)
1322
        return FALSE;
1323
    }
1324
 
1325
  for (module = PRIV (modules); module; module = module->next)
1326
    if (addr >= module->low && addr <= module->high)
1327
      return module_find_nearest_line (abfd, module, addr, file, func, line);
1328
 
1329
  return FALSE;
1330
}
1331
 
1332
/* Process EDBG/ETBT record.
1333
   Return 0 on success, -1 on error  */
1334
 
1335
static int
1336
vms_slurp_debug (bfd *abfd)
1337
{
1338
  if (PRIV (dst_section) == NULL)
1339
    {
1340
      /* We have no way to find out beforehand how much debug info there
1341
         is in an object file, so pick an initial amount and grow it as
1342
         needed later.  */
1343
      flagword flags = SEC_HAS_CONTENTS | SEC_DEBUGGING | SEC_RELOC;
1344
      asection *section = bfd_make_section (abfd, "$DST$");
1345
      if (!section)
1346
        return -1;
1347
      section->size = 1024;
1348
      if (!bfd_set_section_flags (abfd, section, flags))
1349
        return -1;
1350
      section->contents = ((unsigned char *)
1351
                           bfd_zmalloc (section->size));
1352
      if (section->contents == NULL)
1353
        return -1;
1354
      section->filepos = (unsigned int)-1;
1355
      PRIV (dst_section) = section;
1356
    }
1357
 
1358
  PRIV (image_section) = PRIV (dst_section);
1359
  PRIV (image_ptr) = PRIV (dst_section)->contents;
1360
 
1361
  return _bfd_vms_slurp_tir (abfd, EOBJ_S_C_ETIR);
1362
}
1363
 
1364
/* Process DBG/EDBG record.
1365
   Return 0 on success, -1 on error.  */
1366
 
1367
int
1368
_bfd_vms_slurp_dbg (bfd *abfd, int objtype ATTRIBUTE_UNUSED)
1369
{
1370
#if VMS_DEBUG
1371
  _bfd_vms_debug (2, "DBG/EDBG\n");
1372
#endif
1373
 
1374
  abfd->flags |= (HAS_DEBUG | HAS_LINENO);
1375
 
1376
  return vms_slurp_debug (abfd);
1377
}
1378
 
1379
/* Process TBT/ETBT record.
1380
   Return 0 on success, -1 on error.  */
1381
 
1382
int
1383
_bfd_vms_slurp_tbt (bfd *abfd, int objtype ATTRIBUTE_UNUSED)
1384
{
1385
#if VMS_DEBUG
1386
  _bfd_vms_debug (2, "TBT/ETBT\n");
1387
#endif
1388
 
1389
  abfd->flags |= HAS_LINENO;
1390
 
1391
  return vms_slurp_debug (abfd);
1392
}
1393
 
1394
/* Write DBG/EDBG record.  */
1395
 
1396
int
1397
_bfd_vms_write_dbg (bfd *abfd ATTRIBUTE_UNUSED, int objtype ATTRIBUTE_UNUSED)
1398
{
1399
#if VMS_DEBUG
1400
  _bfd_vms_debug (2, "vms_write_dbg (%p, %d)\n", abfd, objtype);
1401
#endif
1402
 
1403
  return 0;
1404
}
1405
 
1406
/* Write TBT/ETBT record.  */
1407
 
1408
int
1409
_bfd_vms_write_tbt (bfd *abfd ATTRIBUTE_UNUSED, int objtype ATTRIBUTE_UNUSED)
1410
{
1411
#if VMS_DEBUG
1412
  _bfd_vms_debug (2, "vms_write_tbt (%p, %d)\n", abfd, objtype);
1413
#endif
1414
 
1415
  return 0;
1416
}

powered by: WebSVN 2.1.0

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