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