Coverage Report

Created: 2026-03-10 08:46

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/binutils-gdb/gas/dwarf2dbg.c
Line
Count
Source
1
/* dwarf2dbg.c - DWARF2 debug support
2
   Copyright (C) 1999-2026 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
3
# define INSERT_DIR_SEPARATOR(string, offset) string[offset] = '/'
58
#endif
59
60
#ifndef DWARF2_FORMAT
61
64
# 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
16
#define DWARF2_FILE_NAME(FILENAME, DIRNAME) FILENAME
70
#endif
71
72
#ifndef DWARF2_FILE_TIME_NAME
73
16
#define DWARF2_FILE_TIME_NAME(FILENAME,DIRNAME) -1
74
#endif
75
76
#ifndef DWARF2_FILE_SIZE_NAME
77
16
#define DWARF2_FILE_SIZE_NAME(FILENAME,DIRNAME) -1
78
#endif
79
80
#ifndef DWARF2_VERSION
81
9.42k
#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
16
#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
9.30k
#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
1.19k
# 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
3.39k
#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
3.14k
# 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
5.32k
# 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
2.44k
# define DWARF2_LINE_MIN_INSN_LENGTH  1
139
#endif
140
141
/* Flag that indicates the initial value of the is_stmt_start flag.  */
142
239
#define DWARF2_LINE_DEFAULT_IS_STMT 1
143
144
#ifndef DWARF2_LINE_MAX_OPS_PER_INSN
145
16
#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
1.71k
#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
1.71k
#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
32
#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
72
#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
139
#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
139
{
264
139
  expressionS exp;
265
266
139
  memset (&exp, 0, sizeof exp);
267
139
  exp.X_op = O_symbol;
268
139
  exp.X_add_symbol = symbol;
269
139
  exp.X_add_number = 0;
270
139
  emit_expr (&exp, size);
271
139
}
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
1.19k
{
279
1.19k
  struct line_seg *s = seg_info (seg)->dwarf2_line_seg;
280
1.19k
  struct line_subseg **pss, *lss;
281
282
1.19k
  if (s == NULL)
283
16
    {
284
16
      if (!create_p)
285
0
  return NULL;
286
287
16
      s = XNEW (struct line_seg);
288
16
      s->next = NULL;
289
16
      s->seg = seg;
290
16
      s->head = NULL;
291
16
      *last_seg_ptr = s;
292
16
      last_seg_ptr = &s->next;
293
16
      seg_info (seg)->dwarf2_line_seg = s;
294
16
    }
295
296
1.19k
  gas_assert (seg == s->seg);
297
298
1.20k
  for (pss = &s->head; (lss = *pss) != NULL ; pss = &lss->next)
299
1.18k
    {
300
1.18k
      if (lss->subseg == subseg)
301
1.17k
  goto found_subseg;
302
7
      if (lss->subseg > subseg)
303
1
  break;
304
7
    }
305
306
19
  lss = XNEW (struct line_subseg);
307
19
  lss->next = *pss;
308
19
  lss->subseg = subseg;
309
19
  lss->head = NULL;
310
19
  lss->ptail = &lss->head;
311
19
  lss->pmove_tail = &lss->head;
312
19
  *pss = lss;
313
314
1.19k
 found_subseg:
315
1.19k
  return lss;
316
19
}
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
1.19k
{
511
1.19k
  struct line_subseg *lss;
512
1.19k
  struct line_entry *e;
513
1.19k
  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
1.19k
  if (IS_ELF)
519
1.19k
    need_flags |= SEC_ALLOC;
520
1.19k
  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
1.19k
  e = XNEW (struct line_entry);
530
1.19k
  e->next = NULL;
531
1.19k
  e->label = label;
532
1.19k
  e->loc = *loc;
533
534
1.19k
  lss = get_line_subseg (now_seg, now_subseg, true);
535
536
  /* Subseg heads are chained to previous subsegs in
537
     dwarf2_finish.  */
538
1.19k
  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
1.19k
  *lss->ptail = e;
543
1.19k
  lss->ptail = &e->next;
544
1.19k
}
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
1.22k
{
555
1.22k
  symbolS *sym;
556
557
  /* Early out for as-yet incomplete location information.  */
558
1.22k
  if (loc->line == 0)
559
24
    return;
560
1.19k
  if (loc->filenum == 0)
561
1.19k
    {
562
1.19k
      if (dwarf_level < 5)
563
0
  dwarf_level = 5;
564
1.19k
      if (DWARF2_LINE_VERSION < 5)
565
0
  return;
566
1.19k
    }
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
1.19k
  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
1.19k
  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
1.19k
  else
600
1.19k
    sym = symbol_temp_new (now_seg, frag_now, ofs);
601
1.19k
  dwarf2_gen_line_info_1 (sym, loc);
602
1.19k
}
603
604
static const char *
605
get_basename (const char * pathname)
606
49
{
607
49
  const char * file;
608
609
49
  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
49
  if (file == pathname + 1)
616
0
    file = pathname;
617
49
#endif
618
49
  return file;
619
49
}
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
54
{
627
54
  unsigned int d;
628
629
54
  if (dirlen == 0)
630
25
    return 0;
631
632
29
#ifndef DWARF2_DIR_SHOULD_END_WITH_SEPARATOR
633
29
  if (IS_DIR_SEPARATOR (dirname[dirlen - 1]))
634
16
    {
635
16
      -- dirlen;
636
16
      if (dirlen == 0)
637
0
  return 0;
638
16
    }
639
29
#endif
640
641
81
  for (d = 0; d < dirs_in_use; ++d)
642
52
    {
643
52
      if (dirs[d] != NULL
644
45
    && filename_ncmp (dirname, dirs[d], dirlen) == 0
645
0
    && dirs[d][dirlen] == '\0')
646
0
  return d;
647
52
    }
648
649
29
  if (can_use_zero)
650
17
    {
651
17
      if (dirs == NULL || dirs[0] == NULL)
652
17
  {
653
17
    const char * pwd = file0_dirname ? file0_dirname : getpwd ();
654
655
17
    if (dwarf_level >= 5 && filename_cmp (dirname, pwd) != 0)
656
6
      {
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
6
        (void) get_directory_table_entry (pwd, pwd, strlen (pwd), true);
663
6
        d = dirs_in_use;
664
6
      }
665
11
    else
666
11
      d = 0;
667
17
  }
668
17
    }
669
12
  else if (d == 0)
670
4
    d = 1;
671
672
29
  if (d >= dirs_allocated)
673
14
    {
674
14
      unsigned int old = dirs_allocated;
675
14
#define DIR_TABLE_INCREMENT 32
676
14
      dirs_allocated = d + DIR_TABLE_INCREMENT;
677
14
      dirs = XRESIZEVEC (char *, dirs, dirs_allocated);
678
14
      memset (dirs + old, 0, (dirs_allocated - old) * sizeof (char *));
679
14
    }
680
681
29
  dirs[d] = xmemdup0 (dirname, dirlen);
682
29
  if (dirs_in_use <= d)
683
28
    dirs_in_use = d + 1;
684
685
29
  return d;  
686
29
}
687
688
static bool
689
assign_file_to_slot (valueT i, const char *file, unsigned int dir)
690
48
{
691
48
  if (i >= files_allocated)
692
48
    {
693
48
      unsigned int want = i + 32;
694
695
      /* If this array is taking 1G or more, someone is using silly
696
   file numbers.  */
697
48
      if (want < i || want > UINT_MAX / 4 / sizeof (struct file_entry))
698
13
  {
699
13
    as_bad (_("file number %" PRIu64 " is too big"), (uint64_t) i);
700
13
    return false;
701
13
  }
702
703
35
      files = XRESIZEVEC (struct file_entry, files, want);
704
35
      memset (files + files_allocated, 0,
705
35
        (want - files_allocated) * sizeof (struct file_entry));
706
35
      files_allocated = want;
707
35
    }
708
709
35
  files[i].filename = file;
710
35
  files[i].dir = dir;
711
35
  memset (files[i].md5, 0, NUM_MD5_BYTES);
712
713
35
  if (files_in_use < i + 1)
714
35
    files_in_use = i + 1;
715
716
35
  return true;
717
48
}
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
19
{
791
19
  do
792
1.19k
    {
793
1.19k
      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
1.19k
      e = e->next;
799
1.19k
    }
800
1.19k
  while (e);
801
19
}
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
207
{
810
207
  struct line_seg *s, *nexts;
811
812
223
  for (s = all_segs; s; s = nexts)
813
16
    {
814
16
      struct line_subseg *lss, *nextlss;
815
816
35
      for (lss = s->head; lss; lss = nextlss)
817
19
  {
818
19
    struct line_entry *e, *next;
819
820
1.21k
    for (e = lss->head; e; e = next)
821
1.19k
      {
822
1.19k
        if (!thelot)
823
1.19k
    know (e->loc.filenum == -1u);
824
1.19k
        next = e->next;
825
1.19k
        free (e);
826
1.19k
      }
827
828
19
    lss->head = NULL;
829
19
    lss->ptail = &lss->head;
830
19
    lss->pmove_tail = &lss->head;
831
19
    nextlss = lss->next;
832
19
    if (thelot)
833
19
      free (lss);
834
19
  }
835
16
      nexts = s->next;
836
16
      if (thelot)
837
16
  {
838
16
    seg_info (s->seg)->dwarf2_line_seg = NULL;
839
16
    free (s);
840
16
  }
841
16
    }
842
207
}
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
72
{
856
72
  const char *file;
857
72
  size_t dirlen;
858
72
  unsigned int i, d;
859
72
  const char *file0_dirname;
860
861
  /* Short circuit the common case of adding the same pathname
862
     as last time.  */
863
72
  if (num < files_allocated && files[num].filename != NULL)
864
24
    {
865
24
      const char * dir = NULL;
866
867
24
      if (dirs != NULL)
868
20
  dir = dirs[files[num].dir];
869
870
24
      if (with_md5
871
2
    && memcmp (generic_bignum, files[num].md5, NUM_MD5_BYTES) != 0)
872
0
  goto fail;
873
874
24
      if (dirname != NULL)
875
10
  {
876
10
    if (dir != NULL && filename_cmp (dir, dirname) != 0)
877
1
      goto fail;
878
      
879
9
    if (filename_cmp (filename, files[num].filename) != 0)
880
3
      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
6
    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
6
    return true;
898
9
  }
899
14
      else if (dir != NULL) 
900
11
  {
901
11
    dirlen = strlen (dir);
902
11
    if (filename_ncmp (filename, dir, dirlen) == 0
903
11
        && IS_DIR_SEPARATOR (filename [dirlen])
904
7
        && filename_cmp (filename + dirlen + 1, files[num].filename) == 0)
905
7
      return true;
906
11
  }
907
3
      else /* dir == NULL  */
908
3
  {
909
3
    file = get_basename (filename);
910
3
    if (filename_cmp (file, files[num].filename) == 0)
911
2
      {
912
        /* The filenames match, but the directory table entry is empty.
913
     Fill it with the provided directory name.  */
914
2
        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
2
        return true;
927
2
      }
928
3
  }
929
930
9
    fail:
931
9
      as_bad (_("file table slot %u is already occupied by a different file"
932
9
    " (%s%s%s vs %s%s%s)"),
933
9
        (unsigned int) num,
934
9
        dir == NULL ? "" : dir,
935
9
        dir == NULL ? "" : "/",
936
9
        files[num].filename,
937
9
        dirname == NULL ? "" : dirname,
938
9
        dirname == NULL ? "" : "/",
939
9
        filename);
940
9
      return false;
941
24
    }
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
48
  if (num == 0)
946
32
    {
947
32
      file0_dirname = dirname;
948
949
32
      file = get_basename (filename);
950
951
32
      if (dirname && file == filename)
952
5
  dirlen = strlen (dirname);
953
27
      else
954
27
  {
955
27
    dirname = filename;
956
27
    dirlen = file - filename;
957
27
  }
958
32
    }
959
16
  else
960
16
    {
961
16
      file0_dirname = NULL;
962
963
16
      if (dirname == NULL)
964
14
  {
965
14
    dirname = filename;
966
14
    file = get_basename (filename);
967
14
    dirlen = file - filename;
968
14
  }
969
2
      else
970
2
  {
971
2
    dirlen = strlen (dirname);
972
2
    file = filename;
973
2
  }
974
16
    }
975
976
48
  d = get_directory_table_entry (dirname, file0_dirname, dirlen, num == 0);
977
48
  i = num;
978
979
48
  if (!assign_file_to_slot (num, file, d))
980
13
    return false;
981
982
35
  if (with_md5)
983
1
    {
984
1
      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
1
      else
1007
1
  {
1008
1
    unsigned int     bits_remaining = NUM_MD5_BYTES * BITS_PER_CHAR;
1009
1
    unsigned int     byte = 0;
1010
1
    unsigned int     bignum_index = 0;
1011
1012
9
    while (bits_remaining)
1013
8
      {
1014
8
        unsigned int bignum_bits_remaining = LITTLENUM_NUMBER_OF_BITS;
1015
8
        valueT       bignum_value = generic_bignum [bignum_index];
1016
1017
8
        bignum_index ++;
1018
1019
24
        while (bignum_bits_remaining)
1020
16
    {
1021
16
      files[i].md5[byte++] = bignum_value & 0xff;
1022
16
      bignum_value >>= 8;
1023
16
      bignum_bits_remaining -= 8;
1024
16
      bits_remaining -= 8;
1025
16
    }
1026
8
      }
1027
1
  }
1028
1
    }
1029
34
  else
1030
34
    memset (files[i].md5, 0, NUM_MD5_BYTES);
1031
1032
35
  return true;
1033
48
}
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
1.22k
{
1043
1.22k
  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
1.22k
  else
1053
1.22k
    *line = current;
1054
1.22k
}
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
68.4k
{
1073
68.4k
  struct dwarf2_line_info loc;
1074
1075
68.4k
  seg_info (now_seg)->insn_seen = 1;
1076
1077
68.4k
  if (debug_type != DEBUG_DWARF2
1078
68.4k
      ? !dwarf2_loc_directive_seen
1079
68.4k
      : !seen_at_least_1_file ())
1080
67.1k
    return;
1081
1082
1.22k
  dwarf2_where (&loc);
1083
1084
1.22k
  dwarf2_gen_line_info ((frag_now_fix_octets () - size) / OCTETS_PER_BYTE, &loc);
1085
1.22k
  dwarf2_consume_line_info ();
1086
1.22k
}
1087
1088
/* Move all previously-emitted line entries for the current position by
1089
   DELTA bytes.  This function cannot be used to move the same entries
1090
   twice.  */
