Coverage Report

Created: 2025-07-08 11:15

/src/binutils-gdb/gas/dwarf2dbg.c
Line
Count
Source (jump to first uncovered line)
1
/* dwarf2dbg.c - DWARF2 debug support
2
   Copyright (C) 1999-2025 Free Software Foundation, Inc.
3
   Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
4
5
   This file is part of GAS, the GNU Assembler.
6
7
   GAS is free software; you can redistribute it and/or modify
8
   it under the terms of the GNU General Public License as published by
9
   the Free Software Foundation; either version 3, or (at your option)
10
   any later version.
11
12
   GAS is distributed in the hope that it will be useful,
13
   but WITHOUT ANY WARRANTY; without even the implied warranty of
14
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
   GNU General Public License for more details.
16
17
   You should have received a copy of the GNU General Public License
18
   along with GAS; see the file COPYING.  If not, write to the Free
19
   Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
20
   02110-1301, USA.  */
21
22
/* Logical line numbers can be controlled by the compiler via the
23
   following directives:
24
25
  .file FILENO "file.c"
26
  .loc  FILENO LINENO [COLUMN] [basic_block] [prologue_end] \
27
        [epilogue_begin] [is_stmt VALUE] [isa VALUE] \
28
        [discriminator VALUE] [view VALUE]
29
*/
30
31
#include "as.h"
32
#include "safe-ctype.h"
33
#include <limits.h>
34
#include "dwarf2dbg.h"
35
#include <filenames.h>
36
37
#ifdef HAVE_DOS_BASED_FILE_SYSTEM
38
/* We need to decide which character to use as a directory separator.
39
   Just because HAVE_DOS_BASED_FILE_SYSTEM is defined, it does not
40
   necessarily mean that the backslash character is the one to use.
41
   Some environments, eg Cygwin, can support both naming conventions.
42
   So we use the heuristic that we only need to use the backslash if
43
   the path is an absolute path starting with a DOS style drive
44
   selector.  eg C: or D:  */
45
# define INSERT_DIR_SEPARATOR(string, offset) \
46
  do \
47
    { \
48
      if (offset > 1 \
49
    && string[0] != 0 \
50
    && string[1] == ':') \
51
       string [offset] = '\\'; \
52
      else \
53
       string [offset] = '/'; \
54
    } \
55
  while (0)
56
#else
57
0
# define INSERT_DIR_SEPARATOR(string, offset) string[offset] = '/'
58
#endif
59
60
#ifndef DWARF2_FORMAT
61
0
# define DWARF2_FORMAT(SEC) dwarf2_format_32bit
62
#endif
63
64
#ifndef DWARF2_ADDR_SIZE
65
# define DWARF2_ADDR_SIZE(bfd) (bfd_arch_bits_per_address (bfd) / 8)
66
#endif
67
68
#ifndef DWARF2_FILE_NAME
69
0
#define DWARF2_FILE_NAME(FILENAME, DIRNAME) FILENAME
70
#endif
71
72
#ifndef DWARF2_FILE_TIME_NAME
73
0
#define DWARF2_FILE_TIME_NAME(FILENAME,DIRNAME) -1
74
#endif
75
76
#ifndef DWARF2_FILE_SIZE_NAME
77
0
#define DWARF2_FILE_SIZE_NAME(FILENAME,DIRNAME) -1
78
#endif
79
80
#ifndef DWARF2_VERSION
81
0
#define DWARF2_VERSION dwarf_level
82
#endif
83
84
/* The .debug_aranges version has been 2 in DWARF version 2, 3 and 4. */
85
#ifndef DWARF2_ARANGES_VERSION
86
0
#define DWARF2_ARANGES_VERSION 2
87
#endif
88
89
/* The .debug_line version is the same as the .debug_info version.  */
90
#ifndef DWARF2_LINE_VERSION
91
0
#define DWARF2_LINE_VERSION DWARF2_VERSION
92
#endif
93
94
/* The .debug_rnglists has only been in DWARF version 5. */
95
#ifndef DWARF2_RNGLISTS_VERSION
96
0
#define DWARF2_RNGLISTS_VERSION 5
97
#endif
98
99
#include "subsegs.h"
100
101
#include "dwarf2.h"
102
103
/* Since we can't generate the prolog until the body is complete, we
104
   use three different subsegments for .debug_line: one holding the
105
   prolog, one for the directory and filename info, and one for the
106
   body ("statement program").  */
107
#define DL_PROLOG 0
108
#define DL_FILES  1
109
#define DL_BODY   2
110
111
/* If linker relaxation might change offsets in the code, the DWARF special
112
   opcodes and variable-length operands cannot be used.  If this macro is
113
   nonzero, use the DW_LNS_fixed_advance_pc opcode instead.  */
114
#ifndef DWARF2_USE_FIXED_ADVANCE_PC
115
0
# define DWARF2_USE_FIXED_ADVANCE_PC  linkrelax
116
#endif
117
118
/* First special line opcode - leave room for the standard opcodes.
119
   Note: If you want to change this, you'll have to update the
120
   "standard_opcode_lengths" table that is emitted below in
121
   out_debug_line().  */
122
0
#define DWARF2_LINE_OPCODE_BASE   (DWARF2_LINE_VERSION == 2 ? 10 : 13)
123
124
#ifndef DWARF2_LINE_BASE
125
  /* Minimum line offset in a special line info. opcode.  This value
126
     was chosen to give a reasonable range of values.  */
127
0
# define DWARF2_LINE_BASE   -5
128
#endif
129
130
/* Range of line offsets in a special line info. opcode.  */
131
#ifndef DWARF2_LINE_RANGE
132
0
# define DWARF2_LINE_RANGE    14
133
#endif
134
135
#ifndef DWARF2_LINE_MIN_INSN_LENGTH
136
  /* Define the architecture-dependent minimum instruction length (in
137
     bytes).  This value should be rather too small than too big.  */
138
0
# define DWARF2_LINE_MIN_INSN_LENGTH  1
139
#endif
140
141
/* Flag that indicates the initial value of the is_stmt_start flag.  */
142
0
#define DWARF2_LINE_DEFAULT_IS_STMT 1
143
144
#ifndef DWARF2_LINE_MAX_OPS_PER_INSN
145
0
#define DWARF2_LINE_MAX_OPS_PER_INSN  1
146
#endif
147
148
/* Given a special op, return the line skip amount.  */
149
#define SPECIAL_LINE(op) \
150
  (((op) - DWARF2_LINE_OPCODE_BASE)%DWARF2_LINE_RANGE + DWARF2_LINE_BASE)
151
152
/* Given a special op, return the address skip amount (in units of
153
   DWARF2_LINE_MIN_INSN_LENGTH.  */
154
0
#define SPECIAL_ADDR(op) (((op) - DWARF2_LINE_OPCODE_BASE)/DWARF2_LINE_RANGE)
155
156
/* The maximum address skip amount that can be encoded with a special op.  */
157
0
#define MAX_SPECIAL_ADDR_DELTA    SPECIAL_ADDR(255)
158
159
#ifndef TC_PARSE_CONS_RETURN_NONE
160
#define TC_PARSE_CONS_RETURN_NONE BFD_RELOC_NONE
161
#endif
162
163
0
#define GAS_ABBREV_COMP_UNIT 1
164
0
#define GAS_ABBREV_SUBPROG   2
165
0
#define GAS_ABBREV_NO_TYPE   3
166
167
struct line_entry
168
{
169
  struct line_entry *next;
170
  symbolS *label;
171
  struct dwarf2_line_info loc;
172
};
173
174
/* Given line_entry list HEAD and PTAIL pointers, return a pointer to
175
   the last line_entry on the list.  */
176
static inline struct line_entry *
177
line_entry_at_tail (void *head, struct line_entry **ptail)
178
0
{
179
  /* If the list is empty ptail points at head.  */
180
0
  if (head == NULL)
181
0
    return NULL;
182
  /* Otherwise ptail points to line_entry.next of the last entry.  */
183
0
  void *p = (char *) ptail - offsetof (struct line_entry, next);
184
0
  return p;
185
0
}
186
187
struct line_subseg
188
{
189
  struct line_subseg *next;
190
  subsegT subseg;
191
  struct line_entry *head;
192
  struct line_entry **ptail;
193
  struct line_entry **pmove_tail;
194
};
195
196
struct line_seg
197
{
198
  struct line_seg *next;
199
  segT seg;
200
  struct line_subseg *head;
201
  symbolS *text_start;
202
  symbolS *text_end;
203
};
204
205
/* Collects data for all line table entries during assembly.  */
206
static struct line_seg *all_segs;
207
static struct line_seg **last_seg_ptr;
208
209
0
#define NUM_MD5_BYTES       16
210
211
struct file_entry
212
{
213
  const char *   filename;
214
  unsigned int   dir;
215
  unsigned char  md5[NUM_MD5_BYTES];
216
};
217
218
/* Table of files used by .debug_line.  */
219
static struct file_entry *files;
220
static unsigned int files_in_use;
221
static unsigned int files_allocated;
222
223
/* Table of directories used by .debug_line.  */
224
static char **       dirs;
225
static unsigned int  dirs_in_use;
226
static unsigned int  dirs_allocated;
227
228
/* TRUE when we've seen a .loc directive recently.  Used to avoid
229
   doing work when there's nothing to do.  Will be reset by
230
   dwarf2_consume_line_info.  */
231
bool dwarf2_loc_directive_seen;
232
233
/* TRUE when we've seen any .loc directive at any time during parsing.
234
   Indicates the user wants us to generate a .debug_line section.
235
   Used in dwarf2_finish as sanity check.  */
236
static bool dwarf2_any_loc_directive_seen;
237
238
/* TRUE when we're supposed to set the basic block mark whenever a
239
   label is seen.  */
240
bool dwarf2_loc_mark_labels;
241
242
/* Current location as indicated by the most recent .loc directive.  */
243
static struct dwarf2_line_info current;
244
245
/* This symbol is used to recognize view number forced resets in loc
246
   lists.  */
247
static symbolS *force_reset_view;
248
249
/* This symbol evaluates to an expression that, if nonzero, indicates
250
   some view assert check failed.  */
251
static symbolS *view_assert_failed;
252
253
/* The size of an address on the target.  */
254
static unsigned int sizeof_address;
255

256
#ifndef TC_DWARF2_EMIT_OFFSET
257
0
#define TC_DWARF2_EMIT_OFFSET  generic_dwarf2_emit_offset
258
259
/* Create an offset to .dwarf2_*.  */
260
261
static void
262
generic_dwarf2_emit_offset (symbolS *symbol, unsigned int size)
263
0
{
264
0
  expressionS exp;
265
266
0
  memset (&exp, 0, sizeof exp);
267
0
  exp.X_op = O_symbol;
268
0
  exp.X_add_symbol = symbol;
269
0
  exp.X_add_number = 0;
270
0
  emit_expr (&exp, size);
271
0
}
272
#endif
273
274
/* Find or create (if CREATE_P) an entry for SEG+SUBSEG in ALL_SEGS.  */
275
276
static struct line_subseg *
277
get_line_subseg (segT seg, subsegT subseg, bool create_p)
278
0
{
279
0
  struct line_seg *s = seg_info (seg)->dwarf2_line_seg;
280
0
  struct line_subseg **pss, *lss;
281
282
0
  if (s == NULL)
283
0
    {
284
0
      if (!create_p)
285
0
  return NULL;
286
287
0
      s = XNEW (struct line_seg);
288
0
      s->next = NULL;
289
0
      s->seg = seg;
290
0
      s->head = NULL;
291
0
      *last_seg_ptr = s;
292
0
      last_seg_ptr = &s->next;
293
0
      seg_info (seg)->dwarf2_line_seg = s;
294
0
    }
295
296
0
  gas_assert (seg == s->seg);
297
298
0
  for (pss = &s->head; (lss = *pss) != NULL ; pss = &lss->next)
299
0
    {
300
0
      if (lss->subseg == subseg)
301
0
  goto found_subseg;
302
0
      if (lss->subseg > subseg)
303
0
  break;
304
0
    }
305
306
0
  lss = XNEW (struct line_subseg);
307
0
  lss->next = *pss;
308
0
  lss->subseg = subseg;
309
0
  lss->head = NULL;
310
0
  lss->ptail = &lss->head;
311
0
  lss->pmove_tail = &lss->head;
312
0
  *pss = lss;
313
314
0
 found_subseg:
315
0
  return lss;
316
0
}
317
318
/* (Un)reverse the line_entry list starting from H.  */
319
320
static struct line_entry *
321
reverse_line_entry_list (struct line_entry *h)
322
0
{
323
0
  struct line_entry *p = NULL, *e, *n;
324
325
0
  for (e = h; e; e = n)
326
0
    {
327
0
      n = e->next;
328
0
      e->next = p;
329
0
      p = e;
330
0
    }
331
0
  return p;
332
0
}
333
334
/* Compute the view for E based on the previous entry P.  If we
335
   introduce an (undefined) view symbol for P, and H is given (P must
336
   be the tail in this case), introduce view symbols for earlier list
337
   entries as well, until one of them is constant.  */
338
339
static void
340
set_or_check_view (struct line_entry *e, struct line_entry *p,
341
       struct line_entry *h)
