Coverage Report

Created: 2026-04-04 08:16

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
11
# define INSERT_DIR_SEPARATOR(string, offset) string[offset] = '/'
58
#endif
59
60
#ifndef DWARF2_FORMAT
61
138
# 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
37
#define DWARF2_FILE_NAME(FILENAME, DIRNAME) FILENAME
70
#endif
71
72
#ifndef DWARF2_FILE_TIME_NAME
73
35
#define DWARF2_FILE_TIME_NAME(FILENAME,DIRNAME) -1
74
#endif
75
76
#ifndef DWARF2_FILE_SIZE_NAME
77
35
#define DWARF2_FILE_SIZE_NAME(FILENAME,DIRNAME) -1
78
#endif
79
80
#ifndef DWARF2_VERSION
81
8.93k
#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
34
#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
8.70k
#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
1
#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.32k
# 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
2.86k
#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.88k
# 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
4.60k
# 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.75k
# define DWARF2_LINE_MIN_INSN_LENGTH  1
139
#endif
140
141
/* Flag that indicates the initial value of the is_stmt_start flag.  */
142
637
#define DWARF2_LINE_DEFAULT_IS_STMT 1
143
144
#ifndef DWARF2_LINE_MAX_OPS_PER_INSN
145
35
#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.47k
#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.47k
#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
68
#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
9
{
179
  /* If the list is empty ptail points at head.  */
180
9
  if (head == NULL)
181
0
    return NULL;
182
  /* Otherwise ptail points to line_entry.next of the last entry.  */
183
9
  void *p = (char *) ptail - offsetof (struct line_entry, next);
184
9
  return p;
185
9
}
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
170
#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
297
#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
297
{
264
297
  expressionS exp;
265
266
297
  memset (&exp, 0, sizeof exp);
267
297
  exp.X_op = O_symbol;
268
297
  exp.X_add_symbol = symbol;
269
297
  exp.X_add_number = 0;
270
297
  emit_expr (&exp, size);
271
297
}
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.32k
{
279
1.32k
  struct line_seg *s = seg_info (seg)->dwarf2_line_seg;
280
1.32k
  struct line_subseg **pss, *lss;
281
282
1.32k
  if (s == NULL)
283
35
    {
284
35
      if (!create_p)
285
0
  return NULL;
286
287
35
      s = XNEW (struct line_seg);
288
35
      s->next = NULL;
289
35
      s->seg = seg;
290
35
      s->head = NULL;
291
35
      *last_seg_ptr = s;
292
35
      last_seg_ptr = &s->next;
293
35
      seg_info (seg)->dwarf2_line_seg = s;
294
35
    }
295
296
1.32k
  gas_assert (seg == s->seg);
297
298
1.34k
  for (pss = &s->head; (lss = *pss) != NULL ; pss = &lss->next)
299
1.30k
    {
300
1.30k
      if (lss->subseg == subseg)
301
1.28k
  goto found_subseg;
302
25
      if (lss->subseg > subseg)
303
9
  break;
304
25
    }
305
306
47
  lss = XNEW (struct line_subseg);
307
47
  lss->next = *pss;
308
47
  lss->subseg = subseg;
309
47
  lss->head = NULL;
310
47
  lss->ptail = &lss->head;
311
47
  lss->pmove_tail = &lss->head;
312
47
  *pss = lss;
313
314
1.32k
 found_subseg:
315
1.32k
  return lss;
316
47
}
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
2
{
323
2
  struct line_entry *p = NULL, *e, *n;
324
325
6
  for (e = h; e; e = n)
326
4
    {
327
4
      n = e->next;
328
4
      e->next = p;
329
4
      p = e;
330
4
    }
331
2
  return p;
332
2
}
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
16
{
343
16
  expressionS viewx;
344
345
16
  memset (&viewx, 0, sizeof (viewx));
346
16
  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
16
  if (!p || (e->loc.u.view == force_reset_view && force_reset_view))
352
7
    {
353
7
      viewx.X_op = O_constant;
354
7
      viewx.X_add_number = 0;
355
7
      viewx.X_add_symbol = NULL;
356
7
      viewx.X_op_symbol = NULL;
357
7
    }
358
9
  else
359
9
    {
360
9
      viewx.X_op = O_gt;
361
9
      viewx.X_add_number = 0;
362
9
      viewx.X_add_symbol = e->label;
363
9
      viewx.X_op_symbol = p->label;
364
9
      resolve_expression (&viewx);
365
9
      if (viewx.X_op == O_constant)
366
8
  viewx.X_add_number = !viewx.X_add_number;
367
1
      else
368
1
  {
369
1
    viewx.X_add_symbol = make_expr_symbol (&viewx);
370
1
    viewx.X_add_number = 0;
371
1
    viewx.X_op_symbol = NULL;
372
1
    viewx.X_op = O_logical_not;
373
1
  }
374
9
    }
375
376
16
  if (S_IS_DEFINED (e->loc.u.view) && symbol_constant_p (e->loc.u.view))
377
12
    {
378
12
      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
12
      if (viewx.X_op == O_constant)
383
12
  {
384
12
    if (!value->X_add_number != !viewx.X_add_number)
385
3
      as_bad (_("view number mismatch"));
386
12
  }
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
12
    }
408
409
16
  if (viewx.X_op != O_constant || viewx.X_add_number)
410
4
    {
411
4
      expressionS incv;
412
4
      expressionS *p_view;
413
414
4
      if (!p->loc.u.view)
415
1
  p->loc.u.view = symbol_temp_make ();
416
417
4
      memset (&incv, 0, sizeof (incv));
418
4
      incv.X_unsigned = 1;
419
4
      incv.X_op = O_symbol;
420
4
      incv.X_add_symbol = p->loc.u.view;
421
4
      incv.X_add_number = 1;
422
4
      p_view = symbol_get_value_expression (p->loc.u.view);
423
4
      if (p_view->X_op == O_constant || p_view->X_op == O_symbol)
424
4
  {
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
4
    incv.X_op = p_view->X_op;
430
4
    incv.X_add_symbol = p_view->X_add_symbol;
431
4
    incv.X_add_number = p_view->X_add_number + 1;
432
4
  }
433
434
4
      if (viewx.X_op == O_constant)
435
3
  {
436
3
    gas_assert (viewx.X_add_number == 1);
437
3
    viewx = incv;
438
3
  }
439
1
      else
440
1
  {
441
1
    viewx.X_add_symbol = make_expr_symbol (&viewx);
442
1
    viewx.X_add_number = 0;
443
1
    viewx.X_op_symbol = make_expr_symbol (&incv);
444
1
    viewx.X_op = O_multiply;
445
1
  }
446
4
    }
447
448
16
  if (!S_IS_DEFINED (e->loc.u.view))
449
4
    {
450
4
      symbol_set_value_expression (e->loc.u.view, &viewx);
451
4
      S_SET_SEGMENT (e->loc.u.view, expr_section);
452
4
      symbol_set_frag (e->loc.u.view, &zero_address_frag);
453
4
    }
454
455
  /* Define and attempt to simplify any earlier views needed to
456
     compute E's.  */
457
16
  if (h && p && p->loc.u.view && !S_IS_DEFINED (p->loc.u.view))
458
1
    {
459
1
      struct line_entry *h2;
460
      /* Reverse the list to avoid quadratic behavior going backwards
461
   in a single-linked list.  */
462
1
      struct line_entry *r = reverse_line_entry_list (h);
463
464
1
      gas_assert (r == p);
465
      /* Set or check views until we find a defined or absent view.  */
466
1
      do
467
1
  {
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
1
    if (r == h)
474
0
      break;
475
1
    set_or_check_view (r, r->next, NULL);
476
1
  }
477
1
      while (r->next
478
1
       && r->next->loc.u.view
479
1
       && !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
1
      h2 = reverse_line_entry_list (p);
484
1
      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
1
      do
489
1
  {
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
1
    if (r == h)
494
0
      continue;
495
1
    gas_assert (S_IS_DEFINED (r->loc.u.view));
496
1
    resolve_expression (symbol_get_value_expression (r->loc.u.view));
497
1
  }
498
1
      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
1
      resolve_expression (symbol_get_value_expression (e->loc.u.view));
503
1
    }
504
16
}
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.32k
{
511
1.32k
  struct line_subseg *lss;
512
1.32k
  struct line_entry *e;
513
1.32k
  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.32k
  if (IS_ELF)
519
1.32k
    need_flags |= SEC_ALLOC;
520
1.32k
  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.32k
  e = XNEW (struct line_entry);
530
1.32k
  e->next = NULL;
531
1.32k
  e->label = label;
532
1.32k
  e->loc = *loc;
533
534
1.32k
  lss = get_line_subseg (now_seg, now_subseg, true);
535
536
  /* Subseg heads are chained to previous subsegs in
537
     dwarf2_finish.  */
538
1.32k
  if (loc->filenum != -1u && loc->u.view && lss->head)
539
9
    set_or_check_view (e, line_entry_at_tail (lss->head, lss->ptail),
540
9
           lss->head);
541
542
1.32k
  *lss->ptail = e;
543
1.32k
  lss->ptail = &e->next;
544
1.32k
}
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.65k
{
555
1.65k
  symbolS *sym;
556
557
  /* Early out for as-yet incomplete location information.  */
558
1.65k
  if (loc->line == 0)
559
324
    return;
560
1.32k
  if (loc->filenum == 0)
561
1.32k
    {
562
1.32k
      if (dwarf_level < 5)
563
0
  dwarf_level = 5;
564
1.32k
      if (DWARF2_LINE_VERSION < 5)
565
0
  return;
566
1.32k
    }
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.32k
  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.32k
  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.32k
  else
600
1.32k
    sym = symbol_temp_new (now_seg, frag_now, ofs);
601
1.32k
  dwarf2_gen_line_info_1 (sym, loc);
602
1.32k
}
603
604
static const char *
605
get_basename (const char * pathname)
606
255
{
607
255
  const char * file;
608
609
255
  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
255
  if (file == pathname + 1)
616
6
    file = pathname;
617
255
#endif
618
255
  return file;
619
255
}
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
112
{
627
112
  unsigned int d;
628
629
112
  if (dirlen == 0)
630
54
    return 0;
631
632
58
#ifndef DWARF2_DIR_SHOULD_END_WITH_SEPARATOR
633
58
  if (IS_DIR_SEPARATOR (dirname[dirlen - 1]))
634
28
    {
635
28
      -- dirlen;
636
28
      if (dirlen == 0)
637
0
  return 0;
638
28
    }
639
58
#endif
640
641
112
  for (d = 0; d < dirs_in_use; ++d)
642
54
    {
643
54
      if (dirs[d] != NULL
644
46
    && filename_ncmp (dirname, dirs[d], dirlen) == 0
645
0
    && dirs[d][dirlen] == '\0')
646
0
  return d;
647
54
    }
648
649
58
  if (can_use_zero)
650
46
    {
651
46
      if (dirs == NULL || dirs[0] == NULL)
652
46
  {
653
46
    const char * pwd = file0_dirname ? file0_dirname : getpwd ();
654
655
46
    if (dwarf_level >= 5 && filename_cmp (dirname, pwd) != 0)
656
16
      {
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
16
        (void) get_directory_table_entry (pwd, pwd, strlen (pwd), true);
663
16
        d = dirs_in_use;
664
16
      }
665
30
    else
666
30
      d = 0;
667
46
  }
668
46
    }
669
12
  else if (d == 0)
670
3
    d = 1;
671
672
58
  if (d >= dirs_allocated)
673
32
    {
674
32
      unsigned int old = dirs_allocated;
675
32
#define DIR_TABLE_INCREMENT 32
676
32
      dirs_allocated = d + DIR_TABLE_INCREMENT;
677
32
      dirs = XRESIZEVEC (char *, dirs, dirs_allocated);
678
32
      memset (dirs + old, 0, (dirs_allocated - old) * sizeof (char *));
679
32
    }
680
681
58
  dirs[d] = xmemdup0 (dirname, dirlen);
682
58
  if (dirs_in_use <= d)
683
57
    dirs_in_use = d + 1;
684
685
58
  return d;  
686
58
}
687
688
static bool
689
assign_file_to_slot (valueT i, const char *file, unsigned int dir)
690
96
{
691
96
  if (i >= files_allocated)
692
93
    {
693
93
      unsigned int want = i + 32;
694
695
      /* If this array is taking 1G or more, someone is using silly
696
   file numbers.  */
697
93
      if (want < i || want > UINT_MAX / 4 / sizeof (struct file_entry))
698
14
  {
699
14
    as_bad (_("file number %" PRIu64 " is too big"), (uint64_t) i);
700
14
    return false;
701
14
  }
702
703
79
      files = XRESIZEVEC (struct file_entry, files, want);
704
79
      memset (files + files_allocated, 0,
705
79
        (want - files_allocated) * sizeof (struct file_entry));
706
79
      files_allocated = want;
707
79
    }
708
709
82
  files[i].filename = file;
710
82
  files[i].dir = dir;
711
82
  memset (files[i].md5, 0, NUM_MD5_BYTES);
712
713
82
  if (files_in_use < i + 1)
714
80
    files_in_use = i + 1;
715
716
82
  return true;
717
96
}
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
47
{
791
47
  do
792
1.32k
    {
793
1.32k
      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.32k
      e = e->next;
799
1.32k
    }
800
1.32k
  while (e);
801
47
}
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
567
{
810
567
  struct line_seg *s, *nexts;
811
812
602
  for (s = all_segs; s; s = nexts)
813
35
    {
814
35
      struct line_subseg *lss, *nextlss;
815
816
82
      for (lss = s->head; lss; lss = nextlss)
817
47
  {
818
47
    struct line_entry *e, *next;
819
820
1.37k
    for (e = lss->head; e; e = next)
821
1.32k
      {
822
1.32k
        if (!thelot)
823
1.32k
    know (e->loc.filenum == -1u);
824
1.32k
        next = e->next;
825
1.32k
        free (e);
826
1.32k
      }
827
828
47
    lss->head = NULL;
829
47
    lss->ptail = &lss->head;
830
47
    lss->pmove_tail = &lss->head;
831
47
    nextlss = lss->next;
832
47
    if (thelot)
833
47
      free (lss);
834
47
  }
835
35
      nexts = s->next;
836
35
      if (thelot)
837
35
  {
838
35
    seg_info (s->seg)->dwarf2_line_seg = NULL;
839
35
    free (s);
840
35
  }
841
35
    }
842
567
}
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
286
{
856
286
  const char *file;
857
286
  size_t dirlen;
858
286
  unsigned int i, d;
859
286
  const char *file0_dirname;
860
861
  /* Short circuit the common case of adding the same pathname
862
     as last time.  */
863
286
  if (num < files_allocated && files[num].filename != NULL)
864
190
    {
865
190
      const char * dir = NULL;
866
867
190
      if (dirs != NULL)
868
28
  dir = dirs[files[num].dir];
869
870
190
      if (with_md5
871
6
    && memcmp (generic_bignum, files[num].md5, NUM_MD5_BYTES) != 0)
872
0
  goto fail;
873
874
190
      if (dirname != NULL)
875
18
  {
876
18
    if (dir != NULL && filename_cmp (dir, dirname) != 0)
877
3
      goto fail;
878
      
879
15
    if (filename_cmp (filename, files[num].filename) != 0)
880
9
      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
15
  }
899
172
      else if (dir != NULL) 
900
13
  {
901
13
    dirlen = strlen (dir);
902
13
    if (filename_ncmp (filename, dir, dirlen) == 0
903
13
        && IS_DIR_SEPARATOR (filename [dirlen])
904
6
        && filename_cmp (filename + dirlen + 1, files[num].filename) == 0)
905
4
      return true;
906
13
  }
907
159
      else /* dir == NULL  */
908
159
  {
909
159
    file = get_basename (filename);
910
159
    if (filename_cmp (file, files[num].filename) == 0)
911
150
      {
912
        /* The filenames match, but the directory table entry is empty.
913
     Fill it with the provided directory name.  */
914
150
        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
150
        return true;
927
150
      }
928
159
  }
929
930
30
    fail:
931
30
      as_bad (_("file table slot %u is already occupied by a different file"
932
30
    " (%s%s%s vs %s%s%s)"),
933
30
        (unsigned int) num,
934
30
        dir == NULL ? "" : dir,
935
30
        dir == NULL ? "" : "/",
936
30
        files[num].filename,
937
30
        dirname == NULL ? "" : dirname,
938
30
        dirname == NULL ? "" : "/",
939
30
        filename);
940
30
      return false;
941
190
    }
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
96
  if (num == 0)
946
70
    {
947
70
      file0_dirname = dirname;
948
949
70
      file = get_basename (filename);
950
951
70
      if (dirname && file == filename)
952
14
  dirlen = strlen (dirname);
953
56
      else
954
56
  {
955
56
    dirname = filename;
956
56
    dirlen = file - filename;
957
56
  }
958
70
    }
959
26
  else
960
26
    {
961
26
      file0_dirname = NULL;
962
963
26
      if (dirname == NULL)
964
26
  {
965
26
    dirname = filename;
966
26
    file = get_basename (filename);
967
26
    dirlen = file - filename;
968
26
  }
969
0
      else
970
0
  {
971
0
    dirlen = strlen (dirname);
972
0
    file = filename;
973
0
  }
974
26
    }
975
976
96
  d = get_directory_table_entry (dirname, file0_dirname, dirlen, num == 0);
977
96
  i = num;
978
979
96
  if (!assign_file_to_slot (num, file, d))
980
14
    return false;
981
982
82
  if (with_md5)
983
2
    {
984
2
      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
2
      else
1007
2
  {
1008
2
    unsigned int     bits_remaining = NUM_MD5_BYTES * BITS_PER_CHAR;
1009
2
    unsigned int     byte = 0;
1010
2
    unsigned int     bignum_index = 0;
1011
1012
18
    while (bits_remaining)
1013
16
      {
1014
16
        unsigned int bignum_bits_remaining = LITTLENUM_NUMBER_OF_BITS;
1015
16
        valueT       bignum_value = generic_bignum [bignum_index];
1016
1017
16
        bignum_index ++;
1018
1019
48
        while (bignum_bits_remaining)
1020
32
    {
1021
32
      files[i].md5[byte++] = bignum_value & 0xff;
1022
32
      bignum_value >>= 8;
1023
32
      bignum_bits_remaining -= 8;
1024
32
      bits_remaining -= 8;
1025
32
    }
1026
16
      }
1027
2
  }
1028
2
    }
1029
80
  else
1030
80
    memset (files[i].md5, 0, NUM_MD5_BYTES);
1031
1032
82
  return true;
1033
96
}
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.65k
{
1043
1.65k
  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.65k
  else
1053
1.65k
    *line = current;
1054
1.65k
}
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
4.28k
{
1073
4.28k
  struct dwarf2_line_info loc;
1074
1075
4.28k
  seg_info (now_seg)->insn_seen = 1;
1076
1077
4.28k
  if (debug_type != DEBUG_DWARF2
1078
4.28k
      ? !dwarf2_loc_directive_seen
1079
4.28k
      : !seen_at_least_1_file ())
1080
2.63k
    return;
1081
1082
1.65k
  dwarf2_where (&loc);
1083
1084
1.65k
  dwarf2_gen_line_info ((frag_now_fix_octets () - size) / OCTETS_PER_BYTE, &loc);
1085
1.65k
  dwarf2_consume_line_info ();
1086
1.65k
}
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.65k
{
1123
  /* Unless we generate DWARF2 debugging information for each
1124
     assembler line, we only emit one line symbol for one LOC.  */
1125
1.65k
  dwarf2_loc_directive_seen = false;
1126
1127
1.65k
  current.flags &= ~(DWARF2_FLAG_BASIC_BLOCK
1128
1.65k
         | DWARF2_FLAG_PROLOGUE_END
1129
1.65k
         | DWARF2_FLAG_EPILOGUE_BEGIN);
1130
1.65k
  current.discriminator = 0;
1131
1.65k
  current.u.view = NULL;
1132
1.65k
}
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
8.89k
{
1140
8.89k
  struct dwarf2_line_info loc;
1141
1142
8.89k
  if (!dwarf2_loc_mark_labels)
1143
8.89k
    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
504
{
1168
504
  bool with_md5 = false;
1169
504
  valueT num;
1170
504
  char *filename;
1171
504
  const char * dirname = NULL;
1172
504
  int filename_len;
1173
1174
  /* Continue to accept a bare string and pass it off.  */
1175
504
  SKIP_WHITESPACE ();
1176
504
  if (*input_line_pointer == '"')
1177
150
    {
1178
150
      s_file (0);
1179
150
      return NULL;
1180
150
    }
1181
1182
354
  num = get_absolute_expression ();
1183
1184
354
  if ((offsetT) num < 1)
1185
291
    {
1186
291
      if (num == 0 && dwarf_level < 5)
1187
1
  dwarf_level = 5;
1188
291
      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
291
    }
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
354
  filename = demand_copy_C_string (&filename_len);
1201
354
  if (filename == NULL)
1202
    /* demand_copy_C_string will have already generated an error message.  */
1203
68
    return NULL;
1204
1205
  /* For DWARF-5 support we also accept:
1206
     .file <NUM> ["<dir>"] "<file>" [md5 <NUM>]  */
1207
286
  if (DWARF2_LINE_VERSION > 4)
1208
286
    {
1209
286
      SKIP_WHITESPACE ();
1210
286
      if (*input_line_pointer == '"')
1211
32
  {
1212
32
    dirname = filename;
1213
32
    filename = demand_copy_C_string (&filename_len);
1214
32
    if (filename == NULL)
1215
0
      return NULL;
1216
32
    SKIP_WHITESPACE ();
1217
32
  }
1218
1219
286
      if (startswith (input_line_pointer, "md5"))
1220
9
  {
1221
9
    input_line_pointer += 3;
1222
9
    SKIP_WHITESPACE ();
1223
1224
9
    expressionS exp;
1225
9
    expression_and_evaluate (& exp);
1226
9
    if (exp.X_op != O_big)
1227
1
      as_bad (_("md5 value too small or not a constant"));
1228
8
    else
1229
8
      with_md5 = true;
1230
9
  }
1231
286
    }
1232
1233
286
  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
286
  if (debug_type == DEBUG_DWARF2)
1238
0
    purge_generated_debug (false);
1239
286
  debug_type = DEBUG_NONE;
1240
1241
286
  if (!allocate_filename_to_slot (dirname, filename, num, with_md5))
1242
44
    return NULL;
1243
1244
242
  return filename;
1245
286
}
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
504
{
1253
504
  (void) dwarf2_directive_filename ();
1254
504
}
1255
1256
void
1257
dwarf2_directive_loc (int dummy ATTRIBUTE_UNUSED)
1258
3.93k
{
1259
3.93k
  offsetT filenum, line;
1260
1261
  /* If we see two .loc directives in a row, force the first one to be
1262
     output now.  */
1263
3.93k
  if (dwarf2_loc_directive_seen)
1264
1.48k
    dwarf2_emit_insn (0);
1265
1266
3.93k
  filenum = get_absolute_expression ();
1267
3.93k
  SKIP_WHITESPACE ();
1268
3.93k
  line = get_absolute_expression ();
1269
1270
3.93k
  if (filenum < 1)
1271
3.37k
    {
1272
3.37k
      if (filenum == 0 && dwarf_level < 5)
1273
0
  dwarf_level = 5;
1274
3.37k
      if (filenum < 0 || DWARF2_LINE_VERSION < 5)
1275
2
  {
1276
2
    as_bad (_("file number less than one"));
1277
2
    return;
1278
2
  }
1279
3.37k
    }
1280
1281
3.93k
  if ((valueT) filenum >= files_in_use || files[filenum].filename == NULL)
1282
2.20k
    {
1283
2.20k
      as_bad (_("unassigned file number %ld"), (long) filenum);
1284
2.20k
      return;
1285
2.20k
    }
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.73k
  gas_assert (debug_type == DEBUG_NONE);
1291
1292
1.73k
  current.filenum = filenum;
1293
1.73k
  current.line = line;
1294
1.73k
  current.discriminator = 0;
1295
1296
1.73k
#ifndef NO_LISTING
1297
1.73k
  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.73k
#endif
1317
1318
1.73k
  SKIP_WHITESPACE ();
1319
1.73k
  if (ISDIGIT (*input_line_pointer))
1320
188
    {
1321
188
      current.column = get_absolute_expression ();
1322
188
      SKIP_WHITESPACE ();
1323
188
    }
1324
1325
1.73k
  while (ISALPHA (*input_line_pointer))
1326
177
    {
1327
177
      char *p, c;
1328
177
      offsetT value;
1329
1330
177
      c = get_symbol_name (& p);
1331
1332
177
      if (strcmp (p, "basic_block") == 0)
1333
4
  {
1334
4
    current.flags |= DWARF2_FLAG_BASIC_BLOCK;
1335
4
    restore_line_pointer (c);
1336
4
  }
1337
173
      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
173
      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
173
      else if (strcmp (p, "is_stmt") == 0)
1352
5
  {
1353
5
    (void) restore_line_pointer (c);
1354
5
    value = get_absolute_expression ();
1355
5
    if (value == 0)
1356
5
      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
5
  }
1365
168
      else if (strcmp (p, "isa") == 0)
1366
76
  {
1367
76
    if (dwarf_level < 3)
1368
0
      dwarf_level = 3;
1369
76
    (void) restore_line_pointer (c);
1370
76
    value = get_absolute_expression ();
1371
76
    if (value >= 0)
1372
76
      current.isa = value;
1373
0
    else
1374
0
      {
1375
0
        as_bad (_("isa number less than zero"));
1376
0
        return;
1377
0
      }
1378
76
  }
1379
92
      else if (strcmp (p, "discriminator") == 0)
1380
21
  {
1381
21
    (void) restore_line_pointer (c);
1382
21
    value = get_absolute_expression ();
1383
21
    if (value >= 0)
1384
19
      current.discriminator = value;
1385
2
    else
1386
2
      {
1387
2
        as_bad (_("discriminator less than zero"));
1388
2
        return;
1389
2
      }
1390
21
  }
1391
71
      else if (strcmp (p, "view") == 0)
1392
18
  {
1393
18
    symbolS *sym;
1394
1395
18
    (void) restore_line_pointer (c);
1396
18
    SKIP_WHITESPACE ();
1397
1398
18
    if (ISDIGIT (*input_line_pointer)
1399
7
        || *input_line_pointer == '-')
1400
12
      {
1401
12
        bool force_reset = *input_line_pointer == '-';
1402
1403
12
        value = get_absolute_expression ();
1404
12
        if (value != 0)
1405
0
    {
1406
0
      as_bad (_("numeric view can only be asserted to zero"));
1407
0
      return;
1408
0
    }
1409
12
        if (force_reset && force_reset_view)
1410
0
    sym = force_reset_view;
1411
12
        else
1412
12
    {
1413
12
      sym = symbol_temp_new (absolute_section, &zero_address_frag,
1414
12
           value);
1415
12
      if (force_reset)
1416
1
        force_reset_view = sym;
1417
12
    }
1418
12
      }
1419
6
    else
1420
6
      {
1421
6
        char *name = read_symbol_name ();
1422
1423
6
        if (!name)
1424
1
    return;
1425
5
        sym = symbol_find_or_make (name);
1426
5
        free (name);
1427
5
        if (S_IS_DEFINED (sym) || symbol_equated_p (sym))
1428
1
    {
1429
1
      if (S_IS_VOLATILE (sym))
1430
0
        sym = symbol_clone (sym, 1);
1431
1
      else if (!S_CAN_BE_REDEFINED (sym))
1432
1
        {
1433
1
          as_bad (_("symbol `%s' is already defined"),
1434
1
            S_GET_NAME (sym));
1435
1
          return;
1436
1
        }
1437
1
    }
1438
4
        S_SET_SEGMENT (sym, undefined_section);
1439
4
        S_SET_VALUE (sym, 0);
1440
4
        symbol_set_frag (sym, &zero_address_frag);
1441
4
      }
1442
16
    current.u.view = sym;
1443
16
  }
1444
53
      else
1445
53
  {
1446
53
    as_bad (_("unknown .loc sub-directive `%s'"), p);
1447
53
    (void) restore_line_pointer (c);
1448
53
    return;
1449
53
  }
1450
1451
120
      SKIP_WHITESPACE ();
1452
120
    }
1453
1454
1.67k
  demand_empty_rest_of_line ();
1455
1.67k
  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.67k
  if (current.u.view)
1459
16
    dwarf2_emit_insn (0);
1460
1.67k
}
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
37
{
1482
37
  return seg_info (seg)->frchainP->frch_root;
1483
37
}
1484
1485
static struct frag *
1486
last_frag_for_seg (segT seg)
1487
72
{
1488
72
  frchainS *f = seg_info (seg)->frchainP;
1489
1490
122
  while (f->frch_next != NULL)
1491
50
    f = f->frch_next;
1492
1493
72
  return f->frch_last;
1494
72
}
1495

1496
/* Emit a single byte into the current segment.  */
1497
1498
static inline void
1499
out_byte (int byte)
1500
1.23k
{
1501
1.23k
  FRAG_APPEND_1_CHAR (byte);
1502
1.23k
}
1503
1504
/* Emit a statement program opcode into the current segment.  */
1505
1506
static inline void
1507
out_opcode (int opc)
1508
118
{
1509
118
  out_byte (opc);
1510
118
}
1511
1512
/* Emit a two-byte word into the current segment.  */
1513
1514
static inline void
1515
out_two (int data)
1516
138
{
1517
138
  md_number_to_chars (frag_more (2), data, 2);
1518
138
}
1519
1520
/* Emit a four byte word into the current segment.  */
1521
1522
static inline void
1523
out_four (int data)
1524
1
{
1525
1
  md_number_to_chars (frag_more (4), data, 4);
1526
1
}
1527
1528
/* Emit an unsigned "little-endian base 128" number.  */
1529
1530
static void
1531
out_uleb128 (addressT value)
1532
1.04k
{
1533
1.04k
  output_leb128 (frag_more (sizeof_leb128 (value, 0)), value, 0);
1534
1.04k
}
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
271
{
1549
271
  out_uleb128 (name);
1550
271
  out_uleb128 (form);
1551
271
}
1552
1553
/* Get the size of a fragment.  */
1554
1555
static offsetT
1556
get_frag_fix (fragS *frag, segT seg)
1557
73
{
1558
73
  frchainS *fr;
1559
1560
73
  if (frag->fr_next)
1561
1
    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
122
  for (fr = seg_info (seg)->frchainP; fr; fr = fr->frch_next)
1567
122
    if (fr->frch_last == frag)
1568
72
      return (char *) obstack_next_free (&fr->frch_obstack) - frag->fr_literal;
1569
1570
72
  abort ();
1571
72
}
1572
1573
/* Set an absolute address (may result in a relocation entry).  */
1574
1575
static void
1576
out_set_addr (symbolS *sym)
1577
35
{
1578
35
  expressionS exp;
1579
1580
35
  memset (&exp, 0, sizeof exp);
1581
35
  out_opcode (DW_LNS_extended_op);
1582
35
  out_uleb128 (sizeof_address + 1);
1583
1584
35
  out_opcode (DW_LNE_set_address);
1585
35
  exp.X_op = O_symbol;
1586
35
  exp.X_add_symbol = sym;
1587
35
  exp.X_add_number = 0;
1588
35
  emit_expr (&exp, sizeof_address);
1589
35
}
1590
1591
static void
1592
scale_addr_delta (int line_delta, addressT *addr_delta)
1593
2.24k
{
1594
2.24k
  static int printed_this = 0;
1595
2.24k
  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.24k
}
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.36k
{
1618
1.36k
  unsigned int tmp, opcode;
1619
1.36k
  int len = 0;
1620
1621
  /* Scale the address delta by the minimum instruction length.  */
1622
1.36k
  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.36k
  if (line_delta == INT_MAX)
1628
39
    {
1629
39
      if (addr_delta == MAX_SPECIAL_ADDR_DELTA)
1630
0
  len = 1;
1631
39
      else if (addr_delta)
1632
14
  len = 1 + sizeof_leb128 (addr_delta, 0);
1633
39
      return len + 3;
1634
39
    }
1635
1636
  /* Bias the line delta by the base.  */
1637
1.32k
  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.32k
  if (tmp >= DWARF2_LINE_RANGE)
1642
998
    {
1643
998
      len = 1 + sizeof_leb128 (line_delta, 1);
1644
998
      line_delta = 0;
1645
998
      tmp = 0 - DWARF2_LINE_BASE;
1646
998
    }
1647
1648
  /* Bias the opcode by the special opcode base.  */
1649
1.32k
  tmp += DWARF2_LINE_OPCODE_BASE;
1650
1651
  /* Avoid overflow when addr_delta is large.  */
1652
1.32k
  if (addr_delta < 256U + MAX_SPECIAL_ADDR_DELTA)
1653
852
    {
1654
      /* Try using a special opcode.  */
1655
852
      opcode = tmp + addr_delta * DWARF2_LINE_RANGE;
1656
852
      if (opcode <= 255)
1657
830
  return len + 1;
1658
1659
      /* Try using DW_LNS_const_add_pc followed by special op.  */
1660
22
      opcode = tmp + (addr_delta - MAX_SPECIAL_ADDR_DELTA) * DWARF2_LINE_RANGE;
1661
22
      if (opcode <= 255)
1662
1
  return len + 2;
1663
22
    }
1664
1665
  /* Otherwise use DW_LNS_advance_pc.  */
1666
492
  len += 1 + sizeof_leb128 (addr_delta, 0);
1667
1668
  /* DW_LNS_copy or special opcode.  */
1669
492
  len += 1;
1670
1671
492
  return len;
1672
1.32k
}
1673
1674
static void
1675
emit_inc_line_addr (int line_delta, addressT addr_delta, char *p, int len)
1676
885
{
1677
885
  unsigned int tmp, opcode;
1678
885
  int need_copy = 0;
1679
885
  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
885
  gas_assert ((offsetT) addr_delta >= 0);
1684
1685
  /* Scale the address delta by the minimum instruction length.  */
1686
885
  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
885
  if (line_delta == INT_MAX)
1692
33
    {
1693
33
      if (addr_delta == MAX_SPECIAL_ADDR_DELTA)
1694
0
  *p++ = DW_LNS_const_add_pc;
1695
33
      else if (addr_delta)
1696
8
  {
1697
8
    *p++ = DW_LNS_advance_pc;
1698
8
    p += output_leb128 (p, addr_delta, 0);
1699
8
  }
1700
1701
33
      *p++ = DW_LNS_extended_op;
1702
33
      *p++ = 1;
1703
33
      *p++ = DW_LNE_end_sequence;
1704
33
      goto done;
1705
33
    }
1706
1707
  /* Bias the line delta by the base.  */
1708
852
  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
852
  if (tmp >= DWARF2_LINE_RANGE)
1713
675
    {
1714
675
      *p++ = DW_LNS_advance_line;
1715
675
      p += output_leb128 (p, line_delta, 1);
1716
1717
675
      line_delta = 0;
1718
675
      tmp = 0 - DWARF2_LINE_BASE;
1719
675
      need_copy = 1;
1720
675
    }
1721
1722
  /* Prettier, I think, to use DW_LNS_copy instead of a "line +0, addr +0"
1723
     special opcode.  */
1724
852
  if (line_delta == 0 && addr_delta == 0)
1725
820
    {
1726
820
      *p++ = DW_LNS_copy;
1727
820
      goto done;
1728
820
    }
1729
1730
  /* Bias the opcode by the special opcode base.  */
1731
32
  tmp += DWARF2_LINE_OPCODE_BASE;
1732
1733
  /* Avoid overflow when addr_delta is large.  */
1734
32
  if (addr_delta < 256U + MAX_SPECIAL_ADDR_DELTA)
1735
32
    {
1736
      /* Try using a special opcode.  */
1737
32
      opcode = tmp + addr_delta * DWARF2_LINE_RANGE;
1738
32
      if (opcode <= 255)
1739
10
  {
1740
10
    *p++ = opcode;
1741
10
    goto done;
1742
10
  }
1743
1744
      /* Try using DW_LNS_const_add_pc followed by special op.  */
1745
22
      opcode = tmp + (addr_delta - MAX_SPECIAL_ADDR_DELTA) * DWARF2_LINE_RANGE;
1746
22
      if (opcode <= 255)
1747
1
  {
1748
1
    *p++ = DW_LNS_const_add_pc;
1749
1
    *p++ = opcode;
1750
1
    goto done;
1751
1
  }
1752
22
    }
1753
1754
  /* Otherwise use DW_LNS_advance_pc.  */
1755
21
  *p++ = DW_LNS_advance_pc;
1756
21
  p += output_leb128 (p, addr_delta, 0);
1757
1758
21
  if (need_copy)
1759
0
    *p++ = DW_LNS_copy;
1760
21
  else
1761
21
    *p++ = tmp;
1762
1763
885
 done:
1764
885
  gas_assert (p == end);
1765
885
}
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
885
{
1772
885
  int len = size_inc_line_addr (line_delta, addr_delta);
1773
885
  emit_inc_line_addr (line_delta, addr_delta, frag_more (len), len);
1774
885
}
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
477
{
1884
477
  expressionS exp;
1885
477
  int max_chars;
1886
1887
477
  memset (&exp, 0, sizeof exp);
1888
477
  exp.X_op = O_subtract;
1889
477
  exp.X_add_symbol = to_sym;
1890
477
  exp.X_op_symbol = from_sym;
1891
477
  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
477
  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
477
  else
1899
477
    max_chars = size_inc_line_addr (line_delta, -DWARF2_LINE_MIN_INSN_LENGTH);
1900
1901
477
  frag_var (rs_dwarf2dbg, max_chars, max_chars, 1,
1902
477
      make_expr_symbol (&exp), line_delta, NULL);
1903
477
}
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
35
{
1994
35
  unsigned filenum = 1;
1995
35
  unsigned line = 1;
1996
35
  unsigned column = 0;
1997
35
  unsigned isa = 0;
1998
35
  unsigned flags = DWARF2_LINE_DEFAULT_IS_STMT ? DWARF2_FLAG_IS_STMT : 0;
1999
35
  fragS *last_frag = NULL, *frag;
2000
35
  addressT last_frag_ofs = 0, frag_ofs;
2001
35
  symbolS *last_lab = NULL, *lab;
2002
2003
35
  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
35
  do
2034
1.32k
    {
2035
1.32k
      int line_delta;
2036
2037
1.32k
      if (filenum != e->loc.filenum)
2038
35
  {
2039
35
    filenum = e->loc.filenum;
2040
35
    out_opcode (DW_LNS_set_file);
2041
35
    out_uleb128 (filenum);
2042
35
  }
2043
2044
1.32k
      if (column != e->loc.column)
2045
11
  {
2046
11
    column = e->loc.column;
2047
11
    out_opcode (DW_LNS_set_column);
2048
11
    out_uleb128 (column);
2049
11
  }
2050
2051
1.32k
      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.32k
      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.32k
      if ((e->loc.flags ^ flags) & DWARF2_FLAG_IS_STMT)
2067
2
  {
2068
2
    flags = e->loc.flags;
2069
2
    out_opcode (DW_LNS_negate_stmt);
2070
2
  }
2071
2072
1.32k
      if (e->loc.flags & DWARF2_FLAG_BASIC_BLOCK)
2073
0
  out_opcode (DW_LNS_set_basic_block);
2074
2075
1.32k
      if (e->loc.flags & DWARF2_FLAG_PROLOGUE_END)
2076
0
  out_opcode (DW_LNS_set_prologue_end);
2077
2078
1.32k
      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.32k
      line_delta = e->loc.line - line;
2086
1.32k
      lab = e->label;
2087
1.32k
      frag = symbol_get_frag (lab);
2088
1.32k
      frag_ofs = S_GET_VALUE (lab);
2089
2090
1.32k
      if (last_frag == NULL
2091
1.29k
    || (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
1
        && (frag == last_frag
2099
1
      ? (last_frag_ofs == frag_ofs)
2100
1
      : (frag_ofs == 0
2101
1
         && ((offsetT)last_frag_ofs
2102
1
       >= get_frag_fix (last_frag, seg))))))
2103
35
  {
2104
35
    out_set_addr (lab);
2105
35
    out_inc_line_addr (line_delta, 0);
2106
35
  }
2107
1.29k
      else if (frag == last_frag && ! DWARF2_USE_FIXED_ADVANCE_PC)
2108
821
  out_inc_line_addr (line_delta, frag_ofs - last_frag_ofs);
2109
471
      else
2110
471
  relax_inc_line_addr (line_delta, lab, last_lab);
2111
2112
1.32k
      line = e->loc.line;
2113
1.32k
      last_lab = lab;
2114
1.32k
      last_frag = frag;
2115
1.32k
      last_frag_ofs = frag_ofs;
2116
2117
1.32k
      e = e->next;
2118
1.32k
    }
2119
1.32k
  while (e);
2120
2121
  /* Emit a DW_LNE_end_sequence for the end of the section.  */
2122
35
  frag = last_frag_for_seg (seg);
2123
35
  frag_ofs = get_frag_fix (frag, seg);
2124
35
  if (frag == last_frag && ! DWARF2_USE_FIXED_ADVANCE_PC)
2125
29
    out_inc_line_addr (INT_MAX, frag_ofs - last_frag_ofs);
2126
6
  else
2127
6
    {
2128
6
      lab = symbol_temp_new (seg, frag, frag_ofs);
2129
6
      relax_inc_line_addr (INT_MAX, lab, last_lab);
2130
6
    }
2131
35
}
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
92
{
2139
92
  char *cp;
2140
92
  size_t size;
2141
92
  symbolS *sym;
2142
2143
92
  subseg_set (line_str_seg, 0);
2144
2145
92
  sym = symbol_temp_new_now_octets ();
2146
2147
92
  size = strlen (str) + 1;
2148
92
  cp = frag_more (size);
2149
92
  memcpy (cp, str, size);
2150
2151
92
  return sym;
2152
92
}
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
35
{
2160
35
  size_t size;
2161
35
  char *dir;
2162
35
  char *cp;
2163
35
  unsigned int i, j;
2164
35
  bool emit_md5 = false;
2165
35
  bool emit_timestamps = true;
2166
35
  bool emit_filesize = true;
2167
35
  segT line_str_seg = NULL;
2168
35
  symbolS *line_strp, *file0_strp = NULL;
2169
2170
  /* Output the Directory Table.  */
2171
35
  if (DWARF2_LINE_VERSION >= 5)
2172
35
    {
2173
      /* We only have one column in the directory table.  */
2174
35
      out_byte (1);
2175
2176
      /* Describe the purpose and format of the column.  */
2177
35
      out_uleb128 (DW_LNCT_path);
2178
      /* Store these strings in the .debug_line_str section so they
2179
   can be shared.  */
2180
35
      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
35
      if (dirs_in_use == 0 && files_in_use > 0)
2186
19
  out_uleb128 (1);
2187
16
      else
2188
16
  out_uleb128 (dirs_in_use);
2189
35
    }
2190
      
2191
  /* Emit directory list.  */
2192
35
  if (DWARF2_LINE_VERSION >= 5 && (dirs_in_use > 0 || files_in_use > 0))
2193
34
    {
2194
34
      line_str_seg = subseg_new (".debug_line_str", 0);
2195
34
      bfd_set_section_flags (line_str_seg,
2196
34
           SEC_READONLY | SEC_DEBUGGING | SEC_OCTETS
2197
34
           | SEC_MERGE | SEC_STRINGS);
2198
34
      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
34
      if (dirs_in_use > 0 && dirs[0] != NULL)
2204
14
  dir = remap_debug_filename (dirs[0]);
2205
20
      else
2206
20
  dir = remap_debug_filename (getpwd ());
2207
2208
34
      line_strp = add_line_strp (line_str_seg, dir);
2209
34
      free (dir);
2210
34
      subseg_set (line_seg, 0);
2211
34
      TC_DWARF2_EMIT_OFFSET (line_strp, sizeof_offset);
2212
34
    }
2213
56
  for (i = 1; i < dirs_in_use; ++i)
2214
21
    {
2215
21
      dir = remap_debug_filename (dirs[i]);
2216
21
      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
21
      else
2223
21
  {
2224
21
    line_strp = add_line_strp (line_str_seg, dir);
2225
21
    subseg_set (line_seg, 0);
2226
21
    TC_DWARF2_EMIT_OFFSET (line_strp, sizeof_offset);
2227
21
  }
2228
21
      free (dir);
2229
21
    }
2230
2231
35
  if (DWARF2_LINE_VERSION < 5)
2232
    /* Terminate it.  */
2233
0
    out_byte ('\0');
2234
2235
  /* Output the File Name Table.  */
2236
35
  if (DWARF2_LINE_VERSION >= 5)
2237
35
    {
2238
35
      unsigned int columns = 4;
2239
2240
35
      if (((unsigned long) DWARF2_FILE_TIME_NAME ("", "")) == -1UL)
2241
35
  {
2242
35
    emit_timestamps = false;
2243
35
    -- columns;
2244
35
  }
2245
2246
35
      if (DWARF2_FILE_SIZE_NAME ("", "") == -1)
2247
35
  {
2248
35
    emit_filesize = false;
2249
35
    -- columns;
2250
35
  }
2251
2252
196
      for (i = 0; i < files_in_use; ++i)
2253
161
  if (files[i].md5[0] != 0)
2254
0
    break;
2255
35
      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
35
      out_byte (columns);
2263
      /* The format of the file name.  */
2264
35
      out_uleb128 (DW_LNCT_path);
2265
      /* Store these strings in the .debug_line_str section so they
2266
   can be shared.  */
2267
35
      out_uleb128 (DW_FORM_line_strp);
2268
2269
      /* The format of the directory index.  */
2270
35
      out_uleb128 (DW_LNCT_directory_index);
2271
35
      out_uleb128 (DW_FORM_udata);
2272
2273
35
      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
35
      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
35
      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
35
      out_uleb128 (files_in_use);
2296
35
   }
2297
      
2298
196
  for (i = DWARF2_LINE_VERSION > 4 ? 0 : 1; i < files_in_use; ++i)
2299
161
    {
2300
161
      const char *fullfilename;
2301
2302
161
      if (files[i].filename == NULL)
2303
124
  {
2304
124
    if (DWARF2_LINE_VERSION < 5 || i != 0)
2305
124
      {
2306
124
        as_bad (_("unassigned file number %ld"), (long) i);
2307
124
        continue;
2308
124
      }
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
37
      fullfilename = DWARF2_FILE_NAME (files[i].filename,
2325
37
               files[i].dir ? dirs [files [i].dir] : "");
2326
37
      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
37
      else
2333
37
  {
2334
37
    if (!file0_strp)
2335
37
      line_strp = add_line_strp (line_str_seg, fullfilename);
2336
0
    else
2337
0
      line_strp = file0_strp;
2338
37
    subseg_set (line_seg, 0);
2339
37
    TC_DWARF2_EMIT_OFFSET (line_strp, sizeof_offset);
2340
37
    if (i == 0 && files_in_use > 1
2341
2
        && files[0].filename == files[1].filename)
2342
0
      file0_strp = line_strp;
2343
37
    else
2344
37
      file0_strp = NULL;
2345
37
  }
2346
2347
      /* Directory number.  */
2348
37
      out_uleb128 (files[i].dir);
2349
2350
      /* Output the last modification timestamp.  */
2351
37
      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
37
      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
37
      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
37
    }
2382
2383
35
  if (DWARF2_LINE_VERSION < 5)
2384
    /* Terminate filename list.  */
2385
0
    out_byte (0);
2386
35
}
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
104
{
2396
104
  symbolS *start_sym;
2397
104
  symbolS *end_sym;
2398
2399
104
  subseg_set (sec, 0);
2400
2401
104
  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
104
  else
2411
104
    {
2412
104
      start_sym = symbol_temp_new_now_octets ();
2413
104
      end_sym = symbol_temp_make ();
2414
104
    }
2415
2416
  /* Total length of the information.  */
2417
104
  exp->X_op = O_subtract;
2418
104
  exp->X_add_symbol = end_sym;
2419
104
  exp->X_op_symbol = start_sym;
2420
2421
104
  switch (DWARF2_FORMAT (sec))
2422
104
    {
2423
104
    case dwarf2_format_32bit:
2424
104
      exp->X_add_number = -4;
2425
104
      emit_expr (exp, 4);
2426
104
      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
104
    }
2439
2440
0
  as_fatal (_("internal error: unknown dwarf2 format"));
2441
0
  return 0;
2442
104
}
2443
2444
/* Emit the collected .debug_line data.  */
2445
2446
static void
2447
out_debug_line (segT line_seg)
2448
35
{
2449
35
  expressionS exp;
2450
35
  symbolS *prologue_start, *prologue_end;
2451
35
  symbolS *line_end;
2452
35
  struct line_seg *s;
2453
35
  int sizeof_offset;
2454
2455
35
  memset (&exp, 0, sizeof exp);
2456
35
  sizeof_offset = out_header (line_seg, &exp);
2457
35
  line_end = exp.X_add_symbol;
2458
2459
  /* Version.  */
2460
35
  out_two (DWARF2_LINE_VERSION);
2461
2462
35
  if (DWARF2_LINE_VERSION >= 5)
2463
35
    {
2464
35
      out_byte (sizeof_address);
2465
35
      out_byte (0); /* Segment Selector size.  */
2466
35
    }
2467
  /* Length of the prologue following this length.  */
2468
35
  prologue_start = symbol_temp_make ();
2469
35
  prologue_end = symbol_temp_make ();
2470
35
  exp.X_op = O_subtract;
2471
35
  exp.X_add_symbol = prologue_end;
2472
35
  exp.X_op_symbol = prologue_start;
2473
35
  exp.X_add_number = 0;
2474
35
  emit_expr (&exp, sizeof_offset);
2475
35
  symbol_set_value_now (prologue_start);
2476
2477
  /* Parameters of the state machine.  */
2478
35
  out_byte (DWARF2_LINE_MIN_INSN_LENGTH);
2479
35
  if (DWARF2_LINE_VERSION >= 4)
2480
35
    out_byte (DWARF2_LINE_MAX_OPS_PER_INSN);
2481
35
  out_byte (DWARF2_LINE_DEFAULT_IS_STMT);
2482
35
  out_byte (DWARF2_LINE_BASE);
2483
35
  out_byte (DWARF2_LINE_RANGE);
2484
35
  out_byte (DWARF2_LINE_OPCODE_BASE);
2485
2486
  /* Standard opcode lengths.  */
2487
35
  out_byte (0);     /* DW_LNS_copy */
2488
35
  out_byte (1);     /* DW_LNS_advance_pc */
2489
35
  out_byte (1);     /* DW_LNS_advance_line */
2490
35
  out_byte (1);     /* DW_LNS_set_file */
2491
35
  out_byte (1);     /* DW_LNS_set_column */
2492
35
  out_byte (0);     /* DW_LNS_negate_stmt */
2493
35
  out_byte (0);     /* DW_LNS_set_basic_block */
2494
35
  out_byte (0);     /* DW_LNS_const_add_pc */
2495
35
  out_byte (1);     /* DW_LNS_fixed_advance_pc */
2496
35
  if (DWARF2_LINE_VERSION >= 3)
2497
35
    {
2498
35
      out_byte (0);     /* DW_LNS_set_prologue_end */
2499
35
      out_byte (0);     /* DW_LNS_set_epilogue_begin */
2500
35
      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
35
      gas_assert (DWARF2_LINE_OPCODE_BASE == 13);
2504
35
    }
2505
0
  else
2506
0
    gas_assert (DWARF2_LINE_OPCODE_BASE == 10);
2507
2508
35
  out_dir_and_file_list (line_seg, sizeof_offset);
2509
2510
35
  symbol_set_value_now (prologue_end);
2511
2512
  /* For each section, emit a statement program.  */
2513
70
  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
35
    if (s->head->head && SEG_NORMAL (s->seg))
2517
35
      process_entries (s->seg, s->head->head);
2518
2519
35
  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
35
  symbol_set_value_now (line_end);
2530
35
}
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
1
{
2588
1
  expressionS exp;
2589
1
  symbolS *ranges_end;
2590
1
  struct line_seg *s;
2591
2592
  /* Unit length.  */
2593
1
  memset (&exp, 0, sizeof exp);
2594
1
  out_header (ranges_seg, &exp);
2595
1
  ranges_end = exp.X_add_symbol;
2596
2597
1
  out_two (DWARF2_RNGLISTS_VERSION);
2598
1
  out_byte (sizeof_address);
2599
1
  out_byte (0); /* Segment Selector size.  */
2600
1
  out_four (0); /* Offset entry count.  */
2601
2602
  /* For DW_AT_ranges to point at (must be after the header).   */
2603
1
  *ranges_sym = symbol_temp_new_now_octets ();
2604
2605
3
  for (s = all_segs; s; s = s->next)
2606
2
    {
2607
2
      fragS *frag;
2608
2
      symbolS *beg, *end;
2609
2610
2
      out_byte (DW_RLE_start_length);
2611
2612
2
      frag = first_frag_for_seg (s->seg);
2613
2
      beg = symbol_temp_new (s->seg, frag, 0);
2614
2
      s->text_start = beg;
2615
2616
2
      frag = last_frag_for_seg (s->seg);
2617
2
      end = symbol_temp_new (s->seg, frag, get_frag_fix (frag, s->seg));
2618
2
      s->text_end = end;
2619
2620
2
      exp.X_op = O_symbol;
2621
2
      exp.X_add_symbol = beg;
2622
2
      exp.X_add_number = 0;
2623
2
      emit_expr (&exp, sizeof_address);
2624
2625
2
      exp.X_op = O_symbol;
2626
2
      exp.X_add_symbol = end;
2627
2
      exp.X_add_number = 0;
2628
2
      emit_leb128_expr (&exp, 0);
2629
2
    }
2630
2631
1
  out_byte (DW_RLE_end_of_list);
2632
2633
1
  symbol_set_value_now (ranges_end);
2634
1
}
2635
2636
/* Emit data for .debug_aranges.  */
2637
2638
static void
2639
out_debug_aranges (segT aranges_seg, segT info_seg)
2640
34
{
2641
34
  unsigned int addr_size = sizeof_address;
2642
34
  offsetT size;
2643
34
  struct line_seg *s;
2644
34
  expressionS exp;
2645
34
  symbolS *aranges_end;
2646
34
  char *p;
2647
34
  int sizeof_offset;
2648
2649
34
  memset (&exp, 0, sizeof exp);
2650
34
  sizeof_offset = out_header (aranges_seg, &exp);
2651
34
  aranges_end = exp.X_add_symbol;
2652
34
  size = -exp.X_add_number;
2653
2654
  /* Version.  */
2655
34
  out_two (DWARF2_ARANGES_VERSION);
2656
34
  size += 2;
2657
2658
  /* Offset to .debug_info.  */
2659
34
  TC_DWARF2_EMIT_OFFSET (section_symbol (info_seg), sizeof_offset);
2660
34
  size += sizeof_offset;
2661
2662
  /* Size of an address (offset portion).  */
2663
34
  out_byte (addr_size);
2664
34
  size++;
2665
2666
  /* Size of a segment descriptor.  */
2667
34
  out_byte (0);
2668
34
  size++;
2669
2670
  /* Align the header.  */
2671
170
  while ((size++ % (2 * addr_size)) > 0)
2672
136
    out_byte (0);
2673
2674
69
  for (s = all_segs; s; s = s->next)
2675
35
    {
2676
35
      fragS *frag;
2677
35
      symbolS *beg, *end;
2678
2679
35
      frag = first_frag_for_seg (s->seg);
2680
35
      beg = symbol_temp_new (s->seg, frag, 0);
2681
35
      s->text_start = beg;
2682
2683
35
      frag = last_frag_for_seg (s->seg);
2684
35
      end = symbol_temp_new (s->seg, frag, get_frag_fix (frag, s->seg));
2685
35
      s->text_end = end;
2686
2687
35
      exp.X_op = O_symbol;
2688
35
      exp.X_add_symbol = beg;
2689
35
      exp.X_add_number = 0;
2690
35
      emit_expr (&exp, addr_size);
2691
2692
35
      exp.X_op = O_subtract;
2693
35
      exp.X_add_symbol = end;
2694
35
      exp.X_op_symbol = beg;
2695
35
      exp.X_add_number = 0;
2696
35
      emit_expr (&exp, addr_size);
2697
35
    }
2698
2699
34
  p = frag_more (2 * addr_size);
2700
34
  md_number_to_chars (p, 0, addr_size);
2701
34
  md_number_to_chars (p + addr_size, 0, addr_size);
2702
2703
34
  symbol_set_value_now (aranges_end);
2704
34
}
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
34
{
2715
34
  int secoff_form;
2716
34
  bool have_efunc = false, have_lfunc = false;
2717
2718
  /* Check the symbol table for function symbols which also have their size
2719
     specified.  */
2720
34
  if (symbol_rootP)
2721
34
    {
2722
34
      symbolS *symp;
2723
2724
2.05k
      for (symp = symbol_rootP; symp; symp = symbol_next (symp))
2725
2.02k
  {
2726
    /* A warning construct is a warning symbol followed by the
2727
       symbol warned about.  Skip this and the following symbol.  */
2728
2.02k
    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
2.02k
    if (!S_IS_DEFINED (symp) || !S_IS_FUNCTION (symp))
2737
2.02k
      continue;
2738
2739
0
#if defined (OBJ_ELF) /* || defined (OBJ_MAYBE_ELF) */
2740
0
    if (S_GET_SIZE (symp) == 0)
2741
0
      {
2742
0
        if (!IS_ELF || symbol_get_obj (symp)->size == NULL)
2743
0
    continue;
2744
0
      }
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
34
    }
2755
2756
34
  subseg_set (abbrev_seg, 0);
2757
2758
34
  out_uleb128 (GAS_ABBREV_COMP_UNIT);
2759
34
  out_uleb128 (DW_TAG_compile_unit);
2760
34
  out_byte (have_efunc || have_lfunc ? DW_CHILDREN_yes : DW_CHILDREN_no);
2761
34
  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
34
  else
2769
34
    secoff_form = DW_FORM_sec_offset;
2770
34
  out_abbrev (DW_AT_stmt_list, secoff_form);
2771
34
  if (all_segs->next == NULL)
2772
33
    {
2773
33
      out_abbrev (DW_AT_low_pc, DW_FORM_addr);
2774
33
      if (DWARF2_VERSION < 4)
2775
0
  out_abbrev (DW_AT_high_pc, DW_FORM_addr);
2776
33
      else
2777
33
  out_abbrev (DW_AT_high_pc, DW_FORM_udata);
2778
33
    }
2779
1
  else
2780
1
    out_abbrev (DW_AT_ranges, secoff_form);
2781
34
  out_abbrev (DW_AT_name, DW_FORM_strp);
2782
34
  out_abbrev (DW_AT_comp_dir, DW_FORM_strp);
2783
34
  out_abbrev (DW_AT_producer, DW_FORM_strp);
2784
34
  out_abbrev (DW_AT_language, DW_FORM_data2);
2785
34
  out_abbrev (0, 0);
2786
2787
34
  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
34
  out_byte (0);
2828
34
}
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
34
{
2838
34
  expressionS exp;
2839
34
  symbolS *info_end;
2840
34
  int sizeof_offset;
2841
2842
34
  memset (&exp, 0, sizeof exp);
2843
34
  sizeof_offset = out_header (info_seg, &exp);
2844
34
  info_end = exp.X_add_symbol;
2845
2846
  /* DWARF version.  */
2847
34
  out_two (DWARF2_VERSION);
2848
2849
34
  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
34
  else
2855
34
    {
2856
      /* unit (header) type */
2857
34
      out_byte (DW_UT_compile);
2858
34
    }
2859
2860
  /* Target address size.  */
2861
34
  out_byte (sizeof_address);
2862
2863
34
  if (DWARF2_VERSION >= 5)
2864
34
    {
2865
      /* .debug_abbrev offset */
2866
34
      TC_DWARF2_EMIT_OFFSET (section_symbol (abbrev_seg), sizeof_offset);
2867
34
    }
2868
2869
  /* DW_TAG_compile_unit DIE abbrev */
2870
34
  out_uleb128 (GAS_ABBREV_COMP_UNIT);
2871
2872
  /* DW_AT_stmt_list */
2873
34
  TC_DWARF2_EMIT_OFFSET (section_symbol (line_seg),
2874
34
       (DWARF2_FORMAT (line_seg) == dwarf2_format_32bit
2875
34
        ? 4 : 8));
2876
2877
  /* These two attributes are emitted if all of the code is contiguous.  */
2878
34
  if (all_segs->next == NULL)
2879
33
    {
2880
      /* DW_AT_low_pc */
2881
33
      exp.X_op = O_symbol;
2882
33
      exp.X_add_symbol = all_segs->text_start;
2883
33
      exp.X_add_number = 0;
2884
33
      emit_expr (&exp, sizeof_address);
2885
2886
      /* DW_AT_high_pc */
2887
33
      if (DWARF2_VERSION < 4)
2888
0
  exp.X_op = O_symbol;
2889
33
      else
2890
33
  {
2891
33
    exp.X_op = O_subtract;
2892
33
    exp.X_op_symbol = all_segs->text_start;
2893
33
  }
2894
33
      exp.X_add_symbol = all_segs->text_end;
2895
33
      exp.X_add_number = 0;
2896
33
      if (DWARF2_VERSION < 4)
2897
0
  emit_expr (&exp, sizeof_address);
2898
33
      else
2899
33
  emit_leb128_expr (&exp, 0);
2900
33
    }
2901
1
  else
2902
1
    {
2903
      /* This attribute is emitted if the code is disjoint.  */
2904
      /* DW_AT_ranges.  */
2905
1
      TC_DWARF2_EMIT_OFFSET (ranges_sym, sizeof_offset);
2906
1
    }
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
34
  TC_DWARF2_EMIT_OFFSET (name_sym, sizeof_offset);
2911
34
  TC_DWARF2_EMIT_OFFSET (comp_dir_sym, sizeof_offset);
2912
34
  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
34
  out_two (DW_LANG_Mips_Assembler);
2917
2918
34
  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
34
  symbol_set_value_now (info_end);
3020
34
}
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
34
{
3028
34
  char producer[128];
3029
34
  char *p;
3030
34
  int len;
3031
34
  int first_file = DWARF2_LINE_VERSION > 4 ? 0 : 1;
3032
3033
34
  if (files_in_use == 0)
3034
0
    abort ();
3035
34
  if (first_file == 0 && files[first_file].filename == NULL)
3036
0
    first_file = 1;
3037
3038
34
  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
34
  *name_sym = symbol_temp_new_now_octets ();
3045
3046
34
  if (files[first_file].dir)
3047
11
    {
3048
11
      char *dirname = remap_debug_filename (dirs[files[first_file].dir]);
3049
11
      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
11
      p = frag_more (len + 1);
3056
11
      memcpy (p, dirname, len);
3057
11
      INSERT_DIR_SEPARATOR (p, len);
3058
11
#endif
3059
11
      free (dirname);
3060
11
    }
3061
34
  len = strlen (files[first_file].filename) + 1;
3062
34
  p = frag_more (len);
3063
34
  memcpy (p, files[first_file].filename, len);
3064
3065
  /* DW_AT_comp_dir */
3066
34
  *comp_dir_sym = symbol_temp_new_now_octets ();
3067
34
  char *comp_dir = remap_debug_filename (getpwd ());
3068
34
  len = strlen (comp_dir) + 1;
3069
34
  p = frag_more (len);
3070
34
  memcpy (p, comp_dir, len);
3071
34
  free (comp_dir);
3072
3073
  /* DW_AT_producer */
3074
34
  *producer_sym = symbol_temp_new_now_octets ();
3075
34
  sprintf (producer, "GNU AS %s", VERSION);
3076
34
  len = strlen (producer) + 1;
3077
34
  p = frag_more (len);
3078
34
  memcpy (p, producer, len);
3079
34
}
3080
3081
void
3082
dwarf2_init (void)
3083
567
{
3084
567
  all_segs = NULL;
3085
567
  last_seg_ptr = &all_segs;
3086
567
  files = NULL;
3087
567
  files_in_use = 0;
3088
567
  files_allocated = 0;
3089
567
  dirs = NULL;
3090
567
  dirs_in_use = 0;
3091
567
  dirs_allocated = 0;
3092
567
  dwarf2_loc_directive_seen = false;
3093
567
  dwarf2_any_loc_directive_seen = false;
3094
567
  dwarf2_loc_mark_labels = false;
3095
567
  current.filenum = 1;
3096
567
  current.line = 1;
3097
567
  current.column = 0;
3098
567
  current.isa = 0;
3099
567
  current.flags = DWARF2_LINE_DEFAULT_IS_STMT ? DWARF2_FLAG_IS_STMT : 0;
3100
567
  current.discriminator = 0;
3101
567
  current.u.view = NULL;
3102
567
  force_reset_view = NULL;
3103
567
  view_assert_failed = NULL;
3104
567
  dw2_line = -1;
3105
567
  dw2_filename = NULL;
3106
567
  label_num = 0;
3107
567
  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
567
  if (flag_dwarf_cie_version == -1)
3118
1
    flag_dwarf_cie_version = 1;
3119
567
}
3120
3121
static void
3122
dwarf2_cleanup (void)
3123
567
{
3124
567
  purge_generated_debug (true);
3125
567
  free (files);
3126
627
  for (unsigned int i = 0; i < dirs_in_use; i++)
3127
60
    free (dirs[i]);
3128
567
  free (dirs);
3129
567
}
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
567
{
3143
567
  segT line_seg;
3144
567
  struct line_seg *s;
3145
567
  segT info_seg;
3146
567
  int emit_other_sections = 0;
3147
567
  int empty_debug_line = 0;
3148
3149
567
  info_seg = bfd_get_section_by_name (stdoutput, ".debug_info");
3150
567
  emit_other_sections = info_seg == NULL || !seg_not_empty_p (info_seg);
3151
3152
567
  line_seg = bfd_get_section_by_name (stdoutput, ".debug_line");
3153
567
  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
567
  if (all_segs && !empty_debug_line && dwarf2_any_loc_directive_seen)
3160
0
    as_fatal ("duplicate .debug_line sections");
3161
3162
567
  if ((!all_segs && emit_other_sections)
3163
35
      || (!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
532
    {
3168
532
      dwarf2_cleanup ();
3169
532
      return;
3170
532
    }
3171
3172
  /* Calculate the size of an address for the target machine.  */
3173
35
  sizeof_address = DWARF2_ADDR_SIZE (stdoutput);
3174
3175
  /* Create and switch to the line number section.  */
3176
35
  if (empty_debug_line)
3177
35
    {
3178
35
      line_seg = subseg_new (".debug_line", 0);
3179
35
      bfd_set_section_flags (line_seg,
3180
35
           SEC_READONLY | SEC_DEBUGGING | SEC_OCTETS);
3181
35
    }
3182
3183
70
  for (s = all_segs; s; s = s->next)
3184
35
    {
3185
35
      struct line_subseg *lss;
3186
3187
82
      for (lss = s->head; lss; lss = lss->next)
3188
47
  if (lss->head)
3189
47
    do_allocate_filenum (lss->head);
3190
35
    }
3191
3192
  /* For each subsection, chain the debug entries together.  */
3193
70
  for (s = all_segs; s; s = s->next)
3194
35
    {
3195
35
      struct line_subseg *lss = s->head;
3196
35
      struct line_entry **ptail = lss->ptail;
3197
3198
      /* Reset the initial view of the first subsection of the
3199
   section.  */
3200
35
      if (lss->head && lss->head->loc.u.view)
3201
6
  set_or_check_view (lss->head, NULL, NULL);
3202
3203
47
      while ((lss = lss->next) != NULL)
3204
12
  {
3205
    /* Link the first view of subsequent subsections to the
3206
       previous view.  */
3207
12
    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
12
    *ptail = lss->head;
3211
12
    lss->head = NULL;
3212
12
    ptail = lss->ptail;
3213
12
  }
3214
35
    }
3215
3216
35
  if (empty_debug_line)
3217
35
    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
35
  if (emit_other_sections)
3223
34
    {
3224
34
      segT abbrev_seg;
3225
34
      segT aranges_seg;
3226
34
      segT str_seg;
3227
34
      symbolS *name_sym, *comp_dir_sym, *producer_sym, *ranges_sym;
3228
34
      unsigned char func_form = 0;
3229
3230
34
      gas_assert (all_segs);
3231
3232
34
      info_seg = subseg_new (".debug_info", 0);
3233
34
      abbrev_seg = subseg_new (".debug_abbrev", 0);
3234
34
      aranges_seg = subseg_new (".debug_aranges", 0);
3235
34
      str_seg = subseg_new (".debug_str", 0);
3236
3237
34
      bfd_set_section_flags (info_seg,
3238
34
            SEC_READONLY | SEC_DEBUGGING | SEC_OCTETS);
3239
34
      bfd_set_section_flags (abbrev_seg,
3240
34
            SEC_READONLY | SEC_DEBUGGING | SEC_OCTETS);
3241
34
      bfd_set_section_flags (aranges_seg,
3242
34
            SEC_READONLY | SEC_DEBUGGING | SEC_OCTETS);
3243
34
      bfd_set_section_flags (str_seg,
3244
34
            SEC_READONLY | SEC_DEBUGGING | SEC_OCTETS
3245
34
               | SEC_MERGE | SEC_STRINGS);
3246
34
      str_seg->entsize = 1;
3247
3248
34
      record_alignment (aranges_seg, ffs (2 * sizeof_address) - 1);
3249
3250
34
      if (all_segs->next == NULL)
3251
33
  ranges_sym = NULL;
3252
1
      else
3253
1
  {
3254
1
    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
1
    else
3264
1
      {
3265
1
        segT rnglists_seg = subseg_new (".debug_rnglists", 0);
3266
1
        bfd_set_section_flags (rnglists_seg, (SEC_READONLY
3267
1
                | SEC_DEBUGGING
3268
1
                | SEC_OCTETS));
3269
1
        out_debug_rnglists (rnglists_seg, &ranges_sym);
3270
1
      }
3271
1
  }
3272
3273
34
      out_debug_aranges (aranges_seg, info_seg);
3274
34
      out_debug_abbrev (abbrev_seg, info_seg, line_seg, &func_form);
3275
34
      out_debug_str (str_seg, &name_sym, &comp_dir_sym, &producer_sym);
3276
34
      out_debug_info (info_seg, abbrev_seg, line_seg, str_seg,
3277
34
          ranges_sym, name_sym, comp_dir_sym, producer_sym,
3278
34
          func_form);
3279
34
    }
3280
35
  dwarf2_cleanup ();
3281
35
}
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
}