1091
1092
void
1093
dwarf2_move_insn (int delta)
1094
0
{
1095
0
  struct line_subseg *lss;
1096
0
  struct line_entry *e;
1097
0
  valueT now;
1098
1099
0
  if (delta == 0)
1100
0
    return;
1101
1102
0
  lss = get_line_subseg (now_seg, now_subseg, false);
1103
0
  if (!lss)
1104
0
    return;
1105
1106
0
  now = frag_now_fix ();
1107
0
  while ((e = *lss->pmove_tail))
1108
0
    {
1109
0
      if (S_GET_VALUE (e->label) == now)
1110
0
  S_SET_VALUE (e->label, now + delta);
1111
0
      lss->pmove_tail = &e->next;
1112
0
    }
1113
0
}
1114
1115
/* Called after the current line information has been either used with
1116
   dwarf2_gen_line_info or saved with a machine instruction for later use.
1117
   This resets the state of the line number information to reflect that
1118
   it has been used.  */
1119
1120
void
1121
dwarf2_consume_line_info (void)
1122
1.22k
{
1123
  /* Unless we generate DWARF2 debugging information for each
1124
     assembler line, we only emit one line symbol for one LOC.  */
1125
1.22k
  dwarf2_loc_directive_seen = false;
1126
1127
1.22k
  current.flags &= ~(DWARF2_FLAG_BASIC_BLOCK
1128
1.22k
         | DWARF2_FLAG_PROLOGUE_END
1129
1.22k
         | DWARF2_FLAG_EPILOGUE_BEGIN);
1130
1.22k
  current.discriminator = 0;
1131
1.22k
  current.u.view = NULL;
1132
1.22k
}
1133
1134
/* Called for each (preferably code) label.  If dwarf2_loc_mark_labels
1135
   is enabled, emit a basic block marker.  */
1136
1137
void
1138
dwarf2_emit_label (symbolS *label)
1139
2.47k
{
1140
2.47k
  struct dwarf2_line_info loc;
1141
1142
2.47k
  if (!dwarf2_loc_mark_labels)
1143
2.47k
    return;
1144
0
  if (S_GET_SEGMENT (label) != now_seg)
1145
0
    return;
1146
0
  if (!(bfd_section_flags (now_seg) & SEC_CODE))
1147
0
    return;
1148
0
  if (files_in_use == 0 && debug_type != DEBUG_DWARF2)
1149
0
    return;
1150
1151
0
  dwarf2_where (&loc);
1152
1153
0
  loc.flags |= DWARF2_FLAG_BASIC_BLOCK;
1154
1155
0
  dwarf2_gen_line_info_1 (label, &loc);
1156
0
  dwarf2_consume_line_info ();
1157
0
}
1158
1159
/* Handle two forms of .file directive:
1160
   - Pass .file "source.c" to s_file
1161
   - Handle .file 1 "source.c" by adding an entry to the DWARF-2 file table
1162
1163
   If an entry is added to the file table, return a pointer to the filename.  */
1164
1165
char *
1166
dwarf2_directive_filename (void)
1167
992
{
1168
992
  bool with_md5 = false;
1169
992
  valueT num;
1170
992
  char *filename;
1171
992
  const char * dirname = NULL;
1172
992
  int filename_len;
1173
1174
  /* Continue to accept a bare string and pass it off.  */
1175
992
  SKIP_WHITESPACE ();
1176
992
  if (*input_line_pointer == '"')
1177
904
    {
1178
904
      s_file (0);
1179
904
      return NULL;
1180
904
    }
1181
1182
88
  num = get_absolute_expression ();
1183
1184
88
  if ((offsetT) num < 1)
1185
63
    {
1186
63
      if (num == 0 && dwarf_level < 5)
1187
1
  dwarf_level = 5;
1188
63
      if ((offsetT) num < 0 || DWARF2_LINE_VERSION < 5)
1189
0
  {
1190
0
    as_bad (_("file number less than one"));
1191
0
    ignore_rest_of_line ();
1192
0
    return NULL;
1193
0
  }
1194
63
    }
1195
1196
  /* FIXME: Should we allow ".file <N>\n" as an expression meaning
1197
     "switch back to the already allocated file <N> as the current
1198
     file" ?  */
1199
1200
88
  filename = demand_copy_C_string (&filename_len);
1201
88
  if (filename == NULL)
1202
    /* demand_copy_C_string will have already generated an error message.  */
1203
16
    return NULL;
1204
1205
  /* For DWARF-5 support we also accept:
1206
     .file <NUM> ["<dir>"] "<file>" [md5 <NUM>]  */
1207
72
  if (DWARF2_LINE_VERSION > 4)
1208
72
    {
1209
72
      SKIP_WHITESPACE ();
1210
72
      if (*input_line_pointer == '"')
1211
17
  {
1212
17
    dirname = filename;
1213
17
    filename = demand_copy_C_string (&filename_len);
1214
17
    if (filename == NULL)
1215
0
      return NULL;
1216
17
    SKIP_WHITESPACE ();
1217
17
  }
1218
1219
72
      if (startswith (input_line_pointer, "md5"))
1220
3
  {
1221
3
    input_line_pointer += 3;
1222
3
    SKIP_WHITESPACE ();
1223
1224
3
    expressionS exp;
1225
3
    expression_and_evaluate (& exp);
1226
3
    if (exp.X_op != O_big)
1227
0
      as_bad (_("md5 value too small or not a constant"));
1228
3
    else
1229
3
      with_md5 = true;
1230
3
  }
1231
72
    }
1232
1233
72
  demand_empty_rest_of_line ();
1234
1235
  /* A .file directive implies compiler generated debug information is
1236
     being supplied.  Turn off gas generated debug info.  */
1237
72
  if (debug_type == DEBUG_DWARF2)
1238
0
    purge_generated_debug (false);
1239
72
  debug_type = DEBUG_NONE;
1240
1241
72
  if (!allocate_filename_to_slot (dirname, filename, num, with_md5))
1242
22
    return NULL;
1243
1244
50
  return filename;
1245
72
}
1246
1247
/* Calls dwarf2_directive_filename, but discards its result.
1248
   Used in pseudo-op tables where the function result is ignored.  */
1249
1250
void
1251
dwarf2_directive_file (int dummy ATTRIBUTE_UNUSED)
1252
992
{
1253
992
  (void) dwarf2_directive_filename ();
1254
992
}
1255
1256
void
1257
dwarf2_directive_loc (int dummy ATTRIBUTE_UNUSED)
1258
4.78k
{
1259
4.78k
  offsetT filenum, line;
1260
1261
  /* If we see two .loc directives in a row, force the first one to be
1262
     output now.  */
1263
4.78k
  if (dwarf2_loc_directive_seen)
1264
1.21k
    dwarf2_emit_insn (0);
1265
1266
4.78k
  filenum = get_absolute_expression ();
1267
4.78k
  SKIP_WHITESPACE ();
1268
4.78k
  line = get_absolute_expression ();
1269
1270
4.78k
  if (filenum < 1)
1271
4.38k
    {
1272
4.38k
      if (filenum == 0 && dwarf_level < 5)
1273
0
  dwarf_level = 5;
1274
4.38k
      if (filenum < 0 || DWARF2_LINE_VERSION < 5)
1275
1
  {
1276
1
    as_bad (_("file number less than one"));
1277
1
    return;
1278
1
  }
1279
4.38k
    }
1280
1281
4.78k
  if ((valueT) filenum >= files_in_use || files[filenum].filename == NULL)
1282
3.31k
    {
1283
3.31k
      as_bad (_("unassigned file number %ld"), (long) filenum);
1284
3.31k
      return;
1285
3.31k
    }
1286
1287
  /* debug_type will be turned off by dwarf2_directive_filename, and
1288
     if we don't have a dwarf style .file then files_in_use will be
1289
     zero and the above error will trigger.  */
1290
1.47k
  gas_assert (debug_type == DEBUG_NONE);
1291
1292
1.47k
  current.filenum = filenum;
1293
1.47k
  current.line = line;
1294
1.47k
  current.discriminator = 0;
1295
1296
1.47k
#ifndef NO_LISTING
1297
1.47k
  if (listing)
1298
0
    {
1299
0
      if (files[filenum].dir)
1300
0
  {
1301
0
    size_t dir_len = strlen (dirs[files[filenum].dir]);
1302
0
    size_t file_len = strlen (files[filenum].filename);
1303
0
    char *cp = XNEWVEC (char, dir_len + 1 + file_len + 1);
1304
1305
0
    memcpy (cp, dirs[files[filenum].dir], dir_len);
1306
0
    INSERT_DIR_SEPARATOR (cp, dir_len);
1307
0
    memcpy (cp + dir_len + 1, files[filenum].filename, file_len);
1308
0
    cp[dir_len + file_len + 1] = '\0';
1309
0
    listing_source_file (cp);
1310
0
    free (cp);
1311
0
  }
1312
0
      else
1313
0
  listing_source_file (files[filenum].filename);
1314
0
      listing_source_line (line);
1315
0
    }
1316
1.47k
#endif
1317
1318
1.47k
  SKIP_WHITESPACE ();
1319
1.47k
  if (ISDIGIT (*input_line_pointer))
1320
12
    {
1321
12
      current.column = get_absolute_expression ();
1322
12
      SKIP_WHITESPACE ();
1323
12
    }
1324
1325
1.47k
  while (ISALPHA (*input_line_pointer))
1326
252
    {
1327
252
      char *p, c;
1328
252
      offsetT value;
1329
1330
252
      c = get_symbol_name (& p);
1331
1332
252
      if (strcmp (p, "basic_block") == 0)
1333
5
  {
1334
5
    current.flags |= DWARF2_FLAG_BASIC_BLOCK;
1335
5
    restore_line_pointer (c);
1336
5
  }
1337
247
      else if (strcmp (p, "prologue_end") == 0)
1338
0
  {
1339
0
    if (dwarf_level < 3)
1340
0
      dwarf_level = 3;
1341
0
    current.flags |= DWARF2_FLAG_PROLOGUE_END;
1342
0
    restore_line_pointer (c);
1343
0
  }
1344
247
      else if (strcmp (p, "epilogue_begin") == 0)
1345
0
  {
1346
0
    if (dwarf_level < 3)
1347
0
      dwarf_level = 3;
1348
0
    current.flags |= DWARF2_FLAG_EPILOGUE_BEGIN;
1349
0
    restore_line_pointer (c);
1350
0
  }
1351
247
      else if (strcmp (p, "is_stmt") == 0)
1352
4
  {
1353
4
    (void) restore_line_pointer (c);
1354
4
    value = get_absolute_expression ();
1355
4
    if (value == 0)
1356
4
      current.flags &= ~DWARF2_FLAG_IS_STMT;
1357
0
    else if (value == 1)
1358
0
      current.flags |= DWARF2_FLAG_IS_STMT;
1359
0
    else
1360
0
      {
1361
0
        as_bad (_("is_stmt value not 0 or 1"));
1362
0
        return;
1363
0
      }
1364
4
  }
1365
243
      else if (strcmp (p, "isa") == 0)
1366
0
  {
1367
0
    if (dwarf_level < 3)
1368
0
      dwarf_level = 3;
1369
0
    (void) restore_line_pointer (c);
1370
0
    value = get_absolute_expression ();
1371
0
    if (value >= 0)
1372
0
      current.isa = value;
1373
0
    else
1374
0
      {
1375
0
        as_bad (_("isa number less than zero"));
1376
0
        return;
1377
0
      }
1378
0
  }
1379
243
      else if (strcmp (p, "discriminator") == 0)
1380
3
  {
1381
3
    (void) restore_line_pointer (c);
1382
3
    value = get_absolute_expression ();
1383
3
    if (value >= 0)
1384
0
      current.discriminator = value;
1385
3
    else
1386
3
      {
1387
3
        as_bad (_("discriminator less than zero"));
1388
3
        return;
1389
3
      }
1390
3
  }
1391
240
      else if (strcmp (p, "view") == 0)
1392
0
  {
1393
0
    symbolS *sym;
1394
1395
0
    (void) restore_line_pointer (c);
1396
0
    SKIP_WHITESPACE ();
1397
1398
0
    if (ISDIGIT (*input_line_pointer)
1399
0
        || *input_line_pointer == '-')
1400
0
      {
1401
0
        bool force_reset = *input_line_pointer == '-';
1402
1403
0
        value = get_absolute_expression ();
1404
0
        if (value != 0)
1405
0
    {
1406
0
      as_bad (_("numeric view can only be asserted to zero"));
1407
0
      return;
1408
0
    }
1409
0
        if (force_reset && force_reset_view)
1410
0
    sym = force_reset_view;
1411
0
        else
1412
0
    {
1413
0
      sym = symbol_temp_new (absolute_section, &zero_address_frag,
1414
0
           value);
1415
0
      if (force_reset)
1416
0
        force_reset_view = sym;
1417
0
    }
1418
0
      }
1419
0
    else
1420
0
      {
1421
0
        char *name = read_symbol_name ();
1422
1423
0
        if (!name)
1424
0
    return;
1425
0
        sym = symbol_find_or_make (name);
1426
0
        free (name);
1427
0
        if (S_IS_DEFINED (sym) || symbol_equated_p (sym))
1428
0
    {
1429
0
      if (S_IS_VOLATILE (sym))
1430
0
        sym = symbol_clone (sym, 1);
1431
0
      else if (!S_CAN_BE_REDEFINED (sym))
1432
0
        {
1433
0
          as_bad (_("symbol `%s' is already defined"),
1434
0
            S_GET_NAME (sym));
1435
0
          return;
1436
0
        }
1437
0
    }
1438
0
        S_SET_SEGMENT (sym, undefined_section);
1439
0
        S_SET_VALUE (sym, 0);
1440
0
        symbol_set_frag (sym, &zero_address_frag);
1441
0
      }
1442
0
    current.u.view = sym;
1443
0
  }
1444
240
      else
1445
240
  {
1446
240
    as_bad (_("unknown .loc sub-directive `%s'"), p);
1447
240
    (void) restore_line_pointer (c);
1448
240
    return;
1449
240
  }
1450
1451
9
      SKIP_WHITESPACE ();
1452
9
    }
1453
1454
1.23k
  demand_empty_rest_of_line ();
1455
1.23k
  dwarf2_any_loc_directive_seen = dwarf2_loc_directive_seen = true;
1456
1457
  /* If we were given a view id, emit the row right away.  */
1458
1.23k
  if (current.u.view)
1459
0
    dwarf2_emit_insn (0);
1460
1.23k
}
1461
1462
void
1463
dwarf2_directive_loc_mark_labels (int dummy ATTRIBUTE_UNUSED)
1464
0
{
1465
0
  offsetT value = get_absolute_expression ();
1466
1467
0
  if (value != 0 && value != 1)
1468
0
    {
1469
0
      as_bad (_("expected 0 or 1"));
1470
0
      ignore_rest_of_line ();
1471
0
    }
1472
0
  else
1473
0
    {
1474
0
      dwarf2_loc_mark_labels = value != 0;
1475
0
      demand_empty_rest_of_line ();
1476
0
    }
1477
0
}
1478