342
0
{
343
0
  expressionS viewx;
344
345
0
  memset (&viewx, 0, sizeof (viewx));
346
0
  viewx.X_unsigned = 1;
347
348
  /* First, compute !(E->label > P->label), to tell whether or not
349
     we're to reset the view number.  If we can't resolve it to a
350
     constant, keep it symbolic.  */
351
0
  if (!p || (e->loc.u.view == force_reset_view && force_reset_view))
352
0
    {
353
0
      viewx.X_op = O_constant;
354
0
      viewx.X_add_number = 0;
355
0
      viewx.X_add_symbol = NULL;
356
0
      viewx.X_op_symbol = NULL;
357
0
    }
358
0
  else
359
0
    {
360
0
      viewx.X_op = O_gt;
361
0
      viewx.X_add_number = 0;
362
0
      viewx.X_add_symbol = e->label;
363
0
      viewx.X_op_symbol = p->label;
364
0
      resolve_expression (&viewx);
365
0
      if (viewx.X_op == O_constant)
366
0
  viewx.X_add_number = !viewx.X_add_number;
367
0
      else
368
0
  {
369
0
    viewx.X_add_symbol = make_expr_symbol (&viewx);
370
0
    viewx.X_add_number = 0;
371
0
    viewx.X_op_symbol = NULL;
372
0
    viewx.X_op = O_logical_not;
373
0
  }
374
0
    }
375
376
0
  if (S_IS_DEFINED (e->loc.u.view) && symbol_constant_p (e->loc.u.view))
377
0
    {
378
0
      expressionS *value = symbol_get_value_expression (e->loc.u.view);
379
      /* We can't compare the view numbers at this point, because in
380
   VIEWX we've only determined whether we're to reset it so
381
   far.  */
382
0
      if (viewx.X_op == O_constant)
383
0
  {
384
0
    if (!value->X_add_number != !viewx.X_add_number)
385
0
      as_bad (_("view number mismatch"));
386
0
  }
387
      /* Record the expression to check it later.  It is the result of
388
   a logical not, thus 0 or 1.  We just add up all such deferred
389
   expressions, and resolve it at the end.  */
390
0
      else if (!value->X_add_number)
391
0
  {
392
0
    symbolS *deferred = make_expr_symbol (&viewx);
393
0
    if (view_assert_failed)
394
0
      {
395
0
        expressionS chk;
396
397
0
        memset (&chk, 0, sizeof (chk));
398
0
        chk.X_unsigned = 1;
399
0
        chk.X_op = O_add;
400
0
        chk.X_add_number = 0;
401
0
        chk.X_add_symbol = view_assert_failed;
402
0
        chk.X_op_symbol = deferred;
403
0
        deferred = make_expr_symbol (&chk);
404
0
      }
405
0
    view_assert_failed = deferred;
406
0
  }
407
0
    }
408
409
0
  if (viewx.X_op != O_constant || viewx.X_add_number)
410
0
    {
411
0
      expressionS incv;
412
0
      expressionS *p_view;
413
414
0
      if (!p->loc.u.view)
415
0
  p->loc.u.view = symbol_temp_make ();
416
417
0
      memset (&incv, 0, sizeof (incv));
418
0
      incv.X_unsigned = 1;
419
0
      incv.X_op = O_symbol;
420
0
      incv.X_add_symbol = p->loc.u.view;
421
0
      incv.X_add_number = 1;
422
0
      p_view = symbol_get_value_expression (p->loc.u.view);
423
0
      if (p_view->X_op == O_constant || p_view->X_op == O_symbol)
424
0
  {
425
    /* If we can, constant fold increments so that a chain of
426
       expressions v + 1 + 1 ... + 1 is not created.
427
       resolve_expression isn't ideal for this purpose.  The
428
       base v might not be resolvable until later.  */
429
0
    incv.X_op = p_view->X_op;
430
0
    incv.X_add_symbol = p_view->X_add_symbol;
431
0
    incv.X_add_number = p_view->X_add_number + 1;
432
0
  }
433
434
0
      if (viewx.X_op == O_constant)
435
0
  {
436
0
    gas_assert (viewx.X_add_number == 1);
437
0
    viewx = incv;
438
0
  }
439
0
      else
440
0
  {
441
0
    viewx.X_add_symbol = make_expr_symbol (&viewx);
442
0
    viewx.X_add_number = 0;
443
0
    viewx.X_op_symbol = make_expr_symbol (&incv);
444
0
    viewx.X_op = O_multiply;
445
0
  }
446
0
    }
447
448
0
  if (!S_IS_DEFINED (e->loc.u.view))
449
0
    {
450
0
      symbol_set_value_expression (e->loc.u.view, &viewx);
451
0
      S_SET_SEGMENT (e->loc.u.view, expr_section);
452
0
      symbol_set_frag (e->loc.u.view, &zero_address_frag);
453
0
    }
454
455
  /* Define and attempt to simplify any earlier views needed to
456
     compute E's.  */
457
0
  if (h && p && p->loc.u.view && !S_IS_DEFINED (p->loc.u.view))
458
0
    {
459
0
      struct line_entry *h2;
460
      /* Reverse the list to avoid quadratic behavior going backwards
461
   in a single-linked list.  */
462
0
      struct line_entry *r = reverse_line_entry_list (h);
463
464
0
      gas_assert (r == p);
465
      /* Set or check views until we find a defined or absent view.  */
466
0
      do
467
0
  {
468
    /* Do not define the head of a (sub?)segment view while
469
       handling others.  It would be defined too early, without
470
       regard to the last view of other subsegments.
471
       set_or_check_view will be called for every head segment
472
       that needs it.  */
473
0
    if (r == h)
474
0
      break;
475
0
    set_or_check_view (r, r->next, NULL);
476
0
  }
477
0
      while (r->next
478
0
       && r->next->loc.u.view
479
0
       && !S_IS_DEFINED (r->next->loc.u.view)
480
0
       && (r = r->next));
481
482
      /* Unreverse the list, so that we can go forward again.  */
483
0
      h2 = reverse_line_entry_list (p);
484
0
      gas_assert (h2 == h);
485
486
      /* Starting from the last view we just defined, attempt to
487
   simplify the view expressions, until we do so to P.  */
488
0
      do
489
0
  {
490
    /* The head view of a subsegment may remain undefined while
491
       handling other elements, before it is linked to the last
492
       view of the previous subsegment.  */
493
0
    if (r == h)
494
0
      continue;
495
0
    gas_assert (S_IS_DEFINED (r->loc.u.view));
496
0
    resolve_expression (symbol_get_value_expression (r->loc.u.view));
497
0
  }
498
0
      while (r != p && (r = r->next));
499
500
      /* Now that we've defined and computed all earlier views that might
501
   be needed to compute E's, attempt to simplify it.  */
502
0
      resolve_expression (symbol_get_value_expression (e->loc.u.view));
503
0
    }
504
0
}
505
506
/* Record an entry for LOC occurring at LABEL.  */
507
508
static void
509
dwarf2_gen_line_info_1 (symbolS *label, struct dwarf2_line_info *loc)
510
0
{
511
0
  struct line_subseg *lss;
512
0
  struct line_entry *e;
513
0
  flagword need_flags = SEC_LOAD | SEC_CODE;
514
515
  /* PR 26850: Do not record LOCs in non-executable or non-loaded
516
     sections.  SEC_ALLOC isn't tested for non-ELF because obj-coff.c
517
     obj_coff_section is careless in setting SEC_ALLOC.  */
518
0
  if (IS_ELF)
519
0
    need_flags |= SEC_ALLOC;
520
0
  if ((now_seg->flags & need_flags) != need_flags)
521
0
    {
522
      /* FIXME: Add code to suppress multiple warnings ?  */
523
0
      if (debug_type != DEBUG_DWARF2)
524
0
  as_warn ("dwarf line number information for %s ignored",
525
0
     segment_name (now_seg));
526
0
      return;
527
0
    }
528
529
0
  e = XNEW (struct line_entry);
530
0
  e->next = NULL;
531
0
  e->label = label;
532
0
  e->loc = *loc;
533
534
0
  lss = get_line_subseg (now_seg, now_subseg, true);
535
536
  /* Subseg heads are chained to previous subsegs in
537
     dwarf2_finish.  */
538
0
  if (loc->filenum != -1u && loc->u.view && lss->head)
539
0
    set_or_check_view (e, line_entry_at_tail (lss->head, lss->ptail),
540
0
           lss->head);
541
542
0
  *lss->ptail = e;
543
0
  lss->ptail = &e->next;
544
0
}
545
546
/* Record an entry for LOC occurring at OFS within the current fragment.  */
547
548
static unsigned int dw2_line;
549
static const char *dw2_filename;
550
static int label_num;
551
552
void
553
dwarf2_gen_line_info (addressT ofs, struct dwarf2_line_info *loc)
554
0
{
555
0
  symbolS *sym;
556
557
  /* Early out for as-yet incomplete location information.  */
558
0
  if (loc->line == 0)
559
0
    return;
560
0
  if (loc->filenum == 0)
561
0
    {
562
0
      if (dwarf_level < 5)
563
0
  dwarf_level = 5;
564
0
      if (DWARF2_LINE_VERSION < 5)
565
0
  return;
566
0
    }
567
568
  /* Don't emit sequences of line symbols for the same line when the
569
     symbols apply to assembler code.  It is necessary to emit
570
     duplicate line symbols when a compiler asks for them, because GDB
571
     uses them to determine the end of the prologue.  */
572
0
  if (debug_type == DEBUG_DWARF2)
573
0
    {
574
0
      if (dw2_line == loc->line)
575
0
  {
576
0
    if (dw2_filename == loc->u.filename)
577
0
      return;
578
0
    if (filename_cmp (dw2_filename, loc->u.filename) == 0)
579
0
      {
580
0
        dw2_filename = loc->u.filename;
581
0
        return;
582
0
      }
583
0
  }
584
585
0
      dw2_line = loc->line;
586
0
      dw2_filename = loc->u.filename;
587
0
    }
588
589
0
  if (linkrelax)
590
0
    {
591
0
      char name[32];
592
593
      /* Use a non-fake name for the line number location,
594
   so that it can be referred to by relocations.  */
595
0
      sprintf (name, ".Loc.%u", label_num);
596
0
      label_num++;
597
0
      sym = symbol_new (name, now_seg, frag_now, ofs);
598
0
    }
599
0
  else
600
0
    sym = symbol_temp_new (now_seg, frag_now, ofs);
601
0
  dwarf2_gen_line_info_1 (sym, loc);
602
0
}
603
604
static const char *
605
get_basename (const char * pathname)
606
0
{
607
0
  const char * file;
608
609
0
  file = lbasename (pathname);
610
  /* Don't make empty string from / or A: from A:/ .  */
611
#ifdef HAVE_DOS_BASED_FILE_SYSTEM
612
  if (file <= pathname + 3)
613
    file = pathname;
614
#else
615
0
  if (file == pathname + 1)
616
0
    file = pathname;
617
0
#endif
618
0
  return file;
619
0
}
620
621
static unsigned int
622
get_directory_table_entry (const char *dirname,
623
         const char *file0_dirname,
624
         size_t dirlen,
625
         bool can_use_zero)
626
0
{
627
0
  unsigned int d;
628
629
0
  if (dirlen == 0)
630
0
    return 0;
631
632
0
#ifndef DWARF2_DIR_SHOULD_END_WITH_SEPARATOR
633
0
  if (IS_DIR_SEPARATOR (dirname[dirlen - 1]))
634
0
    {
635
0
      -- dirlen;
636
0
      if (dirlen == 0)
637
0
  return 0;
638
0
    }
639
0
#endif
640
641
0
  for (d = 0; d < dirs_in_use; ++d)
642
0
    {
643
0
      if (dirs[d] != NULL
644
0
    && filename_ncmp (dirname, dirs[d], dirlen) == 0
645
0
    && dirs[d][dirlen] == '\0')
646
0
  return d;
647
0
    }
648
649
0
  if (can_use_zero)
650
0
    {
651
0
      if (dirs == NULL || dirs[0] == NULL)
652
0
  {
653
0
    const char * pwd = file0_dirname ? file0_dirname : getpwd ();
654
655
0
    if (dwarf_level >= 5 && filename_cmp (dirname, pwd) != 0)
656
0
      {
657
        /* In DWARF-5 the 0 entry in the directory table is
658
     expected to be the same as the DW_AT_comp_dir (which
659
     is set to the current build directory).  Since we are
660
     about to create a directory entry that is not the
661
     same, allocate the current directory first.  */
662
0
        (void) get_directory_table_entry (pwd, pwd, strlen (pwd), true);
663
0
        d = dirs_in_use;
664
0
      }
665
0
    else
666
0
      d = 0;
667
0
  }
668
0
    }
669
0
  else if (d == 0)
670
0
    d = 1;
671
672
0
  if (d >= dirs_allocated)
673
0
    {
674
0
      unsigned int old = dirs_allocated;
675
0
#define DIR_TABLE_INCREMENT 32
676
0
      dirs_allocated = d + DIR_TABLE_INCREMENT;
677
0
      dirs = XRESIZEVEC (char *, dirs, dirs_allocated);
678
0
      memset (dirs + old, 0, (dirs_allocated - old) * sizeof (char *));
679
0
    }
680
681
0
  dirs[d] = xmemdup0 (dirname, dirlen);
682
0
  if (dirs_in_use <= d)
683
0
    dirs_in_use = d + 1;
684
685
0
  return d;  
686
0
}
687
688
static bool
689
assign_file_to_slot (valueT i, const char *file, unsigned int dir)
690
0
{
691
0
  if (i >= files_allocated)
692
0
    {
693
0
      unsigned int want = i + 32;
694
695
      /* If this array is taking 1G or more, someone is using silly
696
   file numbers.  */
697
0
      if (want < i || want > UINT_MAX / 4 / sizeof (struct file_entry))
698
0
  {
699
0
    as_bad (_("file number %" PRIu64 " is too big"), (uint64_t) i);
700
0
    return false;
701
0
  }
702
703
0
      files = XRESIZEVEC (struct file_entry, files, want);
704
0
      memset (files + files_allocated, 0,
705
0
        (want - files_allocated) * sizeof (struct file_entry));
706
0
      files_allocated = want;
707
0
    }
708
709
0
  files[i].filename = file;
710
0
  files[i].dir = dir;
711
0
  memset (files[i].md5, 0, NUM_MD5_BYTES);
712
713
0
  if (files_in_use < i + 1)
714
0
    files_in_use = i + 1;
715
716
0
  return true;
717
0
}
718
719
/* Get a .debug_line file number for PATHNAME.  If there is a
720
   directory component to PATHNAME, then this will be stored
721
   in the directory table, if it is not already present.
722
   Returns the slot number allocated to that filename or -1
723
   if there was a problem.  */
724
725
static int last_used;
726
static int last_used_dir_len;
727
728
static signed int
729
allocate_filenum (const char * pathname)
730
0
{
731
0
  const char *file;
732
0
  size_t dir_len;
733
0
  unsigned int i, dir;
734
735
  /* Short circuit the common case of adding the same pathname
736
     as last time.  */
737
0
  if (last_used != -1)
738
0
    {
739
0
      const char * dirname = NULL;
740
741
0
      if (dirs != NULL)
742
0
  dirname = dirs[files[last_used].dir];
743
744
0
      if (dirname == NULL)
745
0
  {
746
0
    if (filename_cmp (pathname, files[last_used].filename) == 0)
747
0
      return last_used;
748
0
  }
749
0
      else
750
0
  {
751
0
    if (filename_ncmp (pathname, dirname, last_used_dir_len - 1) == 0
752
0
        && IS_DIR_SEPARATOR (pathname [last_used_dir_len - 1])
753
0
        && filename_cmp (pathname + last_used_dir_len,
754
0
             files[last_used].filename) == 0)
755
0
      return last_used;
756
0
  }
757
0
    }
758
759
0
  file = get_basename (pathname);
760
0
  dir_len = file - pathname;
761
762
0
  dir = get_directory_table_entry (pathname, NULL, dir_len, false);
763
764
  /* Do not use slot-0.  That is specifically reserved for use by
765
     the '.file 0 "name"' directive.  */
766
0
  for (i = 1; i < files_in_use; ++i)
767
0
    if (files[i].dir == dir
768
0
  && files[i].filename
769
0
  && filename_cmp (file, files[i].filename) == 0)
770
0
      {
771
0
  last_used = i;
772
0
  last_used_dir_len = dir_len;
773
0
  return i;
774
0
      }
775
776
0
  if (!assign_file_to_slot (i, file, dir))
777
0
    return -1;
778
779
0
  last_used = i;
780
0
  last_used_dir_len = dir_len;
781
782
0
  return i;
783
0
}
784
785
/* Run through the list of line entries starting at E, allocating
786
   file entries for gas generated debug.  */
787
788
static void
789
do_allocate_filenum (struct line_entry *e)
790
0
{
791
0
  do
792
0
    {
793
0
      if (e->loc.filenum == -1u)
794
0
  {
795
0
    e->loc.filenum = allocate_filenum (e->loc.u.filename);
796
0
    e->loc.u.view = NULL;
797
0
  }
798
0
      e = e->next;
799
0
    }
800
0
  while (e);
801
0
}
802
803
/* Remove any generated line entries.  These don't live comfortably
804
   with compiler generated line info.  If THELOT then remove
805
   everything, freeing all list entries we have created.  */
806
807
static void
808
purge_generated_debug (bool thelot)
809
0
{
810
0
  struct line_seg *s, *nexts;
811
812
0
  for (s = all_segs; s; s = nexts)
813
0
    {
814
0
      struct line_subseg *lss, *nextlss;
815
816
0
      for (lss = s->head; lss; lss = nextlss)
817
0
  {
818
0
    struct line_entry *e, *next;
819
820
0
    for (e = lss->head; e; e = next)
821
0
      {
822
0
        if (!thelot)
823
0
    know (e->loc.filenum == -1u);
824
0
        next = e->next;
825
0
        free (e);
826
0
      }
827
828
0
    lss->head = NULL;
829
0
    lss->ptail = &lss->head;
830
0
    lss->pmove_tail = &lss->head;
831
0
    nextlss = lss->next;
832
0
    if (thelot)
833
0
      free (lss);
834
0
  }
835
0
      nexts = s->next;
836
0
      if (thelot)
837
0
  {
838
0
    seg_info (s->seg)->dwarf2_line_seg = NULL;
839
0
    free (s);
840
0
  }
841
0
    }
842
0
}
843
844
/* Allocate slot NUM in the .debug_line file table to FILENAME.
845
   If DIRNAME is not NULL or there is a directory component to FILENAME
846
   then this will be stored in the directory table, if not already present.
847
   if WITH_MD5 is TRUE then there is a md5 value in generic_bignum.
848
   Returns TRUE if allocation succeeded, FALSE otherwise.  */
849
850
static bool
851
allocate_filename_to_slot (const char *dirname,
852
         const char *filename,
853
         valueT num,
854
         bool with_md5)
