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