1479
static struct frag *
1480
first_frag_for_seg (segT seg)
1481
16
{
1482
16
  return seg_info (seg)->frchainP->frch_root;
1483
16
}
1484
1485
static struct frag *
1486
last_frag_for_seg (segT seg)
1487
32
{
1488
32
  frchainS *f = seg_info (seg)->frchainP;
1489
1490
64
  while (f->frch_next != NULL)
1491
32
    f = f->frch_next;
1492
1493
32
  return f->frch_last;
1494
32
}
1495

1496
/* Emit a single byte into the current segment.  */
1497
1498
static inline void
1499
out_byte (int byte)
1500
565
{
1501
565
  FRAG_APPEND_1_CHAR (byte);
1502
565
}
1503
1504
/* Emit a statement program opcode into the current segment.  */
1505
1506
static inline void
1507
out_opcode (int opc)
1508
53
{
1509
53
  out_byte (opc);
1510
53
}
1511
1512
/* Emit a two-byte word into the current segment.  */
1513
1514
static inline void
1515
out_two (int data)
1516
64
{
1517
64
  md_number_to_chars (frag_more (2), data, 2);
1518
64
}
1519
1520
/* Emit a four byte word into the current segment.  */
1521
1522
static inline void
1523
out_four (int data)
1524
0
{
1525
0
  md_number_to_chars (frag_more (4), data, 4);
1526
0
}
1527
1528
/* Emit an unsigned "little-endian base 128" number.  */
1529
1530
static void
1531
out_uleb128 (addressT value)
1532
484
{
1533
484
  output_leb128 (frag_more (sizeof_leb128 (value, 0)), value, 0);
1534
484
}
1535
1536
/* Emit a signed "little-endian base 128" number.  */
1537
1538
static void
1539
out_leb128 (addressT value)
1540
0
{
1541
0
  output_leb128 (frag_more (sizeof_leb128 (value, 1)), value, 1);
1542
0
}
1543
1544
/* Emit a tuple for .debug_abbrev.  */
1545
1546
static inline void
1547
out_abbrev (int name, int form)
1548
128
{
1549
128
  out_uleb128 (name);
1550
128
  out_uleb128 (form);
1551
128
}
1552
1553
/* Get the size of a fragment.  */
1554
1555
static offsetT
1556
get_frag_fix (fragS *frag, segT seg)
1557
32
{
1558
32
  frchainS *fr;
1559
1560
32
  if (frag->fr_next)
1561
0
    return frag->fr_fix;
1562
1563
  /* If a fragment is the last in the chain, special measures must be
1564
     taken to find its size before relaxation, since it may be pending
1565
     on some subsegment chain.  */
1566
64
  for (fr = seg_info (seg)->frchainP; fr; fr = fr->frch_next)
1567
64
    if (fr->frch_last == frag)
1568
32
      return (char *) obstack_next_free (&fr->frch_obstack) - frag->fr_literal;
1569
1570
32
  abort ();
1571
32
}
1572
1573
/* Set an absolute address (may result in a relocation entry).  */
1574
1575
static void
1576
out_set_addr (symbolS *sym)
1577
16
{
1578
16
  expressionS exp;
1579
1580
16
  memset (&exp, 0, sizeof exp);
1581
16
  out_opcode (DW_LNS_extended_op);
1582
16
  out_uleb128 (sizeof_address + 1);
1583
1584
16
  out_opcode (DW_LNE_set_address);
1585
16
  exp.X_op = O_symbol;
1586
16
  exp.X_add_symbol = sym;
1587
16
  exp.X_add_number = 0;
1588
16
  emit_expr (&exp, sizeof_address);
1589
16
}
1590
1591
static void
1592
scale_addr_delta (int line_delta, addressT *addr_delta)
1593
2.18k
{
1594
2.18k
  static int printed_this = 0;
1595
2.18k
  if (DWARF2_LINE_MIN_INSN_LENGTH > 1)
1596
0
    {
1597
      /* Don't error on non-instruction bytes at end of section.  */
1598
0
      if (line_delta != INT_MAX
1599
0
    && *addr_delta % DWARF2_LINE_MIN_INSN_LENGTH != 0  && !printed_this)
1600
0
  {
1601
0
    as_bad("unaligned opcodes detected in executable segment");
1602
0
    printed_this = 1;
1603
0
  }
1604
0
      *addr_delta /= DWARF2_LINE_MIN_INSN_LENGTH;
1605
0
    }
1606
2.18k
}
1607
1608
/* Encode a pair of line and address skips as efficiently as possible.
1609
   Note that the line skip is signed, whereas the address skip is unsigned.
1610
1611
   The following two routines *must* be kept in sync.  This is
1612
   enforced by making emit_inc_line_addr abort if we do not emit
1613
   exactly the expected number of bytes.  */
1614
1615
static int
1616
size_inc_line_addr (int line_delta, addressT addr_delta)
1617
1.21k
{
1618
1.21k
  unsigned int tmp, opcode;
1619
1.21k
  int len = 0;
1620
1621
  /* Scale the address delta by the minimum instruction length.  */
1622
1.21k
  scale_addr_delta (line_delta, &addr_delta);
1623
1624
  /* INT_MAX is a signal that this is actually a DW_LNE_end_sequence.
1625
     We cannot use special opcodes here, since we want the end_sequence
1626
     to emit the matrix entry.  */
1627
1.21k
  if (line_delta == INT_MAX)
1628
21
    {
1629
21
      if (addr_delta == MAX_SPECIAL_ADDR_DELTA)
1630
0
  len = 1;
1631
21
      else if (addr_delta)
1632
10
  len = 1 + sizeof_leb128 (addr_delta, 0);
1633
21
      return len + 3;
1634
21
    }
1635
1636
  /* Bias the line delta by the base.  */
1637
1.19k
  tmp = (unsigned) line_delta - DWARF2_LINE_BASE;
1638
1639
  /* If the line increment is out of range of a special opcode, we
1640
     must encode it with DW_LNS_advance_line.  */
1641
1.19k
  if (tmp >= DWARF2_LINE_RANGE)
1642
488
    {
1643
488
      len = 1 + sizeof_leb128 (line_delta, 1);
1644
488
      line_delta = 0;
1645
488
      tmp = 0 - DWARF2_LINE_BASE;
1646
488
    }
1647
1648
  /* Bias the opcode by the special opcode base.  */
1649
1.19k
  tmp += DWARF2_LINE_OPCODE_BASE;
1650
1651
  /* Avoid overflow when addr_delta is large.  */
1652
1.19k
  if (addr_delta < 256U + MAX_SPECIAL_ADDR_DELTA)
1653
960
    {
1654
      /* Try using a special opcode.  */
1655
960
      opcode = tmp + addr_delta * DWARF2_LINE_RANGE;
1656
960
      if (opcode <= 255)
1657
952
  return len + 1;
1658
1659
      /* Try using DW_LNS_const_add_pc followed by special op.  */
1660
8
      opcode = tmp + (addr_delta - MAX_SPECIAL_ADDR_DELTA) * DWARF2_LINE_RANGE;
1661
8
      if (opcode <= 255)
1662
8
  return len + 2;
1663
8
    }
1664
1665
  /* Otherwise use DW_LNS_advance_pc.  */
1666
231
  len += 1 + sizeof_leb128 (addr_delta, 0);
1667
1668
  /* DW_LNS_copy or special opcode.  */
1669
231
  len += 1;
1670
1671
231
  return len;
1672
1.19k
}
1673
1674
static void
1675
emit_inc_line_addr (int line_delta, addressT addr_delta, char *p, int len)
1676
976
{
1677
976
  unsigned int tmp, opcode;
1678
976
  int need_copy = 0;
1679
976
  char *end = p + len;
1680
1681
  /* Line number sequences cannot go backward in addresses.  This means
1682
     we've incorrectly ordered the statements in the sequence.  */
1683
976
  gas_assert ((offsetT) addr_delta >= 0);
1684
1685
  /* Scale the address delta by the minimum instruction length.  */
1686
976
  scale_addr_delta (line_delta, &addr_delta);
1687
1688
  /* INT_MAX is a signal that this is actually a DW_LNE_end_sequence.
1689
     We cannot use special opcodes here, since we want the end_sequence
1690
     to emit the matrix entry.  */
1691
976
  if (line_delta == INT_MAX)
1692
15
    {
1693
15
      if (addr_delta == MAX_SPECIAL_ADDR_DELTA)
1694
0
  *p++ = DW_LNS_const_add_pc;
1695
15
      else if (addr_delta)
1696
4
  {
1697
4
    *p++ = DW_LNS_advance_pc;
1698
4
    p += output_leb128 (p, addr_delta, 0);
1699
4
  }
1700
1701
15
      *p++ = DW_LNS_extended_op;
1702
15
      *p++ = 1;
1703
15
      *p++ = DW_LNE_end_sequence;
1704
15
      goto done;
1705
15
    }
1706
1707
  /* Bias the line delta by the base.  */
1708
961
  tmp = (unsigned) line_delta - DWARF2_LINE_BASE;
1709
1710
  /* If the line increment is out of range of a special opcode, we
1711
     must encode it with DW_LNS_advance_line.  */
1712
961
  if (tmp >= DWARF2_LINE_RANGE)
1713
487
    {
1714
487
      *p++ = DW_LNS_advance_line;
1715
487
      p += output_leb128 (p, line_delta, 1);
1716
1717
487
      line_delta = 0;
1718
487
      tmp = 0 - DWARF2_LINE_BASE;
1719
487
      need_copy = 1;
1720
487
    }
1721
1722
  /* Prettier, I think, to use DW_LNS_copy instead of a "line +0, addr +0"
1723
     special opcode.  */
1724
961
  if (line_delta == 0 && addr_delta == 0)
1725
491
    {
1726
491
      *p++ = DW_LNS_copy;
1727
491
      goto done;
1728
491
    }
1729
1730
  /* Bias the opcode by the special opcode base.  */
1731
470
  tmp += DWARF2_LINE_OPCODE_BASE;
1732
1733
  /* Avoid overflow when addr_delta is large.  */
1734
470
  if (addr_delta < 256U + MAX_SPECIAL_ADDR_DELTA)
1735
469
    {
1736
      /* Try using a special opcode.  */
1737
469
      opcode = tmp + addr_delta * DWARF2_LINE_RANGE;
1738
469
      if (opcode <= 255)
1739
461
  {
1740
461
    *p++ = opcode;
1741
461
    goto done;
1742
461
  }
1743
1744
      /* Try using DW_LNS_const_add_pc followed by special op.  */
1745
8
      opcode = tmp + (addr_delta - MAX_SPECIAL_ADDR_DELTA) * DWARF2_LINE_RANGE;
1746
8
      if (opcode <= 255)
1747
8
  {
1748
8
    *p++ = DW_LNS_const_add_pc;
1749
8
    *p++ = opcode;
1750
8
    goto done;
1751
8
  }
1752
8
    }
1753
1754
  /* Otherwise use DW_LNS_advance_pc.  */
1755
1
  *p++ = DW_LNS_advance_pc;
1756
1
  p += output_leb128 (p, addr_delta, 0);
1757
1758
1
  if (need_copy)
1759
0
    *p++ = DW_LNS_copy;
1760
1
  else
1761
1
    *p++ = tmp;
1762
1763
976
 done:
1764
976
  gas_assert (p == end);
1765
976
}
1766
1767
/* Handy routine to combine calls to the above two routines.  */
1768
1769
static void
1770
out_inc_line_addr (int line_delta, addressT addr_delta)
1771
976
{
1772
976
  int len = size_inc_line_addr (line_delta, addr_delta);
1773
976
  emit_inc_line_addr (line_delta, addr_delta, frag_more (len), len);
1774
976
}
1775
1776
/* Write out an alternative form of line and address skips using
1777
   DW_LNS_fixed_advance_pc opcodes.  This uses more space than the default
1778
   line and address information, but it is required if linker relaxation
1779
   could change the code offsets.  The following two routines *must* be
1780
   kept in sync.  */