855
0
{
856
0
  const char *file;
857
0
  size_t dirlen;
858
0
  unsigned int i, d;
859
0
  const char *file0_dirname;
860
861
  /* Short circuit the common case of adding the same pathname
862
     as last time.  */
863
0
  if (num < files_allocated && files[num].filename != NULL)
864
0
    {
865
0
      const char * dir = NULL;
866
867
0
      if (dirs != NULL)
868
0
  dir = dirs[files[num].dir];
869
870
0
      if (with_md5
871
0
    && memcmp (generic_bignum, files[num].md5, NUM_MD5_BYTES) != 0)
872
0
  goto fail;
873
874
0
      if (dirname != NULL)
875
0
  {
876
0
    if (dir != NULL && filename_cmp (dir, dirname) != 0)
877
0
      goto fail;
878
      
879
0
    if (filename_cmp (filename, files[num].filename) != 0)
880
0
      goto fail;
881
882
    /* If the filenames match, but the directory table entry was
883
       empty, then fill it with the provided directory name.  */
884
0
    if (dir == NULL)
885
0
      {
886
0
        if (dirs == NULL)
887
0
    {
888
0
      dirs_allocated = files[num].dir + DIR_TABLE_INCREMENT;
889
0
      dirs = XCNEWVEC (char *, dirs_allocated);
890
0
    }
891
        
892
0
        dirs[files[num].dir] = xmemdup0 (dirname, strlen (dirname));
893
0
        if (dirs_in_use <= files[num].dir)
894
0
    dirs_in_use = files[num].dir + 1;
895
0
      }
896
      
897
0
    return true;
898
0
  }
899
0
      else if (dir != NULL) 
900
0
  {
901
0
    dirlen = strlen (dir);
902
0
    if (filename_ncmp (filename, dir, dirlen) == 0
903
0
        && IS_DIR_SEPARATOR (filename [dirlen])
904
0
        && filename_cmp (filename + dirlen + 1, files[num].filename) == 0)
905
0
      return true;
906
0
  }
907
0
      else /* dir == NULL  */
908
0
  {
909
0
    file = get_basename (filename);
910
0
    if (filename_cmp (file, files[num].filename) == 0)
911
0
      {
912
        /* The filenames match, but the directory table entry is empty.
913
     Fill it with the provided directory name.  */
914
0
        if (file > filename)
915
0
    {
916
0
      if (dirs == NULL)
917
0
        {
918
0
          dirs_allocated = files[num].dir + DIR_TABLE_INCREMENT;
919
0
          dirs = XCNEWVEC (char *, dirs_allocated);
920
0
        }
921
922
0
      dirs[files[num].dir] = xmemdup0 (filename, file - filename);
923
0
      if (dirs_in_use <= files[num].dir)
924
0
        dirs_in_use = files[num].dir + 1;
925
0
    }
926
0
        return true;
927
0
      }
928
0
  }
929
930
0
    fail:
931
0
      as_bad (_("file table slot %u is already occupied by a different file"
932
0
    " (%s%s%s vs %s%s%s)"),
933
0
        (unsigned int) num,
934
0
        dir == NULL ? "" : dir,
935
0
        dir == NULL ? "" : "/",
936
0
        files[num].filename,
937
0
        dirname == NULL ? "" : dirname,
938
0
        dirname == NULL ? "" : "/",
939
0
        filename);
940
0
      return false;
941
0
    }
942
943
  /* For file .0, the directory name is the current directory and the file
944
     may be in another directory contained in the file name.  */
945
0
  if (num == 0)
946
0
    {
947
0
      file0_dirname = dirname;
948
949
0
      file = get_basename (filename);
950
951
0
      if (dirname && file == filename)
952
0
  dirlen = strlen (dirname);
953
0
      else
954
0
  {
955
0
    dirname = filename;
956
0
    dirlen = file - filename;
957
0
  }
958
0
    }
959
0
  else
960
0
    {
961
0
      file0_dirname = NULL;
962
963
0
      if (dirname == NULL)
964
0
  {
965
0
    dirname = filename;
966
0
    file = get_basename (filename);
967
0
    dirlen = file - filename;
968
0
  }
969
0
      else
970
0
  {
971
0
    dirlen = strlen (dirname);
972
0
    file = filename;
973
0
  }
974
0
    }
975
976
0
  d = get_directory_table_entry (dirname, file0_dirname, dirlen, num == 0);
977
0
  i = num;
978
979
0
  if (!assign_file_to_slot (num, file, d))
980
0
    return false;
981
982
0
  if (with_md5)
983
0
    {
984
0
      if (target_big_endian)
985
0
  {
986
    /* md5's are stored in litte endian format.  */
987
0
    unsigned int     bits_remaining = NUM_MD5_BYTES * BITS_PER_CHAR;
988
0
    unsigned int     byte = NUM_MD5_BYTES;
989
0
    unsigned int     bignum_index = 0;
990
991
0
    while (bits_remaining)
992
0
      {
993
0
        unsigned int bignum_bits_remaining = LITTLENUM_NUMBER_OF_BITS;
994
0
        valueT       bignum_value = generic_bignum [bignum_index];
995
0
        bignum_index ++;
996
997
0
        while (bignum_bits_remaining)
998
0
    {
999
0
      files[i].md5[--byte] = bignum_value & 0xff;
1000
0
      bignum_value >>= 8;
1001
0
      bignum_bits_remaining -= 8;
1002
0
      bits_remaining -= 8;
1003
0
    }
1004
0
      }
1005
0
  }
1006
0
      else
1007
0
  {
1008
0
    unsigned int     bits_remaining = NUM_MD5_BYTES * BITS_PER_CHAR;
1009
0
    unsigned int     byte = 0;
1010
0
    unsigned int     bignum_index = 0;
1011
1012
0
    while (bits_remaining)
1013
0
      {
1014
0
        unsigned int bignum_bits_remaining = LITTLENUM_NUMBER_OF_BITS;
1015
0
        valueT       bignum_value = generic_bignum [bignum_index];
1016
1017
0
        bignum_index ++;
1018
1019
0
        while (bignum_bits_remaining)
1020
0
    {
1021
0
      files[i].md5[byte++] = bignum_value & 0xff;
1022
0
      bignum_value >>= 8;
1023
0
      bignum_bits_remaining -= 8;
1024
0
      bits_remaining -= 8;
1025
0
    }
1026
0
      }
1027
0
  }
1028
0
    }
1029
0
  else
1030
0
    memset (files[i].md5, 0, NUM_MD5_BYTES);
1031
1032
0
  return true;
1033
0
}
1034
1035
/* Returns the current source information.  If .file directives have
1036
   been encountered, the info for the corresponding source file is
1037
   returned.  Otherwise, the info for the assembly source file is
1038
   returned.  */
1039
1040
void
1041
dwarf2_where (struct dwarf2_line_info *line)
1042
0
{
1043
0
  if (debug_type == DEBUG_DWARF2)
1044
0
    {
1045
0
      line->u.filename = as_where (&line->line);
1046
0
      line->filenum = -1u;
1047
0
      line->column = 0;
1048
0
      line->flags = DWARF2_FLAG_IS_STMT;
1049
0
      line->isa = current.isa;
1050
0
      line->discriminator = current.discriminator;
1051
0
    }
1052
0
  else
1053
0
    *line = current;
1054
0
}
1055
1056
/* A hook to allow the target backend to inform the line number state
1057
   machine of isa changes when assembler debug info is enabled.  */
1058
1059
void
1060
dwarf2_set_isa (unsigned int isa)
1061
0
{
1062
0
  current.isa = isa;
1063
0
}
1064
1065
/* Called for each machine instruction, or relatively atomic group of
1066
   machine instructions (ie built-in macro).  The instruction or group
1067
   is SIZE bytes in length.  If dwarf2 line number generation is called
1068
   for, emit a line statement appropriately.  */
1069
1070
void
1071
dwarf2_emit_insn (int size)
1072
0
{
1073
0
  struct dwarf2_line_info loc;
1074
1075
0
  if (debug_type != DEBUG_DWARF2
1076
0
      ? !dwarf2_loc_directive_seen
1077
0
      : !seen_at_least_1_file ())
1078
0
    return;
1079
1080
0
  dwarf2_where (&loc);
1081
1082
0
  dwarf2_gen_line_info ((frag_now_fix_octets () - size) / OCTETS_PER_BYTE, &loc);
1083
0
  dwarf2_consume_line_info ();
1084
0
}
1085
1086
/* Move all previously-emitted line entries for the current position by
1087
   DELTA bytes.  This function cannot be used to move the same entries
1088
   twice.  */
1089
1090
void
1091
dwarf2_move_insn (int delta)
1092
0
{
1093
0
  struct line_subseg *lss;
1094
0
  struct line_entry *e;
1095
0
  valueT now;
1096
1097
0
  if (delta == 0)
1098
0
    return;
1099
1100
0
  lss = get_line_subseg (now_seg, now_subseg, false);
1101
0
  if (!lss)
1102
0
    return;
1103
1104
0
  now = frag_now_fix ();
1105
0
  while ((e = *lss->pmove_tail))
1106
0
    {
1107
0
      if (S_GET_VALUE (e->label) == now)
1108
0
  S_SET_VALUE (e->label, now + delta);
1109
0
      lss->pmove_tail = &e->next;
1110
0
    }
1111
0
}
1112
1113
/* Called after the current line information has been either used with
1114
   dwarf2_gen_line_info or saved with a machine instruction for later use.
1115
   This resets the state of the line number information to reflect that
1116
   it has been used.  */
1117
1118
void
1119
dwarf2_consume_line_info (void)
1120
0
{
1121
  /* Unless we generate DWARF2 debugging information for each
1122
     assembler line, we only emit one line symbol for one LOC.  */
1123
0
  dwarf2_loc_directive_seen = false;
1124
1125
0
  current.flags &= ~(DWARF2_FLAG_BASIC_BLOCK
1126
0
         | DWARF2_FLAG_PROLOGUE_END
1127
0
         | DWARF2_FLAG_EPILOGUE_BEGIN);
1128
0
  current.discriminator = 0;
1129
0
  current.u.view = NULL;
1130
0
}
1131
1132
/* Called for each (preferably code) label.  If dwarf2_loc_mark_labels
1133
   is enabled, emit a basic block marker.  */
1134
1135
void
1136
dwarf2_emit_label (symbolS *label)
1137
0
{
1138
0
  struct dwarf2_line_info loc;
1139
1140
0
  if (!dwarf2_loc_mark_labels)
1141
0
    return;
1142
0
  if (S_GET_SEGMENT (label) != now_seg)
1143
0
    return;
1144
0
  if (!(bfd_section_flags (now_seg) & SEC_CODE))
1145
0
    return;
1146
0
  if (files_in_use == 0 && debug_type != DEBUG_DWARF2)
1147
0
    return;
1148
1149
0
  dwarf2_where (&loc);
1150
1151
0
  loc.flags |= DWARF2_FLAG_BASIC_BLOCK;
1152
1153
0
  dwarf2_gen_line_info_1 (label, &loc);
1154
0
  dwarf2_consume_line_info ();
1155
0
}
1156
1157
/* Handle two forms of .file directive:
1158
   - Pass .file "source.c" to s_file
1159
   - Handle .file 1 "source.c" by adding an entry to the DWARF-2 file table
1160
1161
   If an entry is added to the file table, return a pointer to the filename.  */
1162
1163
char *
1164
dwarf2_directive_filename (void)
1165
0
{
1166
0
  bool with_md5 = false;
1167
0
  valueT num;
1168
0
  char *filename;
1169
0
  const char * dirname = NULL;
1170
0
  int filename_len;
1171
1172
  /* Continue to accept a bare string and pass it off.  */
1173
0
  SKIP_WHITESPACE ();
1174
0
  if (*input_line_pointer == '"')
1175
0
    {
1176
0
      s_file (0);
1177
0
      return NULL;
1178
0
    }
1179
1180
0
  num = get_absolute_expression ();
1181
1182
0
  if ((offsetT) num < 1)
1183
0
    {
1184
0
      if (num == 0 && dwarf_level < 5)
1185
0
  dwarf_level = 5;
1186
0
      if ((offsetT) num < 0 || DWARF2_LINE_VERSION < 5)
1187
0
  {
1188
0
    as_bad (_("file number less than one"));
1189
0
    ignore_rest_of_line ();
1190
0
    return NULL;
1191
0
  }
1192
0
    }
1193
1194
  /* FIXME: Should we allow ".file <N>\n" as an expression meaning
1195
     "switch back to the already allocated file <N> as the current
1196
     file" ?  */
1197
1198
0
  filename = demand_copy_C_string (&filename_len);
1199
0
  if (filename == NULL)
1200
    /* demand_copy_C_string will have already generated an error message.  */
1201
0
    return NULL;
1202
1203
  /* For DWARF-5 support we also accept:
1204
     .file <NUM> ["<dir>"] "<file>" [md5 <NUM>]  */
1205
0
  if (DWARF2_LINE_VERSION > 4)
1206
0
    {
1207
0
      SKIP_WHITESPACE ();
1208
0
      if (*input_line_pointer == '"')
1209
0
  {
1210
0
    dirname = filename;
1211
0
    filename = demand_copy_C_string (&filename_len);
1212
0
    if (filename == NULL)
1213
0
      return NULL;
1214
0
    SKIP_WHITESPACE ();
1215
0
  }
1216
1217
0
      if (startswith (input_line_pointer, "md5"))
1218
0
  {
1219
0
    input_line_pointer += 3;
1220
0
    SKIP_WHITESPACE ();
1221
1222
0
    expressionS exp;
1223
0
    expression_and_evaluate (& exp);
1224
0
    if (exp.X_op != O_big)
1225
0
      as_bad (_("md5 value too small or not a constant"));
1226
0
    else
1227
0
      with_md5 = true;
1228
0
  }
1229
0
    }
1230
1231
0
  demand_empty_rest_of_line ();
1232
1233
  /* A .file directive implies compiler generated debug information is
1234
     being supplied.  Turn off gas generated debug info.  */
1235
0
  if (debug_type == DEBUG_DWARF2)
1236
0
    purge_generated_debug (false);
1237
0
  debug_type = DEBUG_NONE;
1238
1239
0
  if (!allocate_filename_to_slot (dirname, filename, num, with_md5))
1240
0
    return NULL;
1241
1242
0
  return filename;
1243
0
}
1244
1245
/* Calls dwarf2_directive_filename, but discards its result.
1246
   Used in pseudo-op tables where the function result is ignored.  */
