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