1781
0
#define ADDR_DELTA_LIMIT 50000
1782
1783
static int
1784
size_fixed_inc_line_addr (int line_delta, addressT addr_delta)
1785
0
{
1786
0
  int len = 0;
1787
1788
  /* INT_MAX is a signal that this is actually a DW_LNE_end_sequence.  */
1789
0
  if (line_delta != INT_MAX)
1790
0
    len = 1 + sizeof_leb128 (line_delta, 1);
1791
1792
0
  if (addr_delta > ADDR_DELTA_LIMIT)
1793
0
    {
1794
      /* DW_LNS_extended_op */
1795
0
      len += 1 + sizeof_leb128 (sizeof_address + 1, 0);
1796
      /* DW_LNE_set_address */
1797
0
      len += 1 + sizeof_address;
1798
0
    }
1799
0
  else
1800
    /* DW_LNS_fixed_advance_pc */
1801
0
    len += 3;
1802
1803
0
  if (line_delta == INT_MAX)
1804
    /* DW_LNS_extended_op + DW_LNE_end_sequence */
1805
0
    len += 3;
1806
0
  else
1807
    /* DW_LNS_copy */
1808
0
    len += 1;
1809
1810
0
  return len;
1811
0
}
1812
1813
static void
1814
emit_fixed_inc_line_addr (int line_delta, addressT addr_delta, fragS *frag,
1815
        char *p, int len)
1816
0
{
1817
0
  expressionS *pexp;
1818
0
  char *end = p + len;
1819
1820
  /* Line number sequences cannot go backward in addresses.  This means
1821
     we've incorrectly ordered the statements in the sequence.  */
1822
0
  gas_assert ((offsetT) addr_delta >= 0);
1823
1824
  /* Verify that we have kept in sync with size_fixed_inc_line_addr.  */
1825
0
  gas_assert (len == size_fixed_inc_line_addr (line_delta, addr_delta));
1826
1827
  /* INT_MAX is a signal that this is actually a DW_LNE_end_sequence.  */
1828
0
  if (line_delta != INT_MAX)
1829
0
    {
1830
0
      *p++ = DW_LNS_advance_line;
1831
0
      p += output_leb128 (p, line_delta, 1);
1832
0
    }
1833
1834
0
  pexp = symbol_get_value_expression (frag->fr_symbol);
1835
1836
  /* The DW_LNS_fixed_advance_pc opcode has a 2-byte operand so it can
1837
     advance the address by at most 64K.  Linker relaxation (without
1838
     which this function would not be used) could change the operand by
1839
     an unknown amount.  If the address increment is getting close to
1840
     the limit, just reset the address.  */
1841
0
  if (addr_delta > ADDR_DELTA_LIMIT)
1842
0
    {
1843
0
      symbolS *to_sym;
1844
0
      expressionS exp;
1845
1846
0
      memset (&exp, 0, sizeof exp);
1847
0
      gas_assert (pexp->X_op == O_subtract);
1848
0
      to_sym = pexp->X_add_symbol;
1849
1850
0
      *p++ = DW_LNS_extended_op;
1851
0
      p += output_leb128 (p, sizeof_address + 1, 0);
1852
0
      *p++ = DW_LNE_set_address;
1853
0
      exp.X_op = O_symbol;
1854
0
      exp.X_add_symbol = to_sym;
1855
0
      exp.X_add_number = 0;
1856
0
      emit_expr_fix (&exp, sizeof_address, frag, p, TC_PARSE_CONS_RETURN_NONE);
1857
0
      p += sizeof_address;
1858
0
    }
1859
0
  else
1860
0
    {
1861
0
      *p++ = DW_LNS_fixed_advance_pc;
1862
0
      emit_expr_fix (pexp, 2, frag, p, TC_PARSE_CONS_RETURN_NONE);
1863
0
      p += 2;
1864
0
    }
1865
1866
0
  if (line_delta == INT_MAX)
1867
0
    {
1868
0
      *p++ = DW_LNS_extended_op;
1869
0
      *p++ = 1;
1870
0
      *p++ = DW_LNE_end_sequence;
1871
0
    }
1872
0
  else
1873
0
    *p++ = DW_LNS_copy;
1874
1875
0
  gas_assert (p == end);
1876
0
}
1877
1878
/* Generate a variant frag that we can use to relax address/line
1879
   increments between fragments of the target segment.  */
1880
1881
static void
1882
relax_inc_line_addr (int line_delta, symbolS *to_sym, symbolS *from_sym)
1883
236
{
1884
236
  expressionS exp;
1885
236
  int max_chars;
1886
1887
236
  memset (&exp, 0, sizeof exp);
1888
236
  exp.X_op = O_subtract;
1889
236
  exp.X_add_symbol = to_sym;
1890
236
  exp.X_op_symbol = from_sym;
1891
236
  exp.X_add_number = 0;
1892
1893
  /* The maximum size of the frag is the line delta with a maximum
1894
     sized address delta.  */
1895
236
  if (DWARF2_USE_FIXED_ADVANCE_PC)
1896
0
    max_chars = size_fixed_inc_line_addr (line_delta,
1897
0
            -DWARF2_LINE_MIN_INSN_LENGTH);
1898
236
  else
1899
236
    max_chars = size_inc_line_addr (line_delta, -DWARF2_LINE_MIN_INSN_LENGTH);
1900
1901
236
  frag_var (rs_dwarf2dbg, max_chars, max_chars, 1,
1902
236
      make_expr_symbol (&exp), line_delta, NULL);
1903
236
}
1904
1905
/* The function estimates the size of a rs_dwarf2dbg variant frag
1906
   based on the current values of the symbols.  It is called before
1907
   the relaxation loop.  We set fr_subtype to the expected length.  */
1908
1909
int
1910
dwarf2dbg_estimate_size_before_relax (fragS *frag)
1911
0
{
1912
0
  offsetT addr_delta;
1913
0
  int size;
1914
1915
0
  addr_delta = resolve_symbol_value (frag->fr_symbol);
1916
0
  if (DWARF2_USE_FIXED_ADVANCE_PC)
1917
0
    size = size_fixed_inc_line_addr (frag->fr_offset, addr_delta);
1918
0
  else
1919
0
    size = size_inc_line_addr (frag->fr_offset, addr_delta);
1920
1921
0
  frag->fr_subtype = size;
1922
1923
0
  return size;
1924
0
}
1925
1926
/* This function relaxes a rs_dwarf2dbg variant frag based on the
1927
   current values of the symbols.  fr_subtype is the current length
1928
   of the frag.  This returns the change in frag length.  */
1929
1930
int
1931
dwarf2dbg_relax_frag (fragS *frag)
1932
0
{
1933
0
  int old_size, new_size;
1934
1935
0
  old_size = frag->fr_subtype;
1936
0
  new_size = dwarf2dbg_estimate_size_before_relax (frag);
1937
1938
0
  return new_size - old_size;
1939
0
}
1940
1941
/* This function converts a rs_dwarf2dbg variant frag into a normal
1942
   fill frag.  This is called after all relaxation has been done.
1943
   fr_subtype will be the desired length of the frag.  */
1944
1945
void
1946
dwarf2dbg_convert_frag (fragS *frag)
1947
0
{
1948
0
  offsetT addr_diff;
1949
1950
0
  if (DWARF2_USE_FIXED_ADVANCE_PC)
1951
0
    {
1952
      /* If linker relaxation is enabled then the distance between the two
1953
   symbols in the frag->fr_symbol expression might change.  Hence we
1954
   cannot rely upon the value computed by resolve_symbol_value.
1955
   Instead we leave the expression unfinalized and allow
1956
   emit_fixed_inc_line_addr to create a fixup (which later becomes a
1957
   relocation) that will allow the linker to correctly compute the
1958
   actual address difference.  We have to use a fixed line advance for
1959
   this as we cannot (easily) relocate leb128 encoded values.  */
1960
0
      int saved_finalize_syms = finalize_syms;
1961
1962
0
      finalize_syms = 0;
1963
0
      addr_diff = resolve_symbol_value (frag->fr_symbol);
1964
0
      finalize_syms = saved_finalize_syms;
1965
0
    }
1966
0
  else
1967
0
    addr_diff = resolve_symbol_value (frag->fr_symbol);
1968
1969
  /* fr_var carries the max_chars that we created the fragment with.
1970
     fr_subtype carries the current expected length.  We must, of
1971
     course, have allocated enough memory earlier.  */
1972
0
  gas_assert (frag->fr_var >= (int) frag->fr_subtype);
1973
1974
0
  if (DWARF2_USE_FIXED_ADVANCE_PC)
1975
0
    emit_fixed_inc_line_addr (frag->fr_offset, addr_diff, frag,
1976
0
            frag->fr_literal + frag->fr_fix,
1977
0
            frag->fr_subtype);
1978
0
  else
1979
0
    emit_inc_line_addr (frag->fr_offset, addr_diff,
1980
0
      frag->fr_literal + frag->fr_fix, frag->fr_subtype);
1981
1982
0
  frag->fr_fix += frag->fr_subtype;
1983
0
  frag->fr_type = rs_fill;
1984
0
  frag->fr_var = 0;
1985
0
  frag->fr_offset = 0;
1986
0
}
1987
1988
/* Generate .debug_line content for the chain of line number entries
1989
   beginning at E, for segment SEG.  */
1990
1991
static void
1992
process_entries (segT seg, struct line_entry *e)
1993
16
{
1994
16
  unsigned filenum = 1;
1995
16
  unsigned line = 1;
1996
16
  unsigned column = 0;
1997
16
  unsigned isa = 0;
1998
16
  unsigned flags = DWARF2_LINE_DEFAULT_IS_STMT ? DWARF2_FLAG_IS_STMT : 0;
1999
16
  fragS *last_frag = NULL, *frag;
2000
16
  addressT last_frag_ofs = 0, frag_ofs;
2001
16
  symbolS *last_lab = NULL, *lab;
2002
2003
16
  if (flag_dwarf_sections)
2004
0
    {
2005
0
      char * name;
2006
0
      const char * sec_name;
2007
2008
      /* Switch to the relevant sub-section before we start to emit
2009
   the line number table.
2010
2011
   FIXME: These sub-sections do not have a normal Line Number
2012
   Program Header, thus strictly speaking they are not valid
2013
   DWARF sections.  Unfortunately the DWARF standard assumes
2014
   a one-to-one relationship between compilation units and
2015
   line number tables.  Thus we have to have a .debug_line
2016
   section, as well as our sub-sections, and we have to ensure
2017
   that all of the sub-sections are merged into a proper
2018
   .debug_line section before a debugger sees them.  */
2019
2020
0
      sec_name = bfd_section_name (seg);
2021
0
      if (strcmp (sec_name, ".text") != 0)
2022
0
  {
2023
0
    name = concat (".debug_line", sec_name, (char *) NULL);
2024
0
    subseg_set (subseg_get (name, false), 0);
2025
0
  }
2026
0
      else
2027
  /* Don't create a .debug_line.text section -
2028
     that is redundant.  Instead just switch back to the
2029
     normal .debug_line section.  */
2030
0
  subseg_set (subseg_get (".debug_line", false), 0);
2031
0
    }
2032
2033
16
  do
2034
1.19k
    {
2035
1.19k
      int line_delta;
2036
2037
1.19k
      if (filenum != e->loc.filenum)
2038
16
  {
2039
16
    filenum = e->loc.filenum;
2040
16
    out_opcode (DW_LNS_set_file);
2041
16
    out_uleb128 (filenum);
2042
16
  }
2043
2044
1.19k
      if (column != e->loc.column)
2045
4
  {
2046
4
    column = e->loc.column;
2047
4
    out_opcode (DW_LNS_set_column);
2048
4
    out_uleb128 (column);
2049
4
  }
2050
2051
1.19k
      if (e->loc.discriminator != 0)
2052
0
  {
2053
0
    out_opcode (DW_LNS_extended_op);
2054
0
    out_leb128 (1 + sizeof_leb128 (e->loc.discriminator, 0));
2055
0
    out_opcode (DW_LNE_set_discriminator);
2056
0
    out_uleb128 (e->loc.discriminator);
2057
0
  }
2058
2059
1.19k
      if (isa != e->loc.isa)
2060
0
  {
2061
0
    isa = e->loc.isa;
2062
0
    out_opcode (DW_LNS_set_isa);
2063
0
    out_uleb128 (isa);
2064
0
  }
2065
2066
1.19k
      if ((e->loc.flags ^ flags) & DWARF2_FLAG_IS_STMT)
2067
1
  {
2068
1
    flags = e->loc.flags;
2069
1
    out_opcode (DW_LNS_negate_stmt);
2070
1
  }
2071
2072
1.19k
      if (e->loc.flags & DWARF2_FLAG_BASIC_BLOCK)
2073
0
  out_opcode (DW_LNS_set_basic_block);
2074
2075
1.19k
      if (e->loc.flags & DWARF2_FLAG_PROLOGUE_END)
2076
0
  out_opcode (DW_LNS_set_prologue_end);
2077
2078
1.19k
      if (e->loc.flags & DWARF2_FLAG_EPILOGUE_BEGIN)
2079
0
  out_opcode (DW_LNS_set_epilogue_begin);
2080
2081
      /* Don't try to optimize away redundant entries; gdb wants two
2082
   entries for a function where the code starts on the same line as
2083
   the {, and there's no way to identify that case here.  Trust gcc
2084
   to optimize appropriately.  */
2085
1.19k
      line_delta = e->loc.line - line;
2086
1.19k
      lab = e->label;
2087
1.19k
      frag = symbol_get_frag (lab);
2088
1.19k
      frag_ofs = S_GET_VALUE (lab);
2089
2090
1.19k
      if (last_frag == NULL
2091
1.18k
    || (e->loc.u.view == force_reset_view && force_reset_view
2092
        /* If we're going to reset the view, but we know we're
2093
     advancing the PC, we don't have to force with
2094
     set_address.  We know we do when we're at the same
2095
     address of the same frag, and we know we might when
2096
     we're in the beginning of a frag, and we were at the
2097
     end of the previous frag.  */
2098
0
        && (frag == last_frag
2099
0
      ? (last_frag_ofs == frag_ofs)
2100
0
      : (frag_ofs == 0
2101
0
         && ((offsetT)last_frag_ofs
2102
0
       >= get_frag_fix (last_frag, seg))))))
2103
16
  {
2104
16
    out_set_addr (lab);
2105
16
    out_inc_line_addr (line_delta, 0);
2106
16
  }
2107
1.18k
      else if (frag == last_frag && ! DWARF2_USE_FIXED_ADVANCE_PC)
2108
949
  out_inc_line_addr (line_delta, frag_ofs - last_frag_ofs);
2109
231
      else
2110
231
  relax_inc_line_addr (line_delta, lab, last_lab);
2111
2112
1.19k
      line = e->loc.line;
2113
1.19k
      last_lab = lab;
2114
1.19k
      last_frag = frag;
2115
1.19k
      last_frag_ofs = frag_ofs;
2116
2117
1.19k
      e = e->next;
2118
1.19k
    }
2119
1.19k
  while (e);
2120
2121
  /* Emit a DW_LNE_end_sequence for the end of the section.  */
2122
16
  frag = last_frag_for_seg (seg);
2123
16
  frag_ofs = get_frag_fix (frag, seg);
2124
16
  if (frag == last_frag && ! DWARF2_USE_FIXED_ADVANCE_PC)
2125
11
    out_inc_line_addr (INT_MAX, frag_ofs - last_frag_ofs);
2126
5
  else
2127
5
    {
2128
5
      lab = symbol_temp_new (seg, frag, frag_ofs);
2129
5
      relax_inc_line_addr (INT_MAX, lab, last_lab);
2130
5
    }
2131
16
}
2132
2133
/* Switch to LINE_STR_SEG and output the given STR.  Return the
2134
   symbol pointing to the new string in the section.  */