1247
1248
void
1249
dwarf2_directive_file (int dummy ATTRIBUTE_UNUSED)
1250
0
{
1251
0
  (void) dwarf2_directive_filename ();
1252
0
}
1253
1254
void
1255
dwarf2_directive_loc (int dummy ATTRIBUTE_UNUSED)
1256
0
{
1257
0
  offsetT filenum, line;
1258
1259
  /* If we see two .loc directives in a row, force the first one to be
1260
     output now.  */
1261
0
  if (dwarf2_loc_directive_seen)
1262
0
    dwarf2_emit_insn (0);
1263
1264
0
  filenum = get_absolute_expression ();
1265
0
  SKIP_WHITESPACE ();
1266
0
  line = get_absolute_expression ();
1267
1268
0
  if (filenum < 1)
1269
0
    {
1270
0
      if (filenum == 0 && dwarf_level < 5)
1271
0
  dwarf_level = 5;
1272
0
      if (filenum < 0 || DWARF2_LINE_VERSION < 5)
1273
0
  {
1274
0
    as_bad (_("file number less than one"));
1275
0
    return;
1276
0
  }
1277
0
    }
1278
1279
0
  if ((valueT) filenum >= files_in_use || files[filenum].filename == NULL)
1280
0
    {
1281
0
      as_bad (_("unassigned file number %ld"), (long) filenum);
1282
0
      return;
1283
0
    }
1284
1285
  /* debug_type will be turned off by dwarf2_directive_filename, and
1286
     if we don't have a dwarf style .file then files_in_use will be
1287
     zero and the above error will trigger.  */
1288
0
  gas_assert (debug_type == DEBUG_NONE);
1289
1290
0
  current.filenum = filenum;
1291
0
  current.line = line;
1292
0
  current.discriminator = 0;
1293
1294
0
#ifndef NO_LISTING
1295
0
  if (listing)
1296
0
    {
1297
0
      if (files[filenum].dir)
1298
0
  {
1299
0
    size_t dir_len = strlen (dirs[files[filenum].dir]);
1300
0
    size_t file_len = strlen (files[filenum].filename);
1301
0
    char *cp = XNEWVEC (char, dir_len + 1 + file_len + 1);
1302
1303
0
    memcpy (cp, dirs[files[filenum].dir], dir_len);
1304
0
    INSERT_DIR_SEPARATOR (cp, dir_len);
1305
0
    memcpy (cp + dir_len + 1, files[filenum].filename, file_len);
1306
0
    cp[dir_len + file_len + 1] = '\0';
1307
0
    listing_source_file (cp);
1308
0
    free (cp);
1309
0
  }
1310
0
      else
1311
0
  listing_source_file (files[filenum].filename);
1312
0
      listing_source_line (line);
1313
0
    }
1314
0
#endif
1315
1316
0
  SKIP_WHITESPACE ();
1317
0
  if (ISDIGIT (*input_line_pointer))
1318
0
    {
1319
0
      current.column = get_absolute_expression ();
1320
0
      SKIP_WHITESPACE ();
1321
0
    }
1322
1323
0
  while (ISALPHA (*input_line_pointer))
1324
0
    {
1325
0
      char *p, c;
1326
0
      offsetT value;
1327
1328
0
      c = get_symbol_name (& p);
1329
1330
0
      if (strcmp (p, "basic_block") == 0)
1331
0
  {
1332
0
    current.flags |= DWARF2_FLAG_BASIC_BLOCK;
1333
0
    restore_line_pointer (c);
1334
0
  }
1335
0
      else if (strcmp (p, "prologue_end") == 0)
1336
0
  {
1337
0
    if (dwarf_level < 3)
1338
0
      dwarf_level = 3;
1339
0
    current.flags |= DWARF2_FLAG_PROLOGUE_END;
1340
0
    restore_line_pointer (c);
1341
0
  }
1342
0
      else if (strcmp (p, "epilogue_begin") == 0)
1343
0
  {
1344
0
    if (dwarf_level < 3)
1345
0
      dwarf_level = 3;
1346
0
    current.flags |= DWARF2_FLAG_EPILOGUE_BEGIN;
1347
0
    restore_line_pointer (c);
1348
0
  }
1349
0
      else if (strcmp (p, "is_stmt") == 0)
1350
0
  {
1351
0
    (void) restore_line_pointer (c);
1352
0
    value = get_absolute_expression ();
1353
0
    if (value == 0)
1354
0
      current.flags &= ~DWARF2_FLAG_IS_STMT;
1355
0
    else if (value == 1)
1356
0
      current.flags |= DWARF2_FLAG_IS_STMT;
1357
0
    else
1358
0
      {
1359
0
        as_bad (_("is_stmt value not 0 or 1"));
1360
0
        return;
1361
0
      }
1362
0
  }
1363
0
      else if (strcmp (p, "isa") == 0)
1364
0
  {
1365
0
    if (dwarf_level < 3)
1366
0
      dwarf_level = 3;
1367
0
    (void) restore_line_pointer (c);
1368
0
    value = get_absolute_expression ();
1369
0
    if (value >= 0)
1370
0
      current.isa = value;
1371
0
    else
1372
0
      {
1373
0
        as_bad (_("isa number less than zero"));
1374
0
        return;
1375
0
      }
1376
0
  }
1377
0
      else if (strcmp (p, "discriminator") == 0)
1378
0
  {
1379
0
    (void) restore_line_pointer (c);
1380
0
    value = get_absolute_expression ();
1381
0
    if (value >= 0)
1382
0
      current.discriminator = value;
1383
0
    else
1384
0
      {
1385
0
        as_bad (_("discriminator less than zero"));
1386
0
        return;
1387
0
      }
1388
0
  }
1389
0
      else if (strcmp (p, "view") == 0)
1390
0
  {
1391
0
    symbolS *sym;
1392
1393
0
    (void) restore_line_pointer (c);
1394
0
    SKIP_WHITESPACE ();
1395
1396
0
    if (ISDIGIT (*input_line_pointer)
1397
0
        || *input_line_pointer == '-')
1398
0
      {
1399
0
        bool force_reset = *input_line_pointer == '-';
1400
1401
0
        value = get_absolute_expression ();
1402
0
        if (value != 0)
1403
0
    {
1404
0
      as_bad (_("numeric view can only be asserted to zero"));
1405
0
      return;
1406
0
    }
1407
0
        if (force_reset && force_reset_view)
1408
0
    sym = force_reset_view;
1409
0
        else
1410
0
    {
1411
0
      sym = symbol_temp_new (absolute_section, &zero_address_frag,
1412
0
           value);
1413
0
      if (force_reset)
1414
0
        force_reset_view = sym;
1415
0
    }
1416
0
      }
1417
0
    else
1418
0
      {
1419
0
        char *name = read_symbol_name ();
1420
1421
0
        if (!name)
1422
0
    return;
1423
0
        sym = symbol_find_or_make (name);
1424
0
        free (name);
1425
0
        if (S_IS_DEFINED (sym) || symbol_equated_p (sym))
1426
0
    {
1427
0
      if (S_IS_VOLATILE (sym))
1428
0
        sym = symbol_clone (sym, 1);
1429
0
      else if (!S_CAN_BE_REDEFINED (sym))
1430
0
        {
1431
0
          as_bad (_("symbol `%s' is already defined"),
1432
0
            S_GET_NAME (sym));
1433
0
          return;
1434
0
        }
1435
0
    }
1436
0
        S_SET_SEGMENT (sym, undefined_section);
1437
0
        S_SET_VALUE (sym, 0);
1438
0
        symbol_set_frag (sym, &zero_address_frag);
1439
0
      }
1440
0
    current.u.view = sym;
1441
0
  }
1442
0
      else
1443
0
  {
1444
0
    as_bad (_("unknown .loc sub-directive `%s'"), p);
1445
0
    (void) restore_line_pointer (c);
1446
0
    return;
1447
0
  }
1448
1449
0
      SKIP_WHITESPACE ();
1450
0
    }
1451
1452
0
  demand_empty_rest_of_line ();
1453
0
  dwarf2_any_loc_directive_seen = dwarf2_loc_directive_seen = true;
1454
1455
  /* If we were given a view id, emit the row right away.  */
1456
0
  if (current.u.view)
1457
0
    dwarf2_emit_insn (0);
1458
0
}
1459
1460
void
1461
dwarf2_directive_loc_mark_labels (int dummy ATTRIBUTE_UNUSED)
1462
0
{
1463
0
  offsetT value = get_absolute_expression ();
1464
1465
0
  if (value != 0 && value != 1)
1466
0
    {
1467
0
      as_bad (_("expected 0 or 1"));
1468
0
      ignore_rest_of_line ();
1469
0
    }
1470
0
  else
1471
0
    {
1472
0
      dwarf2_loc_mark_labels = value != 0;
1473
0
      demand_empty_rest_of_line ();
1474
0
    }
1475
0
}
1476

1477
static struct frag *
1478
first_frag_for_seg (segT seg)
1479
0
{
1480
0
  return seg_info (seg)->frchainP->frch_root;
1481
0
}
1482
1483
static struct frag *
1484
last_frag_for_seg (segT seg)
1485
0
{
1486
0
  frchainS *f = seg_info (seg)->frchainP;
1487
1488
0
  while (f->frch_next != NULL)
1489
0
    f = f->frch_next;
1490
1491
0
  return f->frch_last;
1492
0
}
1493

1494
/* Emit a single byte into the current segment.  */
1495
1496
static inline void
1497
out_byte (int byte)
1498
0
{
1499
0
  FRAG_APPEND_1_CHAR (byte);
1500
0
}
1501
1502
/* Emit a statement program opcode into the current segment.  */
1503
1504
static inline void
1505
out_opcode (int opc)
1506
0
{
1507
0
  out_byte (opc);
1508
0
}
1509
1510
/* Emit a two-byte word into the current segment.  */
1511
1512
static inline void
1513
out_two (int data)
1514
0
{
1515
0
  md_number_to_chars (frag_more (2), data, 2);
1516
0
}
1517
1518
/* Emit a four byte word into the current segment.  */
1519
1520
static inline void
1521
out_four (int data)
1522
0
{
1523
0
  md_number_to_chars (frag_more (4), data, 4);
1524
0
}
1525
1526
/* Emit an unsigned "little-endian base 128" number.  */
1527
1528
static void
1529
out_uleb128 (addressT value)
1530
0
{
1531
0
  output_leb128 (frag_more (sizeof_leb128 (value, 0)), value, 0);
1532
0
}
1533
1534
/* Emit a signed "little-endian base 128" number.  */
1535
1536
static void
1537
out_leb128 (addressT value)
1538
0
{
1539
0
  output_leb128 (frag_more (sizeof_leb128 (value, 1)), value, 1);
1540
0
}
1541
1542
/* Emit a tuple for .debug_abbrev.  */
1543
1544
static inline void
1545
out_abbrev (int name, int form)
1546
0
{
1547
0
  out_uleb128 (name);
1548
0
  out_uleb128 (form);
1549
0
}
1550
1551
/* Get the size of a fragment.  */
1552
1553
static offsetT
1554
get_frag_fix (fragS *frag, segT seg)
1555
0
{
1556
0
  frchainS *fr;
1557
1558
0
  if (frag->fr_next)
1559
0
    return frag->fr_fix;
1560
1561
  /* If a fragment is the last in the chain, special measures must be
1562
     taken to find its size before relaxation, since it may be pending
1563
     on some subsegment chain.  */
1564
0
  for (fr = seg_info (seg)->frchainP; fr; fr = fr->frch_next)
1565
0
    if (fr->frch_last == frag)
1566
0
      return (char *) obstack_next_free (&fr->frch_obstack) - frag->fr_literal;
1567
1568
0
  abort ();
1569
0
}
1570
1571
/* Set an absolute address (may result in a relocation entry).  */
1572
1573
static void
1574
out_set_addr (symbolS *sym)
1575
0
{
1576
0
  expressionS exp;
1577
1578
0
  memset (&exp, 0, sizeof exp);
1579
0
  out_opcode (DW_LNS_extended_op);
1580
0
  out_uleb128 (sizeof_address + 1);
1581
1582
0
  out_opcode (DW_LNE_set_address);
1583
0
  exp.X_op = O_symbol;
1584
0
  exp.X_add_symbol = sym;
1585
0
  exp.X_add_number = 0;
1586
0
  emit_expr (&exp, sizeof_address);
1587
0
}
1588
1589
static void
1590
scale_addr_delta (int line_delta, addressT *addr_delta)
1591
0
{
1592
0
  static int printed_this = 0;
1593
0
  if (DWARF2_LINE_MIN_INSN_LENGTH > 1)
1594
0
    {
1595
      /* Don't error on non-instruction bytes at end of section.  */
1596
0
      if (line_delta != INT_MAX
1597
0
    && *addr_delta % DWARF2_LINE_MIN_INSN_LENGTH != 0  && !printed_this)
1598
0
  {
1599
0
    as_bad("unaligned opcodes detected in executable segment");
1600
0
    printed_this = 1;
1601
0
  }
1602
0
      *addr_delta /= DWARF2_LINE_MIN_INSN_LENGTH;
1603
0
    }
1604
0
}
1605
1606
/* Encode a pair of line and address skips as efficiently as possible.
1607
   Note that the line skip is signed, whereas the address skip is unsigned.
1608
1609
   The following two routines *must* be kept in sync.  This is
1610
   enforced by making emit_inc_line_addr abort if we do not emit
1611
   exactly the expected number of bytes.  */
1612
1613
static int
1614
size_inc_line_addr (int line_delta, addressT addr_delta)
1615
0
{
1616
0
  unsigned int tmp, opcode;
1617
0
  int len = 0;
1618
1619
  /* Scale the address delta by the minimum instruction length.  */
1620
0
  scale_addr_delta (line_delta, &addr_delta);
1621
1622
  /* INT_MAX is a signal that this is actually a DW_LNE_end_sequence.
1623
     We cannot use special opcodes here, since we want the end_sequence
1624
     to emit the matrix entry.  */
1625
0
  if (line_delta == INT_MAX)
1626
0
    {
1627
0
      if (addr_delta == MAX_SPECIAL_ADDR_DELTA)
1628
0
  len = 1;
1629
0
      else if (addr_delta)
1630
0
  len = 1 + sizeof_leb128 (addr_delta, 0);
1631
0
      return len + 3;
1632
0
    }
1633
1634
  /* Bias the line delta by the base.  */
1635
0
  tmp = (unsigned) line_delta - DWARF2_LINE_BASE;
1636
1637
  /* If the line increment is out of range of a special opcode, we
1638
     must encode it with DW_LNS_advance_line.  */
1639
0
  if (tmp >= DWARF2_LINE_RANGE)
1640
0
    {
1641
0
      len = 1 + sizeof_leb128 (line_delta, 1);
1642
0
      line_delta = 0;
1643
0
      tmp = 0 - DWARF2_LINE_BASE;
1644
0
    }
1645
1646
  /* Bias the opcode by the special opcode base.  */
1647
0
  tmp += DWARF2_LINE_OPCODE_BASE;
1648
1649
  /* Avoid overflow when addr_delta is large.  */
1650
0
  if (addr_delta < 256U + MAX_SPECIAL_ADDR_DELTA)
1651
0
    {
1652
      /* Try using a special opcode.  */
1653
0
      opcode = tmp + addr_delta * DWARF2_LINE_RANGE;
1654
0
      if (opcode <= 255)
1655
0
  return len + 1;
1656
1657
      /* Try using DW_LNS_const_add_pc followed by special op.  */
1658
0
      opcode = tmp + (addr_delta - MAX_SPECIAL_ADDR_DELTA) * DWARF2_LINE_RANGE;
1659
0
      if (opcode <= 255)
1660
0
  return len + 2;
1661
0
    }
1662
1663
  /* Otherwise use DW_LNS_advance_pc.  */
1664
0
  len += 1 + sizeof_leb128 (addr_delta, 0);
1665
1666
  /* DW_LNS_copy or special opcode.  */
1667
0
  len += 1;
1668
1669
0
  return len;
1670
0
}
1671
1672
static void
1673
emit_inc_line_addr (int line_delta, addressT addr_delta, char *p, int len)
1674
0
{
1675
0
  unsigned int tmp, opcode;
1676
0
  int need_copy = 0;
1677
0
  char *end = p + len;
1678
1679
  /* Line number sequences cannot go backward in addresses.  This means
1680
     we've incorrectly ordered the statements in the sequence.  */
1681
0
  gas_assert ((offsetT) addr_delta >= 0);
1682
1683
  /* Scale the address delta by the minimum instruction length.  */
1684
0
  scale_addr_delta (line_delta, &addr_delta);
1685
1686
  /* INT_MAX is a signal that this is actually a DW_LNE_end_sequence.
1687
     We cannot use special opcodes here, since we want the end_sequence
1688
     to emit the matrix entry.  */
1689
0
  if (line_delta == INT_MAX)
1690
0
    {
1691
0
      if (addr_delta == MAX_SPECIAL_ADDR_DELTA)
1692
0
  *p++ = DW_LNS_const_add_pc;
1693
0
      else if (addr_delta)
1694
0
  {
1695
0
    *p++ = DW_LNS_advance_pc;
1696
0
    p += output_leb128 (p, addr_delta, 0);
1697
0
  }
1698
1699
0
      *p++ = DW_LNS_extended_op;
1700
0
      *p++ = 1;
1701
0
      *p++ = DW_LNE_end_sequence;
1702
0
      goto done;
1703
0
    }
1704
1705
  /* Bias the line delta by the base.  */
1706
0
  tmp = (unsigned) line_delta - DWARF2_LINE_BASE;
1707
1708
  /* If the line increment is out of range of a special opcode, we
1709
     must encode it with DW_LNS_advance_line.  */
1710
0
  if (tmp >= DWARF2_LINE_RANGE)
1711
0
    {
1712
0
      *p++ = DW_LNS_advance_line;
1713
0
      p += output_leb128 (p, line_delta, 1);
1714
1715
0
      line_delta = 0;
1716
0
      tmp = 0 - DWARF2_LINE_BASE;
1717
0
      need_copy = 1;
1718
0
    }
1719
1720
  /* Prettier, I think, to use DW_LNS_copy instead of a "line +0, addr +0"
1721
     special opcode.  */
1722
0
  if (line_delta == 0 && addr_delta == 0)
1723
0
    {
1724
0
      *p++ = DW_LNS_copy;
1725
0
      goto done;
1726
0
    }
1727
1728
  /* Bias the opcode by the special opcode base.  */
1729
0
  tmp += DWARF2_LINE_OPCODE_BASE;
1730
1731
  /* Avoid overflow when addr_delta is large.  */
1732
0
  if (addr_delta < 256U + MAX_SPECIAL_ADDR_DELTA)
1733
0
    {
1734
      /* Try using a special opcode.  */
1735
0
      opcode = tmp + addr_delta * DWARF2_LINE_RANGE;
1736
0
      if (opcode <= 255)
1737
0
  {
1738
0
    *p++ = opcode;
1739
0
    goto done;
1740
0
  }
1741
1742
      /* Try using DW_LNS_const_add_pc followed by special op.  */
1743
0
      opcode = tmp + (addr_delta - MAX_SPECIAL_ADDR_DELTA) * DWARF2_LINE_RANGE;
1744
0
      if (opcode <= 255)
1745
0
  {
1746
0
    *p++ = DW_LNS_const_add_pc;
1747
0
    *p++ = opcode;
1748
0
    goto done;
1749
0
  }
1750
0
    }
1751
1752
  /* Otherwise use DW_LNS_advance_pc.  */
1753
0
  *p++ = DW_LNS_advance_pc;
1754
0
  p += output_leb128 (p, addr_delta, 0);
1755
1756
0
  if (need_copy)
1757
0
    *p++ = DW_LNS_copy;
1758
0
  else
1759
0
    *p++ = tmp;
1760
1761
0
 done:
1762
0
  gas_assert (p == end);
1763
0
}
1764
1765
/* Handy routine to combine calls to the above two routines.  */
1766
1767
static void
1768
out_inc_line_addr (int line_delta, addressT addr_delta)
1769
0
{
1770
0
  int len = size_inc_line_addr (line_delta, addr_delta);
1771
0
  emit_inc_line_addr (line_delta, addr_delta, frag_more (len), len);
1772
0
}
1773
1774
/* Write out an alternative form of line and address skips using
1775
   DW_LNS_fixed_advance_pc opcodes.  This uses more space than the default
1776
   line and address information, but it is required if linker relaxation
1777
   could change the code offsets.  The following two routines *must* be
1778
   kept in sync.  */
