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