2135
2136
static symbolS *
2137
add_line_strp (segT line_str_seg, const char *str)
2138
43
{
2139
43
  char *cp;
2140
43
  size_t size;
2141
43
  symbolS *sym;
2142
2143
43
  subseg_set (line_str_seg, 0);
2144
2145
43
  sym = symbol_temp_new_now_octets ();
2146
2147
43
  size = strlen (str) + 1;
2148
43
  cp = frag_more (size);
2149
43
  memcpy (cp, str, size);
2150
2151
43
  return sym;
2152
43
}
2153
2154
2155
/* Emit the directory and file tables for .debug_line.  */
2156
2157
static void
2158
out_dir_and_file_list (segT line_seg, int sizeof_offset)
2159
16
{
2160
16
  size_t size;
2161
16
  char *dir;
2162
16
  char *cp;
2163
16
  unsigned int i, j;
2164
16
  bool emit_md5 = false;
2165
16
  bool emit_timestamps = true;
2166
16
  bool emit_filesize = true;
2167
16
  segT line_str_seg = NULL;
2168
16
  symbolS *line_strp, *file0_strp = NULL;
2169
2170
  /* Output the Directory Table.  */
2171
16
  if (DWARF2_LINE_VERSION >= 5)
2172
16
    {
2173
      /* We only have one column in the directory table.  */
2174
16
      out_byte (1);
2175
2176
      /* Describe the purpose and format of the column.  */
2177
16
      out_uleb128 (DW_LNCT_path);
2178
      /* Store these strings in the .debug_line_str section so they
2179
   can be shared.  */
2180
16
      out_uleb128 (DW_FORM_line_strp);
2181
2182
      /* Now state how many rows there are in the table.  We need at
2183
   least 1 if there is one or more file names to store the
2184
   "working directory".  */
2185
16
      if (dirs_in_use == 0 && files_in_use > 0)
2186
12
  out_uleb128 (1);
2187
4
      else
2188
4
  out_uleb128 (dirs_in_use);
2189
16
    }
2190
      
2191
  /* Emit directory list.  */
2192
16
  if (DWARF2_LINE_VERSION >= 5 && (dirs_in_use > 0 || files_in_use > 0))
2193
16
    {
2194
16
      line_str_seg = subseg_new (".debug_line_str", 0);
2195
16
      bfd_set_section_flags (line_str_seg,
2196
16
           SEC_READONLY | SEC_DEBUGGING | SEC_OCTETS
2197
16
           | SEC_MERGE | SEC_STRINGS);
2198
16
      line_str_seg->entsize = 1;
2199
2200
      /* DWARF5 uses slot zero, but that is only set explicitly
2201
   using a .file 0 directive.  Otherwise use pwd as main file
2202
   directory.  */
2203
16
      if (dirs_in_use > 0 && dirs[0] != NULL)
2204
4
  dir = remap_debug_filename (dirs[0]);
2205
12
      else
2206
12
  dir = remap_debug_filename (getpwd ());
2207
2208
16
      line_strp = add_line_strp (line_str_seg, dir);
2209
16
      free (dir);
2210
16
      subseg_set (line_seg, 0);
2211
16
      TC_DWARF2_EMIT_OFFSET (line_strp, sizeof_offset);
2212
16
    }
2213
27
  for (i = 1; i < dirs_in_use; ++i)
2214
11
    {
2215
11
      dir = remap_debug_filename (dirs[i]);
2216
11
      if (DWARF2_LINE_VERSION < 5)
2217
0
  {
2218
0
    size = strlen (dir) + 1;
2219
0
    cp = frag_more (size);
2220
0
    memcpy (cp, dir, size);
2221
0
  }
2222
11
      else
2223
11
  {
2224
11
    line_strp = add_line_strp (line_str_seg, dir);
2225
11
    subseg_set (line_seg, 0);
2226
11
    TC_DWARF2_EMIT_OFFSET (line_strp, sizeof_offset);
2227
11
  }
2228
11
      free (dir);
2229
11
    }
2230
2231
16
  if (DWARF2_LINE_VERSION < 5)
2232
    /* Terminate it.  */
2233
0
    out_byte ('\0');
2234
2235
  /* Output the File Name Table.  */
2236
16
  if (DWARF2_LINE_VERSION >= 5)
2237
16
    {
2238
16
      unsigned int columns = 4;
2239
2240
16
      if (((unsigned long) DWARF2_FILE_TIME_NAME ("", "")) == -1UL)
2241
16
  {
2242
16
    emit_timestamps = false;
2243
16
    -- columns;
2244
16
  }
2245
2246
16
      if (DWARF2_FILE_SIZE_NAME ("", "") == -1)
2247
16
  {
2248
16
    emit_filesize = false;
2249
16
    -- columns;
2250
16
  }
2251
2252
32
      for (i = 0; i < files_in_use; ++i)
2253
16
  if (files[i].md5[0] != 0)
2254
0
    break;
2255
16
      if (i < files_in_use)
2256
0
  {
2257
0
    emit_md5 = true;
2258
0
    ++ columns;
2259
0
  }
2260
      
2261
      /* The number of format entries to follow.  */
2262
16
      out_byte (columns);
2263
      /* The format of the file name.  */
2264
16
      out_uleb128 (DW_LNCT_path);
2265
      /* Store these strings in the .debug_line_str section so they
2266
   can be shared.  */
2267
16
      out_uleb128 (DW_FORM_line_strp);
2268
2269
      /* The format of the directory index.  */
2270
16
      out_uleb128 (DW_LNCT_directory_index);
2271
16
      out_uleb128 (DW_FORM_udata);
2272
2273
16
      if (emit_timestamps)
2274
0
  {
2275
    /* The format of the timestamp.  */
2276
0
    out_uleb128 (DW_LNCT_timestamp);
2277
0
    out_uleb128 (DW_FORM_udata);
2278
0
  }
2279
2280
16
      if (emit_filesize)
2281
0
  {
2282
    /* The format of the file size.  */
2283
0
    out_uleb128 (DW_LNCT_size);
2284
0
    out_uleb128 (DW_FORM_udata);
2285
0
  }
2286
2287
16
      if (emit_md5)
2288
0
  {
2289
    /* The format of the MD5 sum.  */
2290
0
    out_uleb128 (DW_LNCT_MD5);
2291
0
    out_uleb128 (DW_FORM_data16);
2292
0
  }
2293
2294
      /* The number of entries in the table.  */
2295
16
      out_uleb128 (files_in_use);
2296
16
   }
2297
      
2298
32
  for (i = DWARF2_LINE_VERSION > 4 ? 0 : 1; i < files_in_use; ++i)
2299
16
    {
2300
16
      const char *fullfilename;
2301
2302
16
      if (files[i].filename == NULL)
2303
0
  {
2304
0
    if (DWARF2_LINE_VERSION < 5 || i != 0)
2305
0
      {
2306
0
        as_bad (_("unassigned file number %ld"), (long) i);
2307
0
        continue;
2308
0
      }
2309
    /* DWARF5 uses slot zero, but that is only set explicitly using
2310
       a .file 0 directive.  If that isn't used, but file 1 is, then
2311
       use that as main file name.  */
2312
0
    if (files_in_use > 1 && files[1].filename != NULL)
2313
0
      {
2314
0
        files[0].filename = files[1].filename;
2315
0
        files[0].dir = files[1].dir;
2316
0
        if (emit_md5)
2317
0
    for (j = 0; j < NUM_MD5_BYTES; ++j)
2318
0
      files[0].md5[j] = files[1].md5[j];
2319
0
      }
2320
0
    else
2321
0
      files[0].filename = "";
2322
0
  }
2323
2324
16
      fullfilename = DWARF2_FILE_NAME (files[i].filename,
2325
16
               files[i].dir ? dirs [files [i].dir] : "");
2326
16
      if (DWARF2_LINE_VERSION < 5)
2327
0
  {
2328
0
    size = strlen (fullfilename) + 1;
2329
0
    cp = frag_more (size);
2330
0
    memcpy (cp, fullfilename, size);
2331
0
  }
2332
16
      else
2333
16
  {
2334
16
    if (!file0_strp)
2335
16
      line_strp = add_line_strp (line_str_seg, fullfilename);
2336
0
    else
2337
0
      line_strp = file0_strp;
2338
16
    subseg_set (line_seg, 0);
2339
16
    TC_DWARF2_EMIT_OFFSET (line_strp, sizeof_offset);
2340
16
    if (i == 0 && files_in_use > 1
2341
0
        && files[0].filename == files[1].filename)
2342
0
      file0_strp = line_strp;
2343
16
    else
2344
16
      file0_strp = NULL;
2345
16
  }
2346
2347
      /* Directory number.  */
2348
16
      out_uleb128 (files[i].dir);
2349
2350
      /* Output the last modification timestamp.  */
2351
16
      if (emit_timestamps)
2352
0
  {
2353
0
    offsetT timestamp;
2354
2355
0
    timestamp = DWARF2_FILE_TIME_NAME (files[i].filename,
2356
0
               files[i].dir ? dirs [files [i].dir] : "");
2357
0
    if (timestamp == -1)
2358
0
      timestamp = 0;
2359
0
    out_uleb128 (timestamp);
2360
0
  }
2361
2362
      /* Output the filesize.  */
2363
16
      if (emit_filesize)
2364
0
  {
2365
0
    offsetT filesize;
2366
0
    filesize = DWARF2_FILE_SIZE_NAME (files[i].filename,
2367
0
              files[i].dir ? dirs [files [i].dir] : "");
2368
0
    if (filesize == -1)
2369
0
      filesize = 0;
2370
0
    out_uleb128 (filesize);
2371
0
  }
2372
2373
      /* Output the md5 sum.  */
2374
16
      if (emit_md5)
2375
0
  {
2376
0
    int b;
2377
2378
0
    for (b = 0; b < NUM_MD5_BYTES; b++)
2379
0
      out_byte (files[i].md5[b]);
2380
0
  }
2381
16
    }
2382
2383
16
  if (DWARF2_LINE_VERSION < 5)
2384
    /* Terminate filename list.  */
2385
0
    out_byte (0);
2386
16
}
2387
2388
/* Switch to SEC and output a header length field.  Return the size of
2389
   offsets used in SEC.  The caller must set EXPR->X_add_symbol value
2390
   to the end of the section.  EXPR->X_add_number will be set to the
2391
   negative size of the header.  */