1779
0
#define ADDR_DELTA_LIMIT 50000
1780
1781
static int
1782
size_fixed_inc_line_addr (int line_delta, addressT addr_delta)
1783
0
{
1784
0
  int len = 0;
1785
1786
  /* INT_MAX is a signal that this is actually a DW_LNE_end_sequence.  */
1787
0
  if (line_delta != INT_MAX)
1788
0
    len = 1 + sizeof_leb128 (line_delta, 1);
1789
1790
0
  if (addr_delta > ADDR_DELTA_LIMIT)
1791
0
    {
1792
      /* DW_LNS_extended_op */
1793
0
      len += 1 + sizeof_leb128 (sizeof_address + 1, 0);
1794
      /* DW_LNE_set_address */
1795
0
      len += 1 + sizeof_address;
1796
0
    }
1797
0
  else
1798
    /* DW_LNS_fixed_advance_pc */
1799
0
    len += 3;
1800
1801
0
  if (line_delta == INT_MAX)
1802
    /* DW_LNS_extended_op + DW_LNE_end_sequence */
1803
0
    len += 3;
1804
0
  else
1805
    /* DW_LNS_copy */
1806
0
    len += 1;
1807
1808
0
  return len;
1809
0
}
1810
1811
static void
1812
emit_fixed_inc_line_addr (int line_delta, addressT addr_delta, fragS *frag,
1813
        char *p, int len)
1814
0
{
1815
0
  expressionS *pexp;
1816
0
  char *end = p + len;
1817
1818
  /* Line number sequences cannot go backward in addresses.  This means
1819
     we've incorrectly ordered the statements in the sequence.  */
1820
0
  gas_assert ((offsetT) addr_delta >= 0);
1821
1822
  /* Verify that we have kept in sync with size_fixed_inc_line_addr.  */
1823
0
  gas_assert (len == size_fixed_inc_line_addr (line_delta, addr_delta));
1824
1825
  /* INT_MAX is a signal that this is actually a DW_LNE_end_sequence.  */
1826
0
  if (line_delta != INT_MAX)
1827
0
    {
1828
0
      *p++ = DW_LNS_advance_line;
1829
0
      p += output_leb128 (p, line_delta, 1);
1830
0
    }
1831
1832
0
  pexp = symbol_get_value_expression (frag->fr_symbol);
1833
1834
  /* The DW_LNS_fixed_advance_pc opcode has a 2-byte operand so it can
1835
     advance the address by at most 64K.  Linker relaxation (without
1836
     which this function would not be used) could change the operand by
1837
     an unknown amount.  If the address increment is getting close to
1838
     the limit, just reset the address.  */
1839
0
  if (addr_delta > ADDR_DELTA_LIMIT)
1840
0
    {
1841
0
      symbolS *to_sym;
1842
0
      expressionS exp;
1843
1844
0
      memset (&exp, 0, sizeof exp);
1845
0
      gas_assert (pexp->X_op == O_subtract);
1846
0
      to_sym = pexp->X_add_symbol;
1847
1848
0
      *p++ = DW_LNS_extended_op;
1849
0
      p += output_leb128 (p, sizeof_address + 1, 0);
1850
0
      *p++ = DW_LNE_set_address;
1851
0
      exp.X_op = O_symbol;
1852
0
      exp.X_add_symbol = to_sym;
1853
0
      exp.X_add_number = 0;
1854
0
      emit_expr_fix (&exp, sizeof_address, frag, p, TC_PARSE_CONS_RETURN_NONE);
1855
0
      p += sizeof_address;
1856
0
    }
1857
0
  else
1858
0
    {
1859
0
      *p++ = DW_LNS_fixed_advance_pc;
1860
0
      emit_expr_fix (pexp, 2, frag, p, TC_PARSE_CONS_RETURN_NONE);
1861
0
      p += 2;
1862
0
    }
1863
1864
0
  if (line_delta == INT_MAX)
1865
0
    {
1866
0
      *p++ = DW_LNS_extended_op;
1867
0
      *p++ = 1;
1868
0
      *p++ = DW_LNE_end_sequence;
1869
0
    }
1870
0
  else
1871
0
    *p++ = DW_LNS_copy;
1872
1873
0
  gas_assert (p == end);
1874
0
}
1875
1876
/* Generate a variant frag that we can use to relax address/line
1877
   increments between fragments of the target segment.  */
1878
1879
static void
1880
relax_inc_line_addr (int line_delta, symbolS *to_sym, symbolS *from_sym)
1881
0
{
1882
0
  expressionS exp;
1883
0
  int max_chars;
1884
1885
0
  memset (&exp, 0, sizeof exp);
1886
0
  exp.X_op = O_subtract;
1887
0
  exp.X_add_symbol = to_sym;
1888
0
  exp.X_op_symbol = from_sym;
1889
0
  exp.X_add_number = 0;
1890
1891
  /* The maximum size of the frag is the line delta with a maximum
1892
     sized address delta.  */
1893
0
  if (DWARF2_USE_FIXED_ADVANCE_PC)
1894
0
    max_chars = size_fixed_inc_line_addr (line_delta,
1895
0
            -DWARF2_LINE_MIN_INSN_LENGTH);
1896
0
  else
1897
0
    max_chars = size_inc_line_addr (line_delta, -DWARF2_LINE_MIN_INSN_LENGTH);
1898
1899
0
  frag_var (rs_dwarf2dbg, max_chars, max_chars, 1,
1900
0
      make_expr_symbol (&exp), line_delta, NULL);
1901
0
}
1902
1903
/* The function estimates the size of a rs_dwarf2dbg variant frag
1904
   based on the current values of the symbols.  It is called before
1905
   the relaxation loop.  We set fr_subtype to the expected length.  */
1906
1907
int
1908
dwarf2dbg_estimate_size_before_relax (fragS *frag)
1909
0
{
1910
0
  offsetT addr_delta;
1911
0
  int size;
1912
1913
0
  addr_delta = resolve_symbol_value (frag->fr_symbol);
1914
0
  if (DWARF2_USE_FIXED_ADVANCE_PC)
1915
0
    size = size_fixed_inc_line_addr (frag->fr_offset, addr_delta);
1916
0
  else
1917
0
    size = size_inc_line_addr (frag->fr_offset, addr_delta);
1918
1919
0
  frag->fr_subtype = size;
1920
1921
0
  return size;
1922
0
}
1923
1924
/* This function relaxes a rs_dwarf2dbg variant frag based on the
1925
   current values of the symbols.  fr_subtype is the current length
1926
   of the frag.  This returns the change in frag length.  */
1927
1928
int
1929
dwarf2dbg_relax_frag (fragS *frag)
1930
0
{
1931
0
  int old_size, new_size;
1932
1933
0
  old_size = frag->fr_subtype;
1934
0
  new_size = dwarf2dbg_estimate_size_before_relax (frag);
1935
1936
0
  return new_size - old_size;
1937
0
}
1938
1939
/* This function converts a rs_dwarf2dbg variant frag into a normal
1940
   fill frag.  This is called after all relaxation has been done.
1941
   fr_subtype will be the desired length of the frag.  */
1942
1943
void
1944
dwarf2dbg_convert_frag (fragS *frag)
1945
0
{
1946
0
  offsetT addr_diff;
1947
1948
0
  if (DWARF2_USE_FIXED_ADVANCE_PC)
1949
0
    {
1950
      /* If linker relaxation is enabled then the distance between the two
1951
   symbols in the frag->fr_symbol expression might change.  Hence we
1952
   cannot rely upon the value computed by resolve_symbol_value.
1953
   Instead we leave the expression unfinalized and allow
1954
   emit_fixed_inc_line_addr to create a fixup (which later becomes a
1955
   relocation) that will allow the linker to correctly compute the
1956
   actual address difference.  We have to use a fixed line advance for
1957
   this as we cannot (easily) relocate leb128 encoded values.  */
1958
0
      int saved_finalize_syms = finalize_syms;
1959
1960
0
      finalize_syms = 0;
1961
0
      addr_diff = resolve_symbol_value (frag->fr_symbol);
1962
0
      finalize_syms = saved_finalize_syms;
1963
0
    }
1964
0
  else
1965
0
    addr_diff = resolve_symbol_value (frag->fr_symbol);
1966
1967
  /* fr_var carries the max_chars that we created the fragment with.
1968
     fr_subtype carries the current expected length.  We must, of
1969
     course, have allocated enough memory earlier.  */
1970
0
  gas_assert (frag->fr_var >= (int) frag->fr_subtype);
1971
1972
0
  if (DWARF2_USE_FIXED_ADVANCE_PC)
1973
0
    emit_fixed_inc_line_addr (frag->fr_offset, addr_diff, frag,
1974
0
            frag->fr_literal + frag->fr_fix,
1975
0
            frag->fr_subtype);
1976
0
  else
1977
0
    emit_inc_line_addr (frag->fr_offset, addr_diff,
1978
0
      frag->fr_literal + frag->fr_fix, frag->fr_subtype);
1979
1980
0
  frag->fr_fix += frag->fr_subtype;
1981
0
  frag->fr_type = rs_fill;
1982
0
  frag->fr_var = 0;
1983
0
  frag->fr_offset = 0;
1984
0
}
1985
1986
/* Generate .debug_line content for the chain of line number entries
1987
   beginning at E, for segment SEG.  */
1988
1989
static void
1990
process_entries (segT seg, struct line_entry *e)
1991
0
{
1992
0
  unsigned filenum = 1;
1993
0
  unsigned line = 1;
1994
0
  unsigned column = 0;
1995
0
  unsigned isa = 0;
1996
0
  unsigned flags = DWARF2_LINE_DEFAULT_IS_STMT ? DWARF2_FLAG_IS_STMT : 0;
1997
0
  fragS *last_frag = NULL, *frag;
1998
0
  addressT last_frag_ofs = 0, frag_ofs;
1999
0
  symbolS *last_lab = NULL, *lab;
2000
2001
0
  if (flag_dwarf_sections)
2002
0
    {
2003
0
      char * name;
2004
0
      const char * sec_name;
2005
2006
      /* Switch to the relevant sub-section before we start to emit
2007
   the line number table.
2008
2009
   FIXME: These sub-sections do not have a normal Line Number
2010
   Program Header, thus strictly speaking they are not valid
2011
   DWARF sections.  Unfortunately the DWARF standard assumes
2012
   a one-to-one relationship between compilation units and
2013
   line number tables.  Thus we have to have a .debug_line
2014
   section, as well as our sub-sections, and we have to ensure
2015
   that all of the sub-sections are merged into a proper
2016
   .debug_line section before a debugger sees them.  */
2017
2018
0
      sec_name = bfd_section_name (seg);
2019
0
      if (strcmp (sec_name, ".text") != 0)
2020
0
  {
2021
0
    name = concat (".debug_line", sec_name, (char *) NULL);
2022
0
    subseg_set (subseg_get (name, false), 0);
2023
0
  }
2024
0
      else
2025
  /* Don't create a .debug_line.text section -
2026
     that is redundant.  Instead just switch back to the
2027
     normal .debug_line section.  */
2028
0
  subseg_set (subseg_get (".debug_line", false), 0);
2029
0
    }
2030
2031
0
  do
2032
0
    {
2033
0
      int line_delta;
2034
2035
0
      if (filenum != e->loc.filenum)
2036
0
  {
2037
0
    filenum = e->loc.filenum;
2038
0
    out_opcode (DW_LNS_set_file);
2039
0
    out_uleb128 (filenum);
2040
0
  }
2041
2042
0
      if (column != e->loc.column)
2043
0
  {
2044
0
    column = e->loc.column;
2045
0
    out_opcode (DW_LNS_set_column);
2046
0
    out_uleb128 (column);
2047
0
  }
2048
2049
0
      if (e->loc.discriminator != 0)
2050
0
  {
2051
0
    out_opcode (DW_LNS_extended_op);
2052
0
    out_leb128 (1 + sizeof_leb128 (e->loc.discriminator, 0));
2053
0
    out_opcode (DW_LNE_set_discriminator);
2054
0
    out_uleb128 (e->loc.discriminator);
2055
0
  }
2056
2057
0
      if (isa != e->loc.isa)
2058
0
  {
2059
0
    isa = e->loc.isa;
2060
0
    out_opcode (DW_LNS_set_isa);
2061
0
    out_uleb128 (isa);
2062
0
  }
2063
2064
0
      if ((e->loc.flags ^ flags) & DWARF2_FLAG_IS_STMT)
2065
0
  {
2066
0
    flags = e->loc.flags;
2067
0
    out_opcode (DW_LNS_negate_stmt);
2068
0
  }
2069
2070
0
      if (e->loc.flags & DWARF2_FLAG_BASIC_BLOCK)
2071
0
  out_opcode (DW_LNS_set_basic_block);
2072
2073
0
      if (e->loc.flags & DWARF2_FLAG_PROLOGUE_END)
2074
0
  out_opcode (DW_LNS_set_prologue_end);
2075
2076
0
      if (e->loc.flags & DWARF2_FLAG_EPILOGUE_BEGIN)
2077
0
  out_opcode (DW_LNS_set_epilogue_begin);
2078
2079
      /* Don't try to optimize away redundant entries; gdb wants two
2080
   entries for a function where the code starts on the same line as
2081
   the {, and there's no way to identify that case here.  Trust gcc
2082
   to optimize appropriately.  */
2083
0
      line_delta = e->loc.line - line;
2084
0
      lab = e->label;
2085
0
      frag = symbol_get_frag (lab);
2086
0
      frag_ofs = S_GET_VALUE (lab);
2087
2088
0
      if (last_frag == NULL
2089
0
    || (e->loc.u.view == force_reset_view && force_reset_view
2090
        /* If we're going to reset the view, but we know we're
2091
     advancing the PC, we don't have to force with
2092
     set_address.  We know we do when we're at the same
2093
     address of the same frag, and we know we might when
2094
     we're in the beginning of a frag, and we were at the
2095
     end of the previous frag.  */
2096
0
        && (frag == last_frag
2097
0
      ? (last_frag_ofs == frag_ofs)
2098
0
      : (frag_ofs == 0
2099
0
         && ((offsetT)last_frag_ofs
2100
0
       >= get_frag_fix (last_frag, seg))))))
2101
0
  {
2102
0
    out_set_addr (lab);
2103
0
    out_inc_line_addr (line_delta, 0);
2104
0
  }
2105
0
      else if (frag == last_frag && ! DWARF2_USE_FIXED_ADVANCE_PC)
2106
0
  out_inc_line_addr (line_delta, frag_ofs - last_frag_ofs);
2107
0
      else
2108
0
  relax_inc_line_addr (line_delta, lab, last_lab);
2109
2110
0
      line = e->loc.line;
2111
0
      last_lab = lab;
2112
0
      last_frag = frag;
2113
0
      last_frag_ofs = frag_ofs;
2114
2115
0
      e = e->next;
2116
0
    }
2117
0
  while (e);
2118
2119
  /* Emit a DW_LNE_end_sequence for the end of the section.  */
2120
0
  frag = last_frag_for_seg (seg);
2121
0
  frag_ofs = get_frag_fix (frag, seg);
2122
0
  if (frag == last_frag && ! DWARF2_USE_FIXED_ADVANCE_PC)
2123
0
    out_inc_line_addr (INT_MAX, frag_ofs - last_frag_ofs);
2124
0
  else
2125
0
    {
2126
0
      lab = symbol_temp_new (seg, frag, frag_ofs);
2127
0
      relax_inc_line_addr (INT_MAX, lab, last_lab);
2128
0
    }
2129
0
}
2130
2131
/* Switch to LINE_STR_SEG and output the given STR.  Return the
2132
   symbol pointing to the new string in the section.  */