2392
2393
static int
2394
out_header (asection *sec, expressionS *exp)
2395
48
{
2396
48
  symbolS *start_sym;
2397
48
  symbolS *end_sym;
2398
2399
48
  subseg_set (sec, 0);
2400
2401
48
  if (flag_dwarf_sections)
2402
0
    {
2403
      /* If we are going to put the start and end symbols in different
2404
   sections, then we need real symbols, not just fake, local ones.  */
2405
0
      frag_now_fix ();
2406
0
      start_sym = symbol_make (".Ldebug_line_start");
2407
0
      end_sym = symbol_make (".Ldebug_line_end");
2408
0
      symbol_set_value_now (start_sym);
2409
0
    }
2410
48
  else
2411
48
    {
2412
48
      start_sym = symbol_temp_new_now_octets ();
2413
48
      end_sym = symbol_temp_make ();
2414
48
    }
2415
2416
  /* Total length of the information.  */
2417
48
  exp->X_op = O_subtract;
2418
48
  exp->X_add_symbol = end_sym;
2419
48
  exp->X_op_symbol = start_sym;
2420
2421
48
  switch (DWARF2_FORMAT (sec))
2422
48
    {
2423
48
    case dwarf2_format_32bit:
2424
48
      exp->X_add_number = -4;
2425
48
      emit_expr (exp, 4);
2426
48
      return 4;
2427
2428
0
    case dwarf2_format_64bit:
2429
0
      exp->X_add_number = -12;
2430
0
      out_four (-1);
2431
0
      emit_expr (exp, 8);
2432
0
      return 8;
2433
2434
0
    case dwarf2_format_64bit_irix:
2435
0
      exp->X_add_number = -8;
2436
0
      emit_expr (exp, 8);
2437
0
      return 8;
2438
48
    }
2439
2440
0
  as_fatal (_("internal error: unknown dwarf2 format"));
2441
0
  return 0;
2442
48
}
2443
2444
/* Emit the collected .debug_line data.  */
2445
2446
static void
2447
out_debug_line (segT line_seg)
2448
16
{
2449
16
  expressionS exp;
2450
16
  symbolS *prologue_start, *prologue_end;
2451
16
  symbolS *line_end;
2452
16
  struct line_seg *s;
2453
16
  int sizeof_offset;
2454
2455
16
  memset (&exp, 0, sizeof exp);
2456
16
  sizeof_offset = out_header (line_seg, &exp);
2457
16
  line_end = exp.X_add_symbol;
2458
2459
  /* Version.  */
2460
16
  out_two (DWARF2_LINE_VERSION);
2461
2462
16
  if (DWARF2_LINE_VERSION >= 5)
2463
16
    {
2464
16
      out_byte (sizeof_address);
2465
16
      out_byte (0); /* Segment Selector size.  */
2466
16
    }
2467
  /* Length of the prologue following this length.  */
2468
16
  prologue_start = symbol_temp_make ();
2469
16
  prologue_end = symbol_temp_make ();
2470
16
  exp.X_op = O_subtract;
2471
16
  exp.X_add_symbol = prologue_end;
2472
16
  exp.X_op_symbol = prologue_start;
2473
16
  exp.X_add_number = 0;
2474
16
  emit_expr (&exp, sizeof_offset);
2475
16
  symbol_set_value_now (prologue_start);
2476
2477
  /* Parameters of the state machine.  */
2478
16
  out_byte (DWARF2_LINE_MIN_INSN_LENGTH);
2479
16
  if (DWARF2_LINE_VERSION >= 4)
2480
16
    out_byte (DWARF2_LINE_MAX_OPS_PER_INSN);
2481
16
  out_byte (DWARF2_LINE_DEFAULT_IS_STMT);
2482
16
  out_byte (DWARF2_LINE_BASE);
2483
16
  out_byte (DWARF2_LINE_RANGE);
2484
16
  out_byte (DWARF2_LINE_OPCODE_BASE);
2485
2486
  /* Standard opcode lengths.  */
2487
16
  out_byte (0);     /* DW_LNS_copy */
2488
16
  out_byte (1);     /* DW_LNS_advance_pc */
2489
16
  out_byte (1);     /* DW_LNS_advance_line */
2490
16
  out_byte (1);     /* DW_LNS_set_file */
2491
16
  out_byte (1);     /* DW_LNS_set_column */
2492
16
  out_byte (0);     /* DW_LNS_negate_stmt */
2493
16
  out_byte (0);     /* DW_LNS_set_basic_block */
2494
16
  out_byte (0);     /* DW_LNS_const_add_pc */
2495
16
  out_byte (1);     /* DW_LNS_fixed_advance_pc */
2496
16
  if (DWARF2_LINE_VERSION >= 3)
2497
16
    {
2498
16
      out_byte (0);     /* DW_LNS_set_prologue_end */
2499
16
      out_byte (0);     /* DW_LNS_set_epilogue_begin */
2500
16
      out_byte (1);     /* DW_LNS_set_isa */
2501
      /* We have emitted 12 opcode lengths, so make that this
2502
   matches up to the opcode base value we have been using.  */
2503
16
      gas_assert (DWARF2_LINE_OPCODE_BASE == 13);
2504
16
    }
2505
0
  else
2506
0
    gas_assert (DWARF2_LINE_OPCODE_BASE == 10);
2507
2508
16
  out_dir_and_file_list (line_seg, sizeof_offset);
2509
2510
16
  symbol_set_value_now (prologue_end);
2511
2512
  /* For each section, emit a statement program.  */
2513
32
  for (s = all_segs; s; s = s->next)
2514
    /* Paranoia - this check should have already have
2515
       been handled in dwarf2_gen_line_info_1().  */
2516
16
    if (s->head->head && SEG_NORMAL (s->seg))
2517
16
      process_entries (s->seg, s->head->head);
2518
2519
16
  if (flag_dwarf_sections)
2520
    /* We have to switch to the special .debug_line_end section
2521
       before emitting the end-of-debug_line symbol.  The linker
2522
       script arranges for this section to be placed after all the
2523
       (potentially garbage collected) .debug_line.<foo> sections.
2524
       This section contains the line_end symbol which is used to
2525
       compute the size of the linked .debug_line section, as seen
2526
       in the DWARF Line Number header.  */
2527
0
    subseg_set (subseg_get (".debug_line_end", false), 0);
2528
2529
16
  symbol_set_value_now (line_end);
2530
16
}
2531
2532
static void
2533
out_debug_ranges (segT ranges_seg, symbolS **ranges_sym)
2534
0
{
2535
0
  unsigned int addr_size = sizeof_address;
2536
0
  struct line_seg *s;
2537
0
  expressionS exp;
2538
0
  unsigned int i;
2539
2540
0
  memset (&exp, 0, sizeof exp);
2541
0
  subseg_set (ranges_seg, 0);
2542
2543
  /* For DW_AT_ranges to point at (there is no header, so really start
2544
     of section, but see out_debug_rnglists).  */
2545
0
  *ranges_sym = symbol_temp_new_now_octets ();
2546
2547
  /* Base Address Entry.  */
2548
0
  for (i = 0; i < addr_size; i++)
2549
0
    out_byte (0xff);
2550
0
  for (i = 0; i < addr_size; i++)
2551
0
    out_byte (0);
2552
2553
  /* Range List Entry.  */
2554
0
  for (s = all_segs; s; s = s->next)
2555
0
    {
2556
0
      fragS *frag;
2557
0
      symbolS *beg, *end;
2558
2559
0
      frag = first_frag_for_seg (s->seg);
2560
0
      beg = symbol_temp_new (s->seg, frag, 0);
2561
0
      s->text_start = beg;
2562
2563
0
      frag = last_frag_for_seg (s->seg);
2564
0
      end = symbol_temp_new (s->seg, frag, get_frag_fix (frag, s->seg));
2565
0
      s->text_end = end;
2566
2567
0
      exp.X_op = O_symbol;
2568
0
      exp.X_add_symbol = beg;
2569
0
      exp.X_add_number = 0;
2570
0
      emit_expr (&exp, addr_size);
2571
2572
0
      exp.X_op = O_symbol;
2573
0
      exp.X_add_symbol = end;
2574
0
      exp.X_add_number = 0;
2575
0
      emit_expr (&exp, addr_size);
2576
0
    }
2577
2578
  /* End of Range Entry.   */
2579
0
  for (i = 0; i < addr_size; i++)
2580
0
    out_byte (0);
2581
0
  for (i = 0; i < addr_size; i++)
2582
0
    out_byte (0);
2583
0
}
2584
2585
static void
2586
out_debug_rnglists (segT ranges_seg, symbolS **ranges_sym)
2587
0
{
2588
0
  expressionS exp;
2589
0
  symbolS *ranges_end;
2590
0
  struct line_seg *s;
2591
2592
  /* Unit length.  */
2593
0
  memset (&exp, 0, sizeof exp);
2594
0
  out_header (ranges_seg, &exp);
2595
0
  ranges_end = exp.X_add_symbol;
2596
2597
0
  out_two (DWARF2_RNGLISTS_VERSION);
2598
0
  out_byte (sizeof_address);
2599
0
  out_byte (0); /* Segment Selector size.  */
2600
0
  out_four (0); /* Offset entry count.  */
2601
2602
  /* For DW_AT_ranges to point at (must be after the header).   */
2603
0
  *ranges_sym = symbol_temp_new_now_octets ();
2604
2605
0
  for (s = all_segs; s; s = s->next)
2606
0
    {
2607
0
      fragS *frag;
2608
0
      symbolS *beg, *end;
2609
2610
0
      out_byte (DW_RLE_start_length);
2611
2612
0
      frag = first_frag_for_seg (s->seg);
2613
0
      beg = symbol_temp_new (s->seg, frag, 0);
2614
0
      s->text_start = beg;
2615
2616
0
      frag = last_frag_for_seg (s->seg);
2617
0
      end = symbol_temp_new (s->seg, frag, get_frag_fix (frag, s->seg));
2618
0
      s->text_end = end;
2619
2620
0
      exp.X_op = O_symbol;
2621
0
      exp.X_add_symbol = beg;
2622
0
      exp.X_add_number = 0;
2623
0
      emit_expr (&exp, sizeof_address);
2624
2625
0
      exp.X_op = O_symbol;
2626
0
      exp.X_add_symbol = end;
2627
0
      exp.X_add_number = 0;
2628
0
      emit_leb128_expr (&exp, 0);
2629
0
    }
2630
2631
0
  out_byte (DW_RLE_end_of_list);
2632
2633
0
  symbol_set_value_now (ranges_end);
2634
0
}
2635
2636
/* Emit data for .debug_aranges.  */
2637
2638
static void
2639
out_debug_aranges (segT aranges_seg, segT info_seg)
2640
16
{
2641
16
  unsigned int addr_size = sizeof_address;
2642
16
  offsetT size;
2643
16
  struct line_seg *s;
2644
16
  expressionS exp;
2645
16
  symbolS *aranges_end;
2646
16
  char *p;
2647
16
  int sizeof_offset;
2648
2649
16
  memset (&exp, 0, sizeof exp);
2650
16
  sizeof_offset = out_header (aranges_seg, &exp);
2651
16
  aranges_end = exp.X_add_symbol;
2652
16
  size = -exp.X_add_number;
2653
2654
  /* Version.  */
2655
16
  out_two (DWARF2_ARANGES_VERSION);
2656
16
  size += 2;
2657
2658
  /* Offset to .debug_info.  */
2659
16
  TC_DWARF2_EMIT_OFFSET (section_symbol (info_seg), sizeof_offset);
2660
16
  size += sizeof_offset;
2661
2662
  /* Size of an address (offset portion).  */
2663
16
  out_byte (addr_size);
2664
16
  size++;
2665
2666
  /* Size of a segment descriptor.  */
2667
16
  out_byte (0);
2668
16
  size++;
2669
2670
  /* Align the header.  */
2671
80
  while ((size++ % (2 * addr_size)) > 0)
2672
64
    out_byte (0);
2673
2674
32
  for (s = all_segs; s; s = s->next)
2675
16
    {
2676
16
      fragS *frag;
2677
16
      symbolS *beg, *end;
2678
2679
16
      frag = first_frag_for_seg (s->seg);
2680
16
      beg = symbol_temp_new (s->seg, frag, 0);
2681
16
      s->text_start = beg;
2682
2683
16
      frag = last_frag_for_seg (s->seg);
2684
16
      end = symbol_temp_new (s->seg, frag, get_frag_fix (frag, s->seg));
2685
16
      s->text_end = end;
2686
2687
16
      exp.X_op = O_symbol;
2688
16
      exp.X_add_symbol = beg;
2689
16
      exp.X_add_number = 0;
2690
16
      emit_expr (&exp, addr_size);
2691
2692
16
      exp.X_op = O_subtract;
2693
16
      exp.X_add_symbol = end;
2694
16
      exp.X_op_symbol = beg;
2695
16
      exp.X_add_number = 0;
2696
16
      emit_expr (&exp, addr_size);
2697
16
    }
2698
2699
16
  p = frag_more (2 * addr_size);
2700
16
  md_number_to_chars (p, 0, addr_size);
2701
16
  md_number_to_chars (p + addr_size, 0, addr_size);
2702
2703
16
  symbol_set_value_now (aranges_end);
2704
16
}
2705
2706
/* Emit data for .debug_abbrev.  Note that this must be kept in
2707
   sync with out_debug_info below.  */
2708
2709
static void
2710
out_debug_abbrev (segT abbrev_seg,
2711
      segT info_seg ATTRIBUTE_UNUSED,
2712
      segT line_seg ATTRIBUTE_UNUSED,
2713
      unsigned char *func_formP)
2714
16
{
2715
16
  int secoff_form;
2716
16
  bool have_efunc = false, have_lfunc = false;
2717
2718
  /* Check the symbol table for function symbols which also have their size
2719
     specified.  */
2720
16
  if (symbol_rootP)
2721
16
    {
2722
16
      symbolS *symp;
2723
2724
1.53k
      for (symp = symbol_rootP; symp; symp = symbol_next (symp))
2725
1.51k
  {
2726
    /* A warning construct is a warning symbol followed by the
2727
       symbol warned about.  Skip this and the following symbol.  */
2728
1.51k
    if (symbol_get_bfdsym (symp)->flags & BSF_WARNING)
2729
0
      {
2730
0
        symp = symbol_next (symp);
2731
0
        if (!symp)
2732
0
          break;
2733
0
        continue;
2734
0
      }
2735
2736
1.51k
    if (!S_IS_DEFINED (symp) || !S_IS_FUNCTION (symp))
2737
1.51k
      continue;
2738
2739
1
#if defined (OBJ_ELF) /* || defined (OBJ_MAYBE_ELF) */
2740
1
    if (S_GET_SIZE (symp) == 0)
2741
1
      {
2742
1
        if (!IS_ELF || symbol_get_obj (symp)->size == NULL)
2743
1
    continue;
2744
1
      }
2745
#else
2746
    continue;
2747
#endif
2748
2749
0
    if (S_IS_EXTERNAL (symp))
2750
0
      have_efunc = true;
2751
0
    else
2752
0
      have_lfunc = true;
2753
0
  }
2754
16
    }
2755
2756
16
  subseg_set (abbrev_seg, 0);
2757
2758
16
  out_uleb128 (GAS_ABBREV_COMP_UNIT);
2759
16
  out_uleb128 (DW_TAG_compile_unit);
2760
16
  out_byte (have_efunc || have_lfunc ? DW_CHILDREN_yes : DW_CHILDREN_no);
2761
16
  if (DWARF2_VERSION < 4)
2762
0
    {
2763
0
      if (DWARF2_FORMAT (line_seg) == dwarf2_format_32bit)
2764
0
  secoff_form = DW_FORM_data4;
2765
0
      else
2766
0
  secoff_form = DW_FORM_data8;
2767
0
    }
2768
16
  else
2769
16
    secoff_form = DW_FORM_sec_offset;
2770
16
  out_abbrev (DW_AT_stmt_list, secoff_form);
2771
16
  if (all_segs->next == NULL)
2772
16
    {
2773
16
      out_abbrev (DW_AT_low_pc, DW_FORM_addr);
2774
16
      if (DWARF2_VERSION < 4)
2775
0
  out_abbrev (DW_AT_high_pc, DW_FORM_addr);
2776
16
      else
2777
16
  out_abbrev (DW_AT_high_pc, DW_FORM_udata);
2778
16
    }
2779
0
  else
2780
0
    out_abbrev (DW_AT_ranges, secoff_form);
2781
16
  out_abbrev (DW_AT_name, DW_FORM_strp);
2782
16
  out_abbrev (DW_AT_comp_dir, DW_FORM_strp);
2783
16
  out_abbrev (DW_AT_producer, DW_FORM_strp);
2784
16
  out_abbrev (DW_AT_language, DW_FORM_data2);
2785
16
  out_abbrev (0, 0);
2786
2787
16
  if (have_efunc || have_lfunc)
2788
0
    {
2789
0
      out_uleb128 (GAS_ABBREV_SUBPROG);
2790
0
      out_uleb128 (DW_TAG_subprogram);
2791
0
      out_byte (DW_CHILDREN_no);
2792
0
      out_abbrev (DW_AT_name, DW_FORM_strp);
2793
0
      if (have_efunc)
2794
0
  {
2795
0
    if (have_lfunc || DWARF2_VERSION < 4)
2796
0
      *func_formP = DW_FORM_flag;
2797
0
    else
2798
0
      *func_formP = DW_FORM_flag_present;
2799
0
    out_abbrev (DW_AT_external, *func_formP);
2800
0
  }
2801
0
      else
2802
  /* Any non-zero value other than DW_FORM_flag will do.  */
2803
0
  *func_formP = DW_FORM_block;
2804
2805
      /* PR 29517: Provide a return type for the function.  */
2806
0
      if (DWARF2_VERSION > 2)
2807
0
  out_abbrev (DW_AT_type, DW_FORM_ref_udata);
2808
2809
0
      out_abbrev (DW_AT_low_pc, DW_FORM_addr);
2810
0
      out_abbrev (DW_AT_high_pc,
2811
0
      DWARF2_VERSION < 4 ? DW_FORM_addr : DW_FORM_udata);
2812
0
      out_abbrev (0, 0);
2813
2814
0
      if (DWARF2_VERSION > 2)
2815
0
  {
2816
    /* PR 29517: We do not actually know the return type of these
2817
       functions, so provide an abbrev that uses DWARF's unspecified
2818
       type.  */
2819
0
    out_uleb128 (GAS_ABBREV_NO_TYPE);
2820
0
    out_uleb128 (DW_TAG_unspecified_type);
2821
0
    out_byte (DW_CHILDREN_no);
2822
0
    out_abbrev (0, 0);
2823
0
  }
2824
0
    }
2825
2826
  /* Terminate the abbreviations for this compilation unit.  */
2827
16
  out_byte (0);
2828
16
}
2829
2830
/* Emit a description of this compilation unit for .debug_info.  */
2831
2832
static void
2833
out_debug_info (segT info_seg, segT abbrev_seg, segT line_seg, segT str_seg,
2834
    symbolS *ranges_sym, symbolS *name_sym,
2835
    symbolS *comp_dir_sym, symbolS *producer_sym,
2836
    unsigned char func_form)
2837
16
{
2838
16
  expressionS exp;
2839
16
  symbolS *info_end;
2840
16
  int sizeof_offset;
2841
2842
16
  memset (&exp, 0, sizeof exp);
2843
16
  sizeof_offset = out_header (info_seg, &exp);
2844
16
  info_end = exp.X_add_symbol;
2845
2846
  /* DWARF version.  */
2847
16
  out_two (DWARF2_VERSION);
2848
2849
16
  if (DWARF2_VERSION < 5)
2850
0
    {
2851
      /* .debug_abbrev offset */
2852
0
      TC_DWARF2_EMIT_OFFSET (section_symbol (abbrev_seg), sizeof_offset);
2853
0
    }
2854
16
  else
2855
16
    {
2856
      /* unit (header) type */
2857
16
      out_byte (DW_UT_compile);
2858
16
    }
2859
2860
  /* Target address size.  */
2861
16
  out_byte (sizeof_address);
2862
2863
16
  if (DWARF2_VERSION >= 5)
2864
16
    {
2865
      /* .debug_abbrev offset */
2866
16
      TC_DWARF2_EMIT_OFFSET (section_symbol (abbrev_seg), sizeof_offset);
2867
16
    }
2868
2869
  /* DW_TAG_compile_unit DIE abbrev */
2870
16
  out_uleb128 (GAS_ABBREV_COMP_UNIT);
2871
2872
  /* DW_AT_stmt_list */
2873
16
  TC_DWARF2_EMIT_OFFSET (section_symbol (line_seg),
2874
16
       (DWARF2_FORMAT (line_seg) == dwarf2_format_32bit
2875
16
        ? 4 : 8));
2876
2877
  /* These two attributes are emitted if all of the code is contiguous.  */
2878
16
  if (all_segs->next == NULL)
2879
16
    {
2880
      /* DW_AT_low_pc */
2881
16
      exp.X_op = O_symbol;
2882
16
      exp.X_add_symbol = all_segs->text_start;
2883
16
      exp.X_add_number = 0;
2884
16
      emit_expr (&exp, sizeof_address);
2885
2886
      /* DW_AT_high_pc */
2887
16
      if (DWARF2_VERSION < 4)
2888
0
  exp.X_op = O_symbol;
2889
16
      else
2890
16
  {
2891
16
    exp.X_op = O_subtract;
2892
16
    exp.X_op_symbol = all_segs->text_start;
2893
16
  }
2894
16
      exp.X_add_symbol = all_segs->text_end;
2895
16
      exp.X_add_number = 0;
2896
16
      if (DWARF2_VERSION < 4)
2897
0
  emit_expr (&exp, sizeof_address);
2898
16
      else
2899
16
  emit_leb128_expr (&exp, 0);
2900
16
    }
2901
0
  else
2902
0
    {
2903
      /* This attribute is emitted if the code is disjoint.  */
2904
      /* DW_AT_ranges.  */
2905
0
      TC_DWARF2_EMIT_OFFSET (ranges_sym, sizeof_offset);
2906
0
    }
2907
2908
  /* DW_AT_name, DW_AT_comp_dir and DW_AT_producer.  Symbols in .debug_str
2909
     setup in out_debug_str below.  */
2910
16
  TC_DWARF2_EMIT_OFFSET (name_sym, sizeof_offset);
2911
16
  TC_DWARF2_EMIT_OFFSET (comp_dir_sym, sizeof_offset);
2912
16
  TC_DWARF2_EMIT_OFFSET (producer_sym, sizeof_offset);
2913
2914
  /* DW_AT_language.  Yes, this is probably not really MIPS, but the
2915
     dwarf2 draft has no standard code for assembler.  */
2916
16
  out_two (DW_LANG_Mips_Assembler);
2917
2918
16
  if (func_form)
2919
0
    {
2920
0
      symbolS *symp;
2921
0
      symbolS *no_type_tag;
2922
2923
0
      if (DWARF2_VERSION > 2)
2924
0
  no_type_tag = symbol_make (".Ldebug_no_type_tag");
2925
0
      else
2926
0
  no_type_tag = NULL;
2927
2928
0
      for (symp = symbol_rootP; symp; symp = symbol_next (symp))
2929
0
  {
2930
0
    const char *name;
2931
0
    size_t len;
2932
0
    expressionS size = { .X_op = O_constant };
2933
2934
    /* Skip warning constructs (see above).  */
2935
0
    if (symbol_get_bfdsym (symp)->flags & BSF_WARNING)
2936
0
      {
2937
0
        symp = symbol_next (symp);
2938
0
        if (!symp)
2939
0
          break;
2940
0
        continue;
2941
0
      }
2942
2943
0
    if (!S_IS_DEFINED (symp) || !S_IS_FUNCTION (symp))
2944
0
      continue;
2945
2946
0
#if defined (OBJ_ELF) /* || defined (OBJ_MAYBE_ELF) */
2947
0
    size.X_add_number = S_GET_SIZE (symp);
2948
0
    if (size.X_add_number == 0 && IS_ELF
2949
0
        && symbol_get_obj (symp)->size != NULL)
2950
0
      {
2951
0
        size.X_op = O_add;
2952
0
        size.X_op_symbol = make_expr_symbol (symbol_get_obj (symp)->size);
2953
0
      }
2954
0
#endif
2955
0
    if (size.X_op == O_constant && size.X_add_number == 0)
2956
0
      continue;
2957
2958
0
    subseg_set (str_seg, 0);
2959
0
    name_sym = symbol_temp_new_now_octets ();
2960
0
    name = S_GET_NAME (symp);
2961
0
    len = strlen (name) + 1;
2962
0
    memcpy (frag_more (len), name, len);
2963
2964
0
    subseg_set (info_seg, 0);
2965
2966
    /* DW_TAG_subprogram DIE abbrev */
2967
0
    out_uleb128 (GAS_ABBREV_SUBPROG);
2968
2969
    /* DW_AT_name */
2970
0
    TC_DWARF2_EMIT_OFFSET (name_sym, sizeof_offset);
2971
2972
    /* DW_AT_external.  */
2973
0
    if (func_form == DW_FORM_flag)
2974
0
      out_byte (S_IS_EXTERNAL (symp));
2975
2976
    /* PR 29517: Let consumers know that we do not have
2977
       return type information for this function.  */
2978
0
    if (DWARF2_VERSION > 2)
2979
0
      {
2980
0
        exp.X_op = O_symbol;
2981
0
        exp.X_add_symbol = no_type_tag;
2982
0
        exp.X_add_number = 0;
2983
0
        emit_leb128_expr (&exp, 0);
2984
0
      }
2985
2986
    /* DW_AT_low_pc */
2987
0
    exp.X_op = O_symbol;
2988
0
    exp.X_add_symbol = symp;
2989
0
    exp.X_add_number = 0;
2990
0
    emit_expr (&exp, sizeof_address);
2991
2992
    /* DW_AT_high_pc */
2993
0
    if (DWARF2_VERSION < 4)
2994
0
      {
2995
0
        if (size.X_op == O_constant)
2996
0
    size.X_op = O_symbol;
2997
0
        size.X_add_symbol = symp;
2998
0
        emit_expr (&size, sizeof_address);
2999
0
      }
3000
0
    else if (size.X_op == O_constant)
3001
0
      out_uleb128 (size.X_add_number);
3002
0
    else
3003
0
      emit_leb128_expr (symbol_get_value_expression (size.X_op_symbol), 0);
3004
0
  }
3005
3006
0
      if (DWARF2_VERSION > 2)
3007
0
  {
3008
    /* PR 29517: Generate a DIE for the unspecified type abbrev.
3009
       We do it here because it cannot be part of the top level DIE.   */
3010
0
    subseg_set (info_seg, 0);
3011
0
    symbol_set_value_now (no_type_tag);
3012
0
    out_uleb128 (GAS_ABBREV_NO_TYPE);
3013
0
  }
3014
3015
      /* End of children.  */
3016
0
      out_leb128 (0);
3017
0
    }
3018
3019
16
  symbol_set_value_now (info_end);
3020
16
}
3021
3022
/* Emit the three debug strings needed in .debug_str and setup symbols
3023
   to them for use in out_debug_info.  */