2133
2134
static symbolS *
2135
add_line_strp (segT line_str_seg, const char *str)
2136
0
{
2137
0
  char *cp;
2138
0
  size_t size;
2139
0
  symbolS *sym;
2140
2141
0
  subseg_set (line_str_seg, 0);
2142
2143
0
  sym = symbol_temp_new_now_octets ();
2144
2145
0
  size = strlen (str) + 1;
2146
0
  cp = frag_more (size);
2147
0
  memcpy (cp, str, size);
2148
2149
0
  return sym;
2150
0
}
2151
2152
2153
/* Emit the directory and file tables for .debug_line.  */
2154
2155
static void
2156
out_dir_and_file_list (segT line_seg, int sizeof_offset)
2157
0
{
2158
0
  size_t size;
2159
0
  char *dir;
2160
0
  char *cp;
2161
0
  unsigned int i, j;
2162
0
  bool emit_md5 = false;
2163
0
  bool emit_timestamps = true;
2164
0
  bool emit_filesize = true;
2165
0
  segT line_str_seg = NULL;
2166
0
  symbolS *line_strp, *file0_strp = NULL;
2167
2168
  /* Output the Directory Table.  */
2169
0
  if (DWARF2_LINE_VERSION >= 5)
2170
0
    {
2171
      /* We only have one column in the directory table.  */
2172
0
      out_byte (1);
2173
2174
      /* Describe the purpose and format of the column.  */
2175
0
      out_uleb128 (DW_LNCT_path);
2176
      /* Store these strings in the .debug_line_str section so they
2177
   can be shared.  */
2178
0
      out_uleb128 (DW_FORM_line_strp);
2179
2180
      /* Now state how many rows there are in the table.  We need at
2181
   least 1 if there is one or more file names to store the
2182
   "working directory".  */
2183
0
      if (dirs_in_use == 0 && files_in_use > 0)
2184
0
  out_uleb128 (1);
2185
0
      else
2186
0
  out_uleb128 (dirs_in_use);
2187
0
    }
2188
      
2189
  /* Emit directory list.  */
2190
0
  if (DWARF2_LINE_VERSION >= 5 && (dirs_in_use > 0 || files_in_use > 0))
2191
0
    {
2192
0
      line_str_seg = subseg_new (".debug_line_str", 0);
2193
0
      bfd_set_section_flags (line_str_seg,
2194
0
           SEC_READONLY | SEC_DEBUGGING | SEC_OCTETS
2195
0
           | SEC_MERGE | SEC_STRINGS);
2196
0
      line_str_seg->entsize = 1;
2197
2198
      /* DWARF5 uses slot zero, but that is only set explicitly
2199
   using a .file 0 directive.  Otherwise use pwd as main file
2200
   directory.  */
2201
0
      if (dirs_in_use > 0 && dirs[0] != NULL)
2202
0
  dir = remap_debug_filename (dirs[0]);
2203
0
      else
2204
0
  dir = remap_debug_filename (getpwd ());
2205
2206
0
      line_strp = add_line_strp (line_str_seg, dir);
2207
0
      free (dir);
2208
0
      subseg_set (line_seg, 0);
2209
0
      TC_DWARF2_EMIT_OFFSET (line_strp, sizeof_offset);
2210
0
    }
2211
0
  for (i = 1; i < dirs_in_use; ++i)
2212
0
    {
2213
0
      dir = remap_debug_filename (dirs[i]);
2214
0
      if (DWARF2_LINE_VERSION < 5)
2215
0
  {
2216
0
    size = strlen (dir) + 1;
2217
0
    cp = frag_more (size);
2218
0
    memcpy (cp, dir, size);
2219
0
  }
2220
0
      else
2221
0
  {
2222
0
    line_strp = add_line_strp (line_str_seg, dir);
2223
0
    subseg_set (line_seg, 0);
2224
0
    TC_DWARF2_EMIT_OFFSET (line_strp, sizeof_offset);
2225
0
  }
2226
0
      free (dir);
2227
0
    }
2228
2229
0
  if (DWARF2_LINE_VERSION < 5)
2230
    /* Terminate it.  */
2231
0
    out_byte ('\0');
2232
2233
  /* Output the File Name Table.  */
2234
0
  if (DWARF2_LINE_VERSION >= 5)
2235
0
    {
2236
0
      unsigned int columns = 4;
2237
2238
0
      if (((unsigned long) DWARF2_FILE_TIME_NAME ("", "")) == -1UL)
2239
0
  {
2240
0
    emit_timestamps = false;
2241
0
    -- columns;
2242
0
  }
2243
2244
0
      if (DWARF2_FILE_SIZE_NAME ("", "") == -1)
2245
0
  {
2246
0
    emit_filesize = false;
2247
0
    -- columns;
2248
0
  }
2249
2250
0
      for (i = 0; i < files_in_use; ++i)
2251
0
  if (files[i].md5[0] != 0)
2252
0
    break;
2253
0
      if (i < files_in_use)
2254
0
  {
2255
0
    emit_md5 = true;
2256
0
    ++ columns;
2257
0
  }
2258
      
2259
      /* The number of format entries to follow.  */
2260
0
      out_byte (columns);
2261
      /* The format of the file name.  */
2262
0
      out_uleb128 (DW_LNCT_path);
2263
      /* Store these strings in the .debug_line_str section so they
2264
   can be shared.  */
2265
0
      out_uleb128 (DW_FORM_line_strp);
2266
2267
      /* The format of the directory index.  */
2268
0
      out_uleb128 (DW_LNCT_directory_index);
2269
0
      out_uleb128 (DW_FORM_udata);
2270
2271
0
      if (emit_timestamps)
2272
0
  {
2273
    /* The format of the timestamp.  */
2274
0
    out_uleb128 (DW_LNCT_timestamp);
2275
0
    out_uleb128 (DW_FORM_udata);
2276
0
  }
2277
2278
0
      if (emit_filesize)
2279
0
  {
2280
    /* The format of the file size.  */
2281
0
    out_uleb128 (DW_LNCT_size);
2282
0
    out_uleb128 (DW_FORM_udata);
2283
0
  }
2284
2285
0
      if (emit_md5)
2286
0
  {
2287
    /* The format of the MD5 sum.  */
2288
0
    out_uleb128 (DW_LNCT_MD5);
2289
0
    out_uleb128 (DW_FORM_data16);
2290
0
  }
2291
2292
      /* The number of entries in the table.  */
2293
0
      out_uleb128 (files_in_use);
2294
0
   }
2295
      
2296
0
  for (i = DWARF2_LINE_VERSION > 4 ? 0 : 1; i < files_in_use; ++i)
2297
0
    {
2298
0
      const char *fullfilename;
2299
2300
0
      if (files[i].filename == NULL)
2301
0
  {
2302
0
    if (DWARF2_LINE_VERSION < 5 || i != 0)
2303
0
      {
2304
0
        as_bad (_("unassigned file number %ld"), (long) i);
2305
0
        continue;
2306
0
      }
2307
    /* DWARF5 uses slot zero, but that is only set explicitly using
2308
       a .file 0 directive.  If that isn't used, but file 1 is, then
2309
       use that as main file name.  */
2310
0
    if (files_in_use > 1 && files[1].filename != NULL)
2311
0
      {
2312
0
        files[0].filename = files[1].filename;
2313
0
        files[0].dir = files[1].dir;
2314
0
        if (emit_md5)
2315
0
    for (j = 0; j < NUM_MD5_BYTES; ++j)
2316
0
      files[0].md5[j] = files[1].md5[j];
2317
0
      }
2318
0
    else
2319
0
      files[0].filename = "";
2320
0
  }
2321
2322
0
      fullfilename = DWARF2_FILE_NAME (files[i].filename,
2323
0
               files[i].dir ? dirs [files [i].dir] : "");
2324
0
      if (DWARF2_LINE_VERSION < 5)
2325
0
  {
2326
0
    size = strlen (fullfilename) + 1;
2327
0
    cp = frag_more (size);
2328
0
    memcpy (cp, fullfilename, size);
2329
0
  }
2330
0
      else
2331
0
  {
2332
0
    if (!file0_strp)
2333
0
      line_strp = add_line_strp (line_str_seg, fullfilename);
2334
0
    else
2335
0
      line_strp = file0_strp;
2336
0
    subseg_set (line_seg, 0);
2337
0
    TC_DWARF2_EMIT_OFFSET (line_strp, sizeof_offset);
2338
0
    if (i == 0 && files_in_use > 1
2339
0
        && files[0].filename == files[1].filename)
2340
0
      file0_strp = line_strp;
2341
0
    else
2342
0
      file0_strp = NULL;
2343
0
  }
2344
2345
      /* Directory number.  */
2346
0
      out_uleb128 (files[i].dir);
2347
2348
      /* Output the last modification timestamp.  */
2349
0
      if (emit_timestamps)
2350
0
  {
2351
0
    offsetT timestamp;
2352
2353
0
    timestamp = DWARF2_FILE_TIME_NAME (files[i].filename,
2354
0
               files[i].dir ? dirs [files [i].dir] : "");
2355
0
    if (timestamp == -1)
2356
0
      timestamp = 0;
2357
0
    out_uleb128 (timestamp);
2358
0
  }
2359
2360
      /* Output the filesize.  */
2361
0
      if (emit_filesize)
2362
0
  {
2363
0
    offsetT filesize;
2364
0
    filesize = DWARF2_FILE_SIZE_NAME (files[i].filename,
2365
0
              files[i].dir ? dirs [files [i].dir] : "");
2366
0
    if (filesize == -1)
2367
0
      filesize = 0;
2368
0
    out_uleb128 (filesize);
2369
0
  }
2370
2371
      /* Output the md5 sum.  */
2372
0
      if (emit_md5)
2373
0
  {
2374
0
    int b;
2375
2376
0
    for (b = 0; b < NUM_MD5_BYTES; b++)
2377
0
      out_byte (files[i].md5[b]);
2378
0
  }
2379
0
    }
2380
2381
0
  if (DWARF2_LINE_VERSION < 5)
2382
    /* Terminate filename list.  */
2383
0
    out_byte (0);
2384
0
}
2385
2386
/* Switch to SEC and output a header length field.  Return the size of
2387
   offsets used in SEC.  The caller must set EXPR->X_add_symbol value
2388
   to the end of the section.  EXPR->X_add_number will be set to the
2389
   negative size of the header.  */
2390
2391
static int
2392
out_header (asection *sec, expressionS *exp)
2393
0
{
2394
0
  symbolS *start_sym;
2395
0
  symbolS *end_sym;
2396
2397
0
  subseg_set (sec, 0);
2398
2399
0
  if (flag_dwarf_sections)
2400
0
    {
2401
      /* If we are going to put the start and end symbols in different
2402
   sections, then we need real symbols, not just fake, local ones.  */
2403
0
      frag_now_fix ();
2404
0
      start_sym = symbol_make (".Ldebug_line_start");
2405
0
      end_sym = symbol_make (".Ldebug_line_end");
2406
0
      symbol_set_value_now (start_sym);
2407
0
    }
2408
0
  else
2409
0
    {
2410
0
      start_sym = symbol_temp_new_now_octets ();
2411
0
      end_sym = symbol_temp_make ();
2412
0
    }
2413
2414
  /* Total length of the information.  */
2415
0
  exp->X_op = O_subtract;
2416
0
  exp->X_add_symbol = end_sym;
2417
0
  exp->X_op_symbol = start_sym;
2418
2419
0
  switch (DWARF2_FORMAT (sec))
2420
0
    {
2421
0
    case dwarf2_format_32bit:
2422
0
      exp->X_add_number = -4;
2423
0
      emit_expr (exp, 4);
2424
0
      return 4;
2425
2426
0
    case dwarf2_format_64bit:
2427
0
      exp->X_add_number = -12;
2428
0
      out_four (-1);
2429
0
      emit_expr (exp, 8);
2430
0
      return 8;
2431
2432
0
    case dwarf2_format_64bit_irix:
2433
0
      exp->X_add_number = -8;
2434
0
      emit_expr (exp, 8);
2435
0
      return 8;
2436
0
    }
2437
2438
0
  as_fatal (_("internal error: unknown dwarf2 format"));
2439
0
  return 0;
2440
0
}
2441
2442
/* Emit the collected .debug_line data.  */
2443
2444
static void
2445
out_debug_line (segT line_seg)
2446
0
{
2447
0
  expressionS exp;
2448
0
  symbolS *prologue_start, *prologue_end;
2449
0
  symbolS *line_end;
2450
0
  struct line_seg *s;
2451
0
  int sizeof_offset;
2452
2453
0
  memset (&exp, 0, sizeof exp);
2454
0
  sizeof_offset = out_header (line_seg, &exp);
2455
0
  line_end = exp.X_add_symbol;
2456
2457
  /* Version.  */
2458
0
  out_two (DWARF2_LINE_VERSION);
2459
2460
0
  if (DWARF2_LINE_VERSION >= 5)
2461
0
    {
2462
0
      out_byte (sizeof_address);
2463
0
      out_byte (0); /* Segment Selector size.  */
2464
0
    }
2465
  /* Length of the prologue following this length.  */
2466
0
  prologue_start = symbol_temp_make ();
2467
0
  prologue_end = symbol_temp_make ();
2468
0
  exp.X_op = O_subtract;
2469
0
  exp.X_add_symbol = prologue_end;
2470
0
  exp.X_op_symbol = prologue_start;
2471
0
  exp.X_add_number = 0;
2472
0
  emit_expr (&exp, sizeof_offset);
2473
0
  symbol_set_value_now (prologue_start);
2474
2475
  /* Parameters of the state machine.  */
2476
0
  out_byte (DWARF2_LINE_MIN_INSN_LENGTH);
2477
0
  if (DWARF2_LINE_VERSION >= 4)
2478
0
    out_byte (DWARF2_LINE_MAX_OPS_PER_INSN);
2479
0
  out_byte (DWARF2_LINE_DEFAULT_IS_STMT);
2480
0
  out_byte (DWARF2_LINE_BASE);
2481
0
  out_byte (DWARF2_LINE_RANGE);
2482
0
  out_byte (DWARF2_LINE_OPCODE_BASE);
2483
2484
  /* Standard opcode lengths.  */
2485
0
  out_byte (0);     /* DW_LNS_copy */
2486
0
  out_byte (1);     /* DW_LNS_advance_pc */
2487
0
  out_byte (1);     /* DW_LNS_advance_line */
2488
0
  out_byte (1);     /* DW_LNS_set_file */
2489
0
  out_byte (1);     /* DW_LNS_set_column */
2490
0
  out_byte (0);     /* DW_LNS_negate_stmt */
2491
0
  out_byte (0);     /* DW_LNS_set_basic_block */
2492
0
  out_byte (0);     /* DW_LNS_const_add_pc */
2493
0
  out_byte (1);     /* DW_LNS_fixed_advance_pc */
2494
0
  if (DWARF2_LINE_VERSION >= 3)
2495
0
    {
2496
0
      out_byte (0);     /* DW_LNS_set_prologue_end */
2497
0
      out_byte (0);     /* DW_LNS_set_epilogue_begin */
2498
0
      out_byte (1);     /* DW_LNS_set_isa */
2499
      /* We have emitted 12 opcode lengths, so make that this
2500
   matches up to the opcode base value we have been using.  */
2501
0
      gas_assert (DWARF2_LINE_OPCODE_BASE == 13);
2502
0
    }
2503
0
  else
2504
0
    gas_assert (DWARF2_LINE_OPCODE_BASE == 10);
2505
2506
0
  out_dir_and_file_list (line_seg, sizeof_offset);
2507
2508
0
  symbol_set_value_now (prologue_end);
2509
2510
  /* For each section, emit a statement program.  */
2511
0
  for (s = all_segs; s; s = s->next)
2512
    /* Paranoia - this check should have already have
2513
       been handled in dwarf2_gen_line_info_1().  */
2514
0
    if (s->head->head && SEG_NORMAL (s->seg))
2515
0
      process_entries (s->seg, s->head->head);
2516
2517
0
  if (flag_dwarf_sections)
2518
    /* We have to switch to the special .debug_line_end section
2519
       before emitting the end-of-debug_line symbol.  The linker
2520
       script arranges for this section to be placed after all the
2521
       (potentially garbage collected) .debug_line.<foo> sections.
2522
       This section contains the line_end symbol which is used to
2523
       compute the size of the linked .debug_line section, as seen
2524
       in the DWARF Line Number header.  */
2525
0
    subseg_set (subseg_get (".debug_line_end", false), 0);
2526
2527
0
  symbol_set_value_now (line_end);
2528
0
}
2529
2530
static void
2531
out_debug_ranges (segT ranges_seg, symbolS **ranges_sym)
2532
0
{
2533
0
  unsigned int addr_size = sizeof_address;
2534
0
  struct line_seg *s;
2535
0
  expressionS exp;
2536
0
  unsigned int i;
2537
2538
0
  memset (&exp, 0, sizeof exp);
2539
0
  subseg_set (ranges_seg, 0);
2540
2541
  /* For DW_AT_ranges to point at (there is no header, so really start
2542
     of section, but see out_debug_rnglists).  */
2543
0
  *ranges_sym = symbol_temp_new_now_octets ();
2544
2545
  /* Base Address Entry.  */
2546
0
  for (i = 0; i < addr_size; i++)
2547
0
    out_byte (0xff);
2548
0
  for (i = 0; i < addr_size; i++)
2549
0
    out_byte (0);
2550
2551
  /* Range List Entry.  */
2552
0
  for (s = all_segs; s; s = s->next)
2553
0
    {
2554
0
      fragS *frag;
2555
0
      symbolS *beg, *end;
2556
2557
0
      frag = first_frag_for_seg (s->seg);
2558
0
      beg = symbol_temp_new (s->seg, frag, 0);
2559
0
      s->text_start = beg;
2560
2561
0
      frag = last_frag_for_seg (s->seg);
2562
0
      end = symbol_temp_new (s->seg, frag, get_frag_fix (frag, s->seg));
2563
0
      s->text_end = end;
2564
2565
0
      exp.X_op = O_symbol;
2566
0
      exp.X_add_symbol = beg;
2567
0
      exp.X_add_number = 0;
2568
0
      emit_expr (&exp, addr_size);
2569
2570
0
      exp.X_op = O_symbol;
2571
0
      exp.X_add_symbol = end;
2572
0
      exp.X_add_number = 0;
2573
0
      emit_expr (&exp, addr_size);
2574
0
    }
2575
2576
  /* End of Range Entry.   */
2577
0
  for (i = 0; i < addr_size; i++)
2578
0
    out_byte (0);
2579
0
  for (i = 0; i < addr_size; i++)
2580
0
    out_byte (0);
2581
0
}
2582
2583
static void
2584
out_debug_rnglists (segT ranges_seg, symbolS **ranges_sym)
2585
0
{
2586
0
  expressionS exp;
2587
0
  symbolS *ranges_end;
2588
0
  struct line_seg *s;
2589
2590
  /* Unit length.  */
2591
0
  memset (&exp, 0, sizeof exp);
2592
0
  out_header (ranges_seg, &exp);
2593
0
  ranges_end = exp.X_add_symbol;
2594
2595
0
  out_two (DWARF2_RNGLISTS_VERSION);
2596
0
  out_byte (sizeof_address);
2597
0
  out_byte (0); /* Segment Selector size.  */
2598
0
  out_four (0); /* Offset entry count.  */
2599
2600
  /* For DW_AT_ranges to point at (must be after the header).   */
2601
0
  *ranges_sym = symbol_temp_new_now_octets ();
2602
2603
0
  for (s = all_segs; s; s = s->next)
2604
0
    {
2605
0
      fragS *frag;
2606
0
      symbolS *beg, *end;
2607
2608
0
      out_byte (DW_RLE_start_length);
2609
2610
0
      frag = first_frag_for_seg (s->seg);
2611
0
      beg = symbol_temp_new (s->seg, frag, 0);
2612
0
      s->text_start = beg;
2613
2614
0
      frag = last_frag_for_seg (s->seg);
2615
0
      end = symbol_temp_new (s->seg, frag, get_frag_fix (frag, s->seg));
2616
0
      s->text_end = end;
2617
2618
0
      exp.X_op = O_symbol;
2619
0
      exp.X_add_symbol = beg;
2620
0
      exp.X_add_number = 0;
2621
0
      emit_expr (&exp, sizeof_address);
2622
2623
0
      exp.X_op = O_symbol;
2624
0
      exp.X_add_symbol = end;
2625
0
      exp.X_add_number = 0;
2626
0
      emit_leb128_expr (&exp, 0);
2627
0
    }
2628
2629
0
  out_byte (DW_RLE_end_of_list);
2630
2631
0
  symbol_set_value_now (ranges_end);
2632
0
}
2633
2634
/* Emit data for .debug_aranges.  */
2635
2636
static void
2637
out_debug_aranges (segT aranges_seg, segT info_seg)
2638
0
{
2639
0
  unsigned int addr_size = sizeof_address;
2640
0
  offsetT size;
2641
0
  struct line_seg *s;
2642
0
  expressionS exp;
2643
0
  symbolS *aranges_end;
2644
0
  char *p;
2645
0
  int sizeof_offset;
2646
2647
0
  memset (&exp, 0, sizeof exp);
2648
0
  sizeof_offset = out_header (aranges_seg, &exp);
2649
0
  aranges_end = exp.X_add_symbol;
2650
0
  size = -exp.X_add_number;
2651
2652
  /* Version.  */
2653
0
  out_two (DWARF2_ARANGES_VERSION);
2654
0
  size += 2;
2655
2656
  /* Offset to .debug_info.  */
2657
0
  TC_DWARF2_EMIT_OFFSET (section_symbol (info_seg), sizeof_offset);
2658
0
  size += sizeof_offset;
2659
2660
  /* Size of an address (offset portion).  */
2661
0
  out_byte (addr_size);
2662
0
  size++;
2663
2664
  /* Size of a segment descriptor.  */
2665
0
  out_byte (0);
2666
0
  size++;
2667
2668
  /* Align the header.  */
2669
0
  while ((size++ % (2 * addr_size)) > 0)
2670
0
    out_byte (0);
2671
2672
0
  for (s = all_segs; s; s = s->next)
2673
0
    {
2674
0
      fragS *frag;
2675
0
      symbolS *beg, *end;
2676
2677
0
      frag = first_frag_for_seg (s->seg);
2678
0
      beg = symbol_temp_new (s->seg, frag, 0);
2679
0
      s->text_start = beg;
2680
2681
0
      frag = last_frag_for_seg (s->seg);
2682
0
      end = symbol_temp_new (s->seg, frag, get_frag_fix (frag, s->seg));
2683
0
      s->text_end = end;
2684
2685
0
      exp.X_op = O_symbol;
2686
0
      exp.X_add_symbol = beg;
2687
0
      exp.X_add_number = 0;
2688
0
      emit_expr (&exp, addr_size);
2689
2690
0
      exp.X_op = O_subtract;
2691
0
      exp.X_add_symbol = end;
2692
0
      exp.X_op_symbol = beg;
2693
0
      exp.X_add_number = 0;
2694
0
      emit_expr (&exp, addr_size);
2695
0
    }
2696
2697
0
  p = frag_more (2 * addr_size);
2698
0
  md_number_to_chars (p, 0, addr_size);
2699
0
  md_number_to_chars (p + addr_size, 0, addr_size);
2700
2701
0
  symbol_set_value_now (aranges_end);
2702
0
}
2703
2704
/* Emit data for .debug_abbrev.  Note that this must be kept in
2705
   sync with out_debug_info below.  */
2706
2707
static void
2708
out_debug_abbrev (segT abbrev_seg,
2709
      segT info_seg ATTRIBUTE_UNUSED,
2710
      segT line_seg ATTRIBUTE_UNUSED,
2711
      unsigned char *func_formP)
2712
0
{
2713
0
  int secoff_form;
2714
0
  bool have_efunc = false, have_lfunc = false;
2715
2716
  /* Check the symbol table for function symbols which also have their size
2717
     specified.  */
2718
0
  if (symbol_rootP)
2719
0
    {
2720
0
      symbolS *symp;
2721
2722
0
      for (symp = symbol_rootP; symp; symp = symbol_next (symp))
2723
0
  {
2724
    /* A warning construct is a warning symbol followed by the
2725
       symbol warned about.  Skip this and the following symbol.  */
2726
0
    if (symbol_get_bfdsym (symp)->flags & BSF_WARNING)
2727
0
      {
2728
0
        symp = symbol_next (symp);
2729
0
        if (!symp)
2730
0
          break;
2731
0
        continue;
2732
0
      }
2733
2734
0
    if (!S_IS_DEFINED (symp) || !S_IS_FUNCTION (symp))
2735
0
      continue;
2736
2737
0
#if defined (OBJ_ELF) /* || defined (OBJ_MAYBE_ELF) */
2738
0
    if (S_GET_SIZE (symp) == 0)
2739
0
      {
2740
0
        if (!IS_ELF || symbol_get_obj (symp)->size == NULL)
2741
0
    continue;
2742
0
      }
2743
#else
2744
    continue;
2745
#endif
2746
2747
0
    if (S_IS_EXTERNAL (symp))
2748
0
      have_efunc = true;
2749
0
    else
2750
0
      have_lfunc = true;
2751
0
  }
2752
0
    }
2753
2754
0
  subseg_set (abbrev_seg, 0);
2755
2756
0
  out_uleb128 (GAS_ABBREV_COMP_UNIT);
2757
0
  out_uleb128 (DW_TAG_compile_unit);
2758
0
  out_byte (have_efunc || have_lfunc ? DW_CHILDREN_yes : DW_CHILDREN_no);
2759
0
  if (DWARF2_VERSION < 4)
2760
0
    {
2761
0
      if (DWARF2_FORMAT (line_seg) == dwarf2_format_32bit)
2762
0
  secoff_form = DW_FORM_data4;
2763
0
      else
2764
0
  secoff_form = DW_FORM_data8;
2765
0
    }
2766
0
  else
2767
0
    secoff_form = DW_FORM_sec_offset;
2768
0
  out_abbrev (DW_AT_stmt_list, secoff_form);
2769
0
  if (all_segs->next == NULL)
2770
0
    {
2771
0
      out_abbrev (DW_AT_low_pc, DW_FORM_addr);
2772
0
      if (DWARF2_VERSION < 4)
2773
0
  out_abbrev (DW_AT_high_pc, DW_FORM_addr);
2774
0
      else
2775
0
  out_abbrev (DW_AT_high_pc, DW_FORM_udata);
2776
0
    }
2777
0
  else
2778
0
    out_abbrev (DW_AT_ranges, secoff_form);
2779
0
  out_abbrev (DW_AT_name, DW_FORM_strp);
2780
0
  out_abbrev (DW_AT_comp_dir, DW_FORM_strp);
2781
0
  out_abbrev (DW_AT_producer, DW_FORM_strp);
2782
0
  out_abbrev (DW_AT_language, DW_FORM_data2);
2783
0
  out_abbrev (0, 0);
2784
2785
0
  if (have_efunc || have_lfunc)
2786
0
    {
2787
0
      out_uleb128 (GAS_ABBREV_SUBPROG);
2788
0
      out_uleb128 (DW_TAG_subprogram);
2789
0
      out_byte (DW_CHILDREN_no);
2790
0
      out_abbrev (DW_AT_name, DW_FORM_strp);
2791
0
      if (have_efunc)
2792
0
  {
2793
0
    if (have_lfunc || DWARF2_VERSION < 4)
2794
0
      *func_formP = DW_FORM_flag;
2795
0
    else
2796
0
      *func_formP = DW_FORM_flag_present;
2797
0
    out_abbrev (DW_AT_external, *func_formP);
2798
0
  }
2799
0
      else
2800
  /* Any non-zero value other than DW_FORM_flag will do.  */
2801
0
  *func_formP = DW_FORM_block;
2802
2803
      /* PR 29517: Provide a return type for the function.  */
2804
0
      if (DWARF2_VERSION > 2)
2805
0
  out_abbrev (DW_AT_type, DW_FORM_ref_udata);
2806
2807
0
      out_abbrev (DW_AT_low_pc, DW_FORM_addr);
2808
0
      out_abbrev (DW_AT_high_pc,
2809
0
      DWARF2_VERSION < 4 ? DW_FORM_addr : DW_FORM_udata);
2810
0
      out_abbrev (0, 0);
2811
2812
0
      if (DWARF2_VERSION > 2)
2813
0
  {
2814
    /* PR 29517: We do not actually know the return type of these
2815
       functions, so provide an abbrev that uses DWARF's unspecified
2816
       type.  */
2817
0
    out_uleb128 (GAS_ABBREV_NO_TYPE);
2818
0
    out_uleb128 (DW_TAG_unspecified_type);
2819
0
    out_byte (DW_CHILDREN_no);
2820
0
    out_abbrev (0, 0);
2821
0
  }
2822
0
    }
2823
2824
  /* Terminate the abbreviations for this compilation unit.  */
2825
0
  out_byte (0);
2826
0
}
2827
2828
/* Emit a description of this compilation unit for .debug_info.  */
2829
2830
static void
2831
out_debug_info (segT info_seg, segT abbrev_seg, segT line_seg, segT str_seg,
2832
    symbolS *ranges_sym, symbolS *name_sym,
2833
    symbolS *comp_dir_sym, symbolS *producer_sym,
2834
    unsigned char func_form)
2835
0
{
2836
0
  expressionS exp;
2837
0
  symbolS *info_end;
2838
0
  int sizeof_offset;
2839
2840
0
  memset (&exp, 0, sizeof exp);
2841
0
  sizeof_offset = out_header (info_seg, &exp);
2842
0
  info_end = exp.X_add_symbol;
2843
2844
  /* DWARF version.  */
2845
0
  out_two (DWARF2_VERSION);
2846
2847
0
  if (DWARF2_VERSION < 5)
2848
0
    {
2849
      /* .debug_abbrev offset */
2850
0
      TC_DWARF2_EMIT_OFFSET (section_symbol (abbrev_seg), sizeof_offset);
2851
0
    }
2852
0
  else
2853
0
    {
2854
      /* unit (header) type */
2855
0
      out_byte (DW_UT_compile);
2856
0
    }
2857
2858
  /* Target address size.  */
2859
0
  out_byte (sizeof_address);
2860
2861
0
  if (DWARF2_VERSION >= 5)
2862
0
    {
2863
      /* .debug_abbrev offset */
2864
0
      TC_DWARF2_EMIT_OFFSET (section_symbol (abbrev_seg), sizeof_offset);
2865
0
    }
2866
2867
  /* DW_TAG_compile_unit DIE abbrev */
2868
0
  out_uleb128 (GAS_ABBREV_COMP_UNIT);
2869
2870
  /* DW_AT_stmt_list */
2871
0
  TC_DWARF2_EMIT_OFFSET (section_symbol (line_seg),
2872
0
       (DWARF2_FORMAT (line_seg) == dwarf2_format_32bit
2873
0
        ? 4 : 8));
2874
2875
  /* These two attributes are emitted if all of the code is contiguous.  */
2876
0
  if (all_segs->next == NULL)
2877
0
    {
2878
      /* DW_AT_low_pc */
2879
0
      exp.X_op = O_symbol;
2880
0
      exp.X_add_symbol = all_segs->text_start;
2881
0
      exp.X_add_number = 0;
2882
0
      emit_expr (&exp, sizeof_address);
2883
2884
      /* DW_AT_high_pc */
2885
0
      if (DWARF2_VERSION < 4)
2886
0
  exp.X_op = O_symbol;
2887
0
      else
2888
0
  {
2889
0
    exp.X_op = O_subtract;
2890
0
    exp.X_op_symbol = all_segs->text_start;
2891
0
  }
2892
0
      exp.X_add_symbol = all_segs->text_end;
2893
0
      exp.X_add_number = 0;
2894
0
      if (DWARF2_VERSION < 4)
2895
0
  emit_expr (&exp, sizeof_address);
2896
0
      else
2897
0
  emit_leb128_expr (&exp, 0);
2898
0
    }
2899
0
  else
2900
0
    {
2901
      /* This attribute is emitted if the code is disjoint.  */
2902
      /* DW_AT_ranges.  */
2903
0
      TC_DWARF2_EMIT_OFFSET (ranges_sym, sizeof_offset);
2904
0
    }
2905
2906
  /* DW_AT_name, DW_AT_comp_dir and DW_AT_producer.  Symbols in .debug_str
2907
     setup in out_debug_str below.  */
2908
0
  TC_DWARF2_EMIT_OFFSET (name_sym, sizeof_offset);
2909
0
  TC_DWARF2_EMIT_OFFSET (comp_dir_sym, sizeof_offset);
2910
0
  TC_DWARF2_EMIT_OFFSET (producer_sym, sizeof_offset);
2911
2912
  /* DW_AT_language.  Yes, this is probably not really MIPS, but the
2913
     dwarf2 draft has no standard code for assembler.  */
2914
0
  out_two (DW_LANG_Mips_Assembler);
2915
2916
0
  if (func_form)
2917
0
    {
2918
0
      symbolS *symp;
2919
0
      symbolS *no_type_tag;
2920
2921
0
      if (DWARF2_VERSION > 2)
2922
0
  no_type_tag = symbol_make (".Ldebug_no_type_tag");
2923
0
      else
2924
0
  no_type_tag = NULL;
2925
2926
0
      for (symp = symbol_rootP; symp; symp = symbol_next (symp))
2927
0
  {
2928
0
    const char *name;
2929
0
    size_t len;
2930
0
    expressionS size = { .X_op = O_constant };
2931
2932
    /* Skip warning constructs (see above).  */
2933
0
    if (symbol_get_bfdsym (symp)->flags & BSF_WARNING)
2934
0
      {
2935
0
        symp = symbol_next (symp);
2936
0
        if (!symp)
2937
0
          break;
2938
0
        continue;
2939
0
      }
2940
2941
0
    if (!S_IS_DEFINED (symp) || !S_IS_FUNCTION (symp))
2942
0
      continue;
2943
2944
0
#if defined (OBJ_ELF) /* || defined (OBJ_MAYBE_ELF) */
2945
0
    size.X_add_number = S_GET_SIZE (symp);
2946
0
    if (size.X_add_number == 0 && IS_ELF
2947
0
        && symbol_get_obj (symp)->size != NULL)
2948
0
      {
2949
0
        size.X_op = O_add;
2950
0
        size.X_op_symbol = make_expr_symbol (symbol_get_obj (symp)->size);
2951
0
      }
2952
0
#endif
2953
0
    if (size.X_op == O_constant && size.X_add_number == 0)
2954
0
      continue;
2955
2956
0
    subseg_set (str_seg, 0);
2957
0
    name_sym = symbol_temp_new_now_octets ();
2958
0
    name = S_GET_NAME (symp);
2959
0
    len = strlen (name) + 1;
2960
0
    memcpy (frag_more (len), name, len);
2961
2962
0
    subseg_set (info_seg, 0);
2963
2964
    /* DW_TAG_subprogram DIE abbrev */
2965
0
    out_uleb128 (GAS_ABBREV_SUBPROG);
2966
2967
    /* DW_AT_name */
2968
0
    TC_DWARF2_EMIT_OFFSET (name_sym, sizeof_offset);
2969
2970
    /* DW_AT_external.  */
2971
0
    if (func_form == DW_FORM_flag)
2972
0
      out_byte (S_IS_EXTERNAL (symp));
2973
2974
    /* PR 29517: Let consumers know that we do not have
2975
       return type information for this function.  */
2976
0
    if (DWARF2_VERSION > 2)
2977
0
      {
2978
0
        exp.X_op = O_symbol;
2979
0
        exp.X_add_symbol = no_type_tag;
2980
0
        exp.X_add_number = 0;
2981
0
        emit_leb128_expr (&exp, 0);
2982
0
      }
2983
2984
    /* DW_AT_low_pc */
2985
0
    exp.X_op = O_symbol;
2986
0
    exp.X_add_symbol = symp;
2987
0
    exp.X_add_number = 0;
2988
0
    emit_expr (&exp, sizeof_address);
2989
2990
    /* DW_AT_high_pc */
2991
0
    if (DWARF2_VERSION < 4)
2992
0
      {
2993
0
        if (size.X_op == O_constant)
2994
0
    size.X_op = O_symbol;
2995
0
        size.X_add_symbol = symp;
2996
0
        emit_expr (&size, sizeof_address);
2997
0
      }
2998
0
    else if (size.X_op == O_constant)
2999
0
      out_uleb128 (size.X_add_number);
3000
0
    else
3001
0
      emit_leb128_expr (symbol_get_value_expression (size.X_op_symbol), 0);
3002
0
  }
3003
3004
0
      if (DWARF2_VERSION > 2)
3005
0
  {
3006
    /* PR 29517: Generate a DIE for the unspecified type abbrev.
3007
       We do it here because it cannot be part of the top level DIE.   */
3008
0
    subseg_set (info_seg, 0);
3009
0
    symbol_set_value_now (no_type_tag);
3010
0
    out_uleb128 (GAS_ABBREV_NO_TYPE);
3011
0
  }
3012
3013
      /* End of children.  */
3014
0
      out_leb128 (0);
3015
0
    }
3016
3017
0
  symbol_set_value_now (info_end);
3018
0
}
3019
3020
/* Emit the three debug strings needed in .debug_str and setup symbols
3021
   to them for use in out_debug_info.  */