3024
static void
3025
out_debug_str (segT str_seg, symbolS **name_sym, symbolS **comp_dir_sym,
3026
         symbolS **producer_sym)
3027
16
{
3028
16
  char producer[128];
3029
16
  char *p;
3030
16
  int len;
3031
16
  int first_file = DWARF2_LINE_VERSION > 4 ? 0 : 1;
3032
3033
16
  if (files_in_use == 0)
3034
0
    abort ();
3035
16
  if (first_file == 0 && files[first_file].filename == NULL)
3036
0
    first_file = 1;
3037
3038
16
  subseg_set (str_seg, 0);
3039
3040
  /* DW_AT_name.  We don't have the actual file name that was present
3041
     on the command line, so assume files[first_file] is the main input file.
3042
     We're not supposed to get called unless at least one line number
3043
     entry was emitted, so this should always be defined.  */
3044
16
  *name_sym = symbol_temp_new_now_octets ();
3045
3046
16
  if (files[first_file].dir)
3047
3
    {
3048
3
      char *dirname = remap_debug_filename (dirs[files[first_file].dir]);
3049
3
      len = strlen (dirname);
3050
#ifdef TE_VMS
3051
      /* Already has trailing slash.  */
3052
      p = frag_more (len);
3053
      memcpy (p, dirname, len);
3054
#else
3055
3
      p = frag_more (len + 1);
3056
3
      memcpy (p, dirname, len);
3057
3
      INSERT_DIR_SEPARATOR (p, len);
3058
3
#endif
3059
3
      free (dirname);
3060
3
    }
3061
16
  len = strlen (files[first_file].filename) + 1;
3062
16
  p = frag_more (len);
3063
16
  memcpy (p, files[first_file].filename, len);
3064
3065
  /* DW_AT_comp_dir */
3066
16
  *comp_dir_sym = symbol_temp_new_now_octets ();
3067
16
  char *comp_dir = remap_debug_filename (getpwd ());
3068
16
  len = strlen (comp_dir) + 1;
3069
16
  p = frag_more (len);
3070
16
  memcpy (p, comp_dir, len);
3071
16
  free (comp_dir);
3072
3073
  /* DW_AT_producer */
3074
16
  *producer_sym = symbol_temp_new_now_octets ();
3075
16
  sprintf (producer, "GNU AS %s", VERSION);
3076
16
  len = strlen (producer) + 1;
3077
16
  p = frag_more (len);
3078
16
  memcpy (p, producer, len);
3079
16
}
3080
3081
void
3082
dwarf2_init (void)
3083
207
{
3084
207
  all_segs = NULL;
3085
207
  last_seg_ptr = &all_segs;
3086
207
  files = NULL;
3087
207
  files_in_use = 0;
3088
207
  files_allocated = 0;
3089
207
  dirs = NULL;
3090
207
  dirs_in_use = 0;
3091
207
  dirs_allocated = 0;
3092
207
  dwarf2_loc_directive_seen = false;
3093
207
  dwarf2_any_loc_directive_seen = false;
3094
207
  dwarf2_loc_mark_labels = false;
3095
207
  current.filenum = 1;
3096
207
  current.line = 1;
3097
207
  current.column = 0;
3098
207
  current.isa = 0;
3099
207
  current.flags = DWARF2_LINE_DEFAULT_IS_STMT ? DWARF2_FLAG_IS_STMT : 0;
3100
207
  current.discriminator = 0;
3101
207
  current.u.view = NULL;
3102
207
  force_reset_view = NULL;
3103
207
  view_assert_failed = NULL;
3104
207
  dw2_line = -1;
3105
207
  dw2_filename = NULL;
3106
207
  label_num = 0;
3107
207
  last_used = -1;
3108
3109
  /* Select the default CIE version to produce here.  The global
3110
     starts with a value of -1 and will be modified to a valid value
3111
     either by the user providing a command line option, or some
3112
     targets will select their own default in md_after_parse_args.  If
3113
     we get here and the global still contains -1 then it is up to us
3114
     to pick a sane default.  The default we choose is 1, this is the
3115
     CIE version gas has produced for a long time, and there seems no
3116
     reason to change it yet.  */
3117
207
  if (flag_dwarf_cie_version == -1)
3118
1
    flag_dwarf_cie_version = 1;
3119
207
}
3120
3121
static void
3122
dwarf2_cleanup (void)
3123
207
{
3124
207
  purge_generated_debug (true);
3125
207
  free (files);
3126
239
  for (unsigned int i = 0; i < dirs_in_use; i++)
3127
32
    free (dirs[i]);
3128
207
  free (dirs);
3129
207
}
3130
3131
/* Finish the dwarf2 debug sections.  We emit .debug.line if there
3132
   were any .file/.loc directives, or --gdwarf2 was given, and if the
3133
   file has a non-empty .debug_info section and an empty .debug_line
3134
   section.  If we emit .debug_line, and the .debug_info section is
3135
   empty, we also emit .debug_info, .debug_aranges and .debug_abbrev.
3136
   ALL_SEGS will be non-null if there were any .file/.loc directives,
3137
   or --gdwarf2 was given and there were any located instructions
3138
   emitted.  */
3139
3140
void
3141
dwarf2_finish (void)
3142
207
{
3143
207
  segT line_seg;
3144
207
  struct line_seg *s;
3145
207
  segT info_seg;
3146
207
  int emit_other_sections = 0;
3147
207
  int empty_debug_line = 0;
3148
3149
207
  info_seg = bfd_get_section_by_name (stdoutput, ".debug_info");
3150
207
  emit_other_sections = info_seg == NULL || !seg_not_empty_p (info_seg);
3151
3152
207
  line_seg = bfd_get_section_by_name (stdoutput, ".debug_line");
3153
207
  empty_debug_line = line_seg == NULL || !seg_not_empty_p (line_seg);
3154
3155
  /* We can't construct a new debug_line section if we already have one.
3156
     Give an error if we have seen any .loc, otherwise trust the user
3157
     knows what they are doing and want to generate the .debug_line
3158
     (and all other debug sections) themselves.  */
3159
207
  if (all_segs && !empty_debug_line && dwarf2_any_loc_directive_seen)
3160
0
    as_fatal ("duplicate .debug_line sections");
3161
3162
207
  if ((!all_segs && emit_other_sections)
3163
16
      || (!emit_other_sections && !empty_debug_line))
3164
    /* If there is no line information and no non-empty .debug_info
3165
       section, or if there is both a non-empty .debug_info and a non-empty
3166
       .debug_line, then we do nothing.  */
3167
191
    {
3168
191
      dwarf2_cleanup ();
3169
191
      return;
3170
191
    }
3171
3172
  /* Calculate the size of an address for the target machine.  */
3173
16
  sizeof_address = DWARF2_ADDR_SIZE (stdoutput);
3174
3175
  /* Create and switch to the line number section.  */
3176
16
  if (empty_debug_line)
3177
16
    {
3178
16
      line_seg = subseg_new (".debug_line", 0);
3179
16
      bfd_set_section_flags (line_seg,
3180
16
           SEC_READONLY | SEC_DEBUGGING | SEC_OCTETS);
3181
16
    }
3182
3183
32
  for (s = all_segs; s; s = s->next)
3184
16
    {
3185
16
      struct line_subseg *lss;
3186
3187
35
      for (lss = s->head; lss; lss = lss->next)
3188
19
  if (lss->head)
3189
19
    do_allocate_filenum (lss->head);
3190
16
    }
3191
3192
  /* For each subsection, chain the debug entries together.  */
3193
32
  for (s = all_segs; s; s = s->next)
3194
16
    {
3195
16
      struct line_subseg *lss = s->head;
3196
16
      struct line_entry **ptail = lss->ptail;
3197
3198
      /* Reset the initial view of the first subsection of the
3199
   section.  */
3200
16
      if (lss->head && lss->head->loc.u.view)
3201
0
  set_or_check_view (lss->head, NULL, NULL);
3202
3203
19
      while ((lss = lss->next) != NULL)
3204
3
  {
3205
    /* Link the first view of subsequent subsections to the
3206
       previous view.  */
3207
3
    if (lss->head && lss->head->loc.u.view)
3208
0
      set_or_check_view (lss->head, line_entry_at_tail (s->head, ptail),
3209
0
             s->head ? s->head->head : NULL);
3210
3
    *ptail = lss->head;
3211
3
    lss->head = NULL;
3212
3
    ptail = lss->ptail;
3213
3
  }
3214
16
    }
3215
3216
16
  if (empty_debug_line)
3217
16
    out_debug_line (line_seg);
3218
3219
  /* If this is assembler generated line info, and there is no
3220
     debug_info already, we need .debug_info, .debug_abbrev and
3221
     .debug_str sections as well.  */
3222
16
  if (emit_other_sections)
3223
16
    {
3224
16
      segT abbrev_seg;
3225
16
      segT aranges_seg;
3226
16
      segT str_seg;
3227
16
      symbolS *name_sym, *comp_dir_sym, *producer_sym, *ranges_sym;
3228
16
      unsigned char func_form = 0;
3229
3230
16
      gas_assert (all_segs);
3231
3232
16
      info_seg = subseg_new (".debug_info", 0);
3233
16
      abbrev_seg = subseg_new (".debug_abbrev", 0);
3234
16
      aranges_seg = subseg_new (".debug_aranges", 0);
3235
16
      str_seg = subseg_new (".debug_str", 0);
3236
3237
16
      bfd_set_section_flags (info_seg,
3238
16
            SEC_READONLY | SEC_DEBUGGING | SEC_OCTETS);
3239
16
      bfd_set_section_flags (abbrev_seg,
3240
16
            SEC_READONLY | SEC_DEBUGGING | SEC_OCTETS);
3241
16
      bfd_set_section_flags (aranges_seg,
3242
16
            SEC_READONLY | SEC_DEBUGGING | SEC_OCTETS);
3243
16
      bfd_set_section_flags (str_seg,
3244
16
            SEC_READONLY | SEC_DEBUGGING | SEC_OCTETS
3245
16
               | SEC_MERGE | SEC_STRINGS);
3246
16
      str_seg->entsize = 1;
3247
3248
16
      record_alignment (aranges_seg, ffs (2 * sizeof_address) - 1);
3249
3250
16
      if (all_segs->next == NULL)
3251
16
  ranges_sym = NULL;
3252
0
      else
3253
0
  {
3254
0
    if (DWARF2_VERSION < 5)
3255
0
      {
3256
0
        segT ranges_seg = subseg_new (".debug_ranges", 0);
3257
0
        bfd_set_section_flags (ranges_seg, (SEC_READONLY
3258
0
              | SEC_DEBUGGING
3259
0
              | SEC_OCTETS));
3260
0
        record_alignment (ranges_seg, ffs (2 * sizeof_address) - 1);
3261
0
        out_debug_ranges (ranges_seg, &ranges_sym);
3262
0
      }
3263
0
    else
3264
0
      {
3265
0
        segT rnglists_seg = subseg_new (".debug_rnglists", 0);
3266
0
        bfd_set_section_flags (rnglists_seg, (SEC_READONLY
3267
0
                | SEC_DEBUGGING
3268
0
                | SEC_OCTETS));
3269
0
        out_debug_rnglists (rnglists_seg, &ranges_sym);
3270
0
      }
3271
0
  }
3272
3273
16
      out_debug_aranges (aranges_seg, info_seg);
3274
16
      out_debug_abbrev (abbrev_seg, info_seg, line_seg, &func_form);
3275
16
      out_debug_str (str_seg, &name_sym, &comp_dir_sym, &producer_sym);
3276
16
      out_debug_info (info_seg, abbrev_seg, line_seg, str_seg,
3277
16
          ranges_sym, name_sym, comp_dir_sym, producer_sym,
3278
16
          func_form);
3279
16
    }
3280
16
  dwarf2_cleanup ();
3281
16
}
3282
3283
/* Perform any deferred checks pertaining to debug information.  */
3284
3285
void
3286
dwarf2dbg_final_check (void)
3287
0
{
3288
  /* Perform reset-view checks.  Don't evaluate view_assert_failed
3289
     recursively: it could be very deep.  It's a chain of adds, with
3290
     each chain element pointing to the next in X_add_symbol, and
3291
     holding the check value in X_op_symbol.  */
3292
0
  while (view_assert_failed)
3293
0
    {
3294
0
      expressionS *exp;
3295
0
      symbolS *sym;
3296
0
      offsetT failed;
3297
3298
0
      gas_assert (!symbol_resolved_p (view_assert_failed));
3299
3300
0
      exp = symbol_get_value_expression (view_assert_failed);
3301
0
      sym = view_assert_failed;
3302
3303
      /* If view_assert_failed looks like a compound check in the
3304
   chain, break it up.  */
3305
0
      if (exp->X_op == O_add && exp->X_add_number == 0 && exp->X_unsigned)
3306
0
  {
3307
0
    view_assert_failed = exp->X_add_symbol;
3308
0
    sym = exp->X_op_symbol;
3309
0
  }
3310
0
      else
3311
0
  view_assert_failed = NULL;
3312
3313
0
      failed = resolve_symbol_value (sym);
3314
0
      if (!symbol_resolved_p (sym) || failed)
3315
0
  {
3316
    as_bad (_("view number mismatch"));
3317
0
    break;
3318
0
  }
3319
0
    }
3320
0
}