3022
static void
3023
out_debug_str (segT str_seg, symbolS **name_sym, symbolS **comp_dir_sym,
3024
         symbolS **producer_sym)
3025
0
{
3026
0
  char producer[128];
3027
0
  char *p;
3028
0
  int len;
3029
0
  int first_file = DWARF2_LINE_VERSION > 4 ? 0 : 1;
3030
3031
0
  if (files_in_use == 0)
3032
0
    abort ();
3033
0
  if (first_file == 0 && files[first_file].filename == NULL)
3034
0
    first_file = 1;
3035
3036
0
  subseg_set (str_seg, 0);
3037
3038
  /* DW_AT_name.  We don't have the actual file name that was present
3039
     on the command line, so assume files[first_file] is the main input file.
3040
     We're not supposed to get called unless at least one line number
3041
     entry was emitted, so this should always be defined.  */
3042
0
  *name_sym = symbol_temp_new_now_octets ();
3043
3044
0
  if (files[first_file].dir)
3045
0
    {
3046
0
      char *dirname = remap_debug_filename (dirs[files[first_file].dir]);
3047
0
      len = strlen (dirname);
3048
#ifdef TE_VMS
3049
      /* Already has trailing slash.  */
3050
      p = frag_more (len);
3051
      memcpy (p, dirname, len);
3052
#else
3053
0
      p = frag_more (len + 1);
3054
0
      memcpy (p, dirname, len);
3055
0
      INSERT_DIR_SEPARATOR (p, len);
3056
0
#endif
3057
0
      free (dirname);
3058
0
    }
3059
0
  len = strlen (files[first_file].filename) + 1;
3060
0
  p = frag_more (len);
3061
0
  memcpy (p, files[first_file].filename, len);
3062
3063
  /* DW_AT_comp_dir */
3064
0
  *comp_dir_sym = symbol_temp_new_now_octets ();
3065
0
  char *comp_dir = remap_debug_filename (getpwd ());
3066
0
  len = strlen (comp_dir) + 1;
3067
0
  p = frag_more (len);
3068
0
  memcpy (p, comp_dir, len);
3069
0
  free (comp_dir);
3070
3071
  /* DW_AT_producer */
3072
0
  *producer_sym = symbol_temp_new_now_octets ();
3073
0
  sprintf (producer, "GNU AS %s", VERSION);
3074
0
  len = strlen (producer) + 1;
3075
0
  p = frag_more (len);
3076
0
  memcpy (p, producer, len);
3077
0
}
3078
3079
void
3080
dwarf2_init (void)
3081
0
{
3082
0
  all_segs = NULL;
3083
0
  last_seg_ptr = &all_segs;
3084
0
  files = NULL;
3085
0
  files_in_use = 0;
3086
0
  files_allocated = 0;
3087
0
  dirs = NULL;
3088
0
  dirs_in_use = 0;
3089
0
  dirs_allocated = 0;
3090
0
  dwarf2_loc_directive_seen = false;
3091
0
  dwarf2_any_loc_directive_seen = false;
3092
0
  dwarf2_loc_mark_labels = false;
3093
0
  current.filenum = 1;
3094
0
  current.line = 1;
3095
0
  current.column = 0;
3096
0
  current.isa = 0;
3097
0
  current.flags = DWARF2_LINE_DEFAULT_IS_STMT ? DWARF2_FLAG_IS_STMT : 0;
3098
0
  current.discriminator = 0;
3099
0
  current.u.view = NULL;
3100
0
  force_reset_view = NULL;
3101
0
  view_assert_failed = NULL;
3102
0
  dw2_line = -1;
3103
0
  dw2_filename = NULL;
3104
0
  label_num = 0;
3105
0
  last_used = -1;
3106
3107
  /* Select the default CIE version to produce here.  The global
3108
     starts with a value of -1 and will be modified to a valid value
3109
     either by the user providing a command line option, or some
3110
     targets will select their own default in md_after_parse_args.  If
3111
     we get here and the global still contains -1 then it is up to us
3112
     to pick a sane default.  The default we choose is 1, this is the
3113
     CIE version gas has produced for a long time, and there seems no
3114
     reason to change it yet.  */
3115
0
  if (flag_dwarf_cie_version == -1)
3116
0
    flag_dwarf_cie_version = 1;
3117
0
}
3118
3119
static void
3120
dwarf2_cleanup (void)
3121
0
{
3122
0
  purge_generated_debug (true);
3123
0
  free (files);
3124
0
  for (unsigned int i = 0; i < dirs_in_use; i++)
3125
0
    free (dirs[i]);
3126
0
  free (dirs);
3127
0
}
3128
3129
/* Finish the dwarf2 debug sections.  We emit .debug.line if there
3130
   were any .file/.loc directives, or --gdwarf2 was given, and if the
3131
   file has a non-empty .debug_info section and an empty .debug_line
3132
   section.  If we emit .debug_line, and the .debug_info section is
3133
   empty, we also emit .debug_info, .debug_aranges and .debug_abbrev.
3134
   ALL_SEGS will be non-null if there were any .file/.loc directives,
3135
   or --gdwarf2 was given and there were any located instructions
3136
   emitted.  */
3137
3138
void
3139
dwarf2_finish (void)
3140
0
{
3141
0
  segT line_seg;
3142
0
  struct line_seg *s;
3143
0
  segT info_seg;
3144
0
  int emit_other_sections = 0;
3145
0
  int empty_debug_line = 0;
3146
3147
0
  info_seg = bfd_get_section_by_name (stdoutput, ".debug_info");
3148
0
  emit_other_sections = info_seg == NULL || !seg_not_empty_p (info_seg);
3149
3150
0
  line_seg = bfd_get_section_by_name (stdoutput, ".debug_line");
3151
0
  empty_debug_line = line_seg == NULL || !seg_not_empty_p (line_seg);
3152
3153
  /* We can't construct a new debug_line section if we already have one.
3154
     Give an error if we have seen any .loc, otherwise trust the user
3155
     knows what they are doing and want to generate the .debug_line
3156
     (and all other debug sections) themselves.  */
3157
0
  if (all_segs && !empty_debug_line && dwarf2_any_loc_directive_seen)
3158
0
    as_fatal ("duplicate .debug_line sections");
3159
3160
0
  if ((!all_segs && emit_other_sections)
3161
0
      || (!emit_other_sections && !empty_debug_line))
3162
    /* If there is no line information and no non-empty .debug_info
3163
       section, or if there is both a non-empty .debug_info and a non-empty
3164
       .debug_line, then we do nothing.  */
3165
0
    {
3166
0
      dwarf2_cleanup ();
3167
0
      return;
3168
0
    }
3169
3170
  /* Calculate the size of an address for the target machine.  */
3171
0
  sizeof_address = DWARF2_ADDR_SIZE (stdoutput);
3172
3173
  /* Create and switch to the line number section.  */
3174
0
  if (empty_debug_line)
3175
0
    {
3176
0
      line_seg = subseg_new (".debug_line", 0);
3177
0
      bfd_set_section_flags (line_seg,
3178
0
           SEC_READONLY | SEC_DEBUGGING | SEC_OCTETS);
3179
0
    }
3180
3181
0
  for (s = all_segs; s; s = s->next)
3182
0
    {
3183
0
      struct line_subseg *lss;
3184
3185
0
      for (lss = s->head; lss; lss = lss->next)
3186
0
  if (lss->head)
3187
0
    do_allocate_filenum (lss->head);
3188
0
    }
3189
3190
  /* For each subsection, chain the debug entries together.  */
3191
0
  for (s = all_segs; s; s = s->next)
3192
0
    {
3193
0
      struct line_subseg *lss = s->head;
3194
0
      struct line_entry **ptail = lss->ptail;
3195
3196
      /* Reset the initial view of the first subsection of the
3197
   section.  */
3198
0
      if (lss->head && lss->head->loc.u.view)
3199
0
  set_or_check_view (lss->head, NULL, NULL);
3200
3201
0
      while ((lss = lss->next) != NULL)
3202
0
  {
3203
    /* Link the first view of subsequent subsections to the
3204
       previous view.  */
3205
0
    if (lss->head && lss->head->loc.u.view)
3206
0
      set_or_check_view (lss->head, line_entry_at_tail (s->head, ptail),
3207
0
             s->head ? s->head->head : NULL);
3208
0
    *ptail = lss->head;
3209
0
    lss->head = NULL;
3210
0
    ptail = lss->ptail;
3211
0
  }
3212
0
    }
3213
3214
0
  if (empty_debug_line)
3215
0
    out_debug_line (line_seg);
3216
3217
  /* If this is assembler generated line info, and there is no
3218
     debug_info already, we need .debug_info, .debug_abbrev and
3219
     .debug_str sections as well.  */
3220
0
  if (emit_other_sections)
3221
0
    {
3222
0
      segT abbrev_seg;
3223
0
      segT aranges_seg;
3224
0
      segT str_seg;
3225
0
      symbolS *name_sym, *comp_dir_sym, *producer_sym, *ranges_sym;
3226
0
      unsigned char func_form = 0;
3227
3228
0
      gas_assert (all_segs);
3229
3230
0
      info_seg = subseg_new (".debug_info", 0);
3231
0
      abbrev_seg = subseg_new (".debug_abbrev", 0);
3232
0
      aranges_seg = subseg_new (".debug_aranges", 0);
3233
0
      str_seg = subseg_new (".debug_str", 0);
3234
3235
0
      bfd_set_section_flags (info_seg,
3236
0
            SEC_READONLY | SEC_DEBUGGING | SEC_OCTETS);
3237
0
      bfd_set_section_flags (abbrev_seg,
3238
0
            SEC_READONLY | SEC_DEBUGGING | SEC_OCTETS);
3239
0
      bfd_set_section_flags (aranges_seg,
3240
0
            SEC_READONLY | SEC_DEBUGGING | SEC_OCTETS);
3241
0
      bfd_set_section_flags (str_seg,
3242
0
            SEC_READONLY | SEC_DEBUGGING | SEC_OCTETS
3243
0
               | SEC_MERGE | SEC_STRINGS);
3244
0
      str_seg->entsize = 1;
3245
3246
0
      record_alignment (aranges_seg, ffs (2 * sizeof_address) - 1);
3247
3248
0
      if (all_segs->next == NULL)
3249
0
  ranges_sym = NULL;
3250
0
      else
3251
0
  {
3252
0
    if (DWARF2_VERSION < 5)
3253
0
      {
3254
0
        segT ranges_seg = subseg_new (".debug_ranges", 0);
3255
0
        bfd_set_section_flags (ranges_seg, (SEC_READONLY
3256
0
              | SEC_DEBUGGING
3257
0
              | SEC_OCTETS));
3258
0
        record_alignment (ranges_seg, ffs (2 * sizeof_address) - 1);
3259
0
        out_debug_ranges (ranges_seg, &ranges_sym);
3260
0
      }
3261
0
    else
3262
0
      {
3263
0
        segT rnglists_seg = subseg_new (".debug_rnglists", 0);
3264
0
        bfd_set_section_flags (rnglists_seg, (SEC_READONLY
3265
0
                | SEC_DEBUGGING
3266
0
                | SEC_OCTETS));
3267
0
        out_debug_rnglists (rnglists_seg, &ranges_sym);
3268
0
      }
3269
0
  }
3270
3271
0
      out_debug_aranges (aranges_seg, info_seg);
3272
0
      out_debug_abbrev (abbrev_seg, info_seg, line_seg, &func_form);
3273
0
      out_debug_str (str_seg, &name_sym, &comp_dir_sym, &producer_sym);
3274
0
      out_debug_info (info_seg, abbrev_seg, line_seg, str_seg,
3275
0
          ranges_sym, name_sym, comp_dir_sym, producer_sym,
3276
0
          func_form);
3277
0
    }
3278
0
  dwarf2_cleanup ();
3279
0
}
3280
3281
/* Perform any deferred checks pertaining to debug information.  */
3282
3283
void
3284
dwarf2dbg_final_check (void)
3285
0
{
3286
  /* Perform reset-view checks.  Don't evaluate view_assert_failed
3287
     recursively: it could be very deep.  It's a chain of adds, with
3288
     each chain element pointing to the next in X_add_symbol, and
3289
     holding the check value in X_op_symbol.  */
3290
0
  while (view_assert_failed)
3291
0
    {
3292
0
      expressionS *exp;
3293
0
      symbolS *sym;
3294
0
      offsetT failed;
3295
3296
0
      gas_assert (!symbol_resolved_p (view_assert_failed));
3297
3298
0
      exp = symbol_get_value_expression (view_assert_failed);
3299
0
      sym = view_assert_failed;
3300
3301
      /* If view_assert_failed looks like a compound check in the
3302
   chain, break it up.  */
3303
0
      if (exp->X_op == O_add && exp->X_add_number == 0 && exp->X_unsigned)
3304
0
  {
3305
0
    view_assert_failed = exp->X_add_symbol;
3306
0
    sym = exp->X_op_symbol;
3307
0
  }
3308
0
      else
3309
0
  view_assert_failed = NULL;
3310
3311
0
      failed = resolve_symbol_value (sym);
3312
0
      if (!symbol_resolved_p (sym) || failed)
3313
0
  {
3314
0
    as_bad (_("view number mismatch"));
3315
0
    break;
3316
0
  }
3317
0
    }
3318
0
}