x86: improve operand reversal
[deliverable/binutils-gdb.git] / gas / dwarf2dbg.c
CommitLineData
fac0d250 1/* dwarf2dbg.c - DWARF2 debug support
219d1afa 2 Copyright (C) 1999-2018 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
84#define DWARF2_FILE_TIME_NAME(FILENAME,DIRNAME) 0
85#endif
86
87#ifndef DWARF2_FILE_SIZE_NAME
88#define DWARF2_FILE_SIZE_NAME(FILENAME,DIRNAME) 0
89#endif
90
fc0eebac
TG
91#ifndef DWARF2_VERSION
92#define DWARF2_VERSION 2
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
100/* This implementation output version 2 .debug_line information. */
101#ifndef DWARF2_LINE_VERSION
102#define DWARF2_LINE_VERSION 2
103#endif
104
fac0d250
RH
105#include "subsegs.h"
106
fa8f86ff 107#include "dwarf2.h"
fac0d250 108
fac0d250
RH
109/* Since we can't generate the prolog until the body is complete, we
110 use three different subsegments for .debug_line: one holding the
111 prolog, one for the directory and filename info, and one for the
112 body ("statement program"). */
113#define DL_PROLOG 0
114#define DL_FILES 1
115#define DL_BODY 2
116
1737851b
BW
117/* If linker relaxation might change offsets in the code, the DWARF special
118 opcodes and variable-length operands cannot be used. If this macro is
119 nonzero, use the DW_LNS_fixed_advance_pc opcode instead. */
120#ifndef DWARF2_USE_FIXED_ADVANCE_PC
453dc3f0 121# define DWARF2_USE_FIXED_ADVANCE_PC linkrelax
1737851b
BW
122#endif
123
33eaf5de 124/* First special line opcode - leave room for the standard opcodes.
fac0d250
RH
125 Note: If you want to change this, you'll have to update the
126 "standard_opcode_lengths" table that is emitted below in
bd0eb99b
RH
127 out_debug_line(). */
128#define DWARF2_LINE_OPCODE_BASE 13
fac0d250
RH
129
130#ifndef DWARF2_LINE_BASE
131 /* Minimum line offset in a special line info. opcode. This value
132 was chosen to give a reasonable range of values. */
133# define DWARF2_LINE_BASE -5
134#endif
135
136/* Range of line offsets in a special line info. opcode. */
137#ifndef DWARF2_LINE_RANGE
138# define DWARF2_LINE_RANGE 14
139#endif
140
141#ifndef DWARF2_LINE_MIN_INSN_LENGTH
142 /* Define the architecture-dependent minimum instruction length (in
143 bytes). This value should be rather too small than too big. */
4dc7ead9 144# define DWARF2_LINE_MIN_INSN_LENGTH 1
fac0d250
RH
145#endif
146
bd0eb99b 147/* Flag that indicates the initial value of the is_stmt_start flag. */
fac0d250
RH
148#define DWARF2_LINE_DEFAULT_IS_STMT 1
149
cb30237e 150/* Given a special op, return the line skip amount. */
fac0d250
RH
151#define SPECIAL_LINE(op) \
152 (((op) - DWARF2_LINE_OPCODE_BASE)%DWARF2_LINE_RANGE + DWARF2_LINE_BASE)
153
154/* Given a special op, return the address skip amount (in units of
155 DWARF2_LINE_MIN_INSN_LENGTH. */
156#define SPECIAL_ADDR(op) (((op) - DWARF2_LINE_OPCODE_BASE)/DWARF2_LINE_RANGE)
157
cb30237e 158/* The maximum address skip amount that can be encoded with a special op. */
fac0d250
RH
159#define MAX_SPECIAL_ADDR_DELTA SPECIAL_ADDR(255)
160
62ebcb5c
AM
161#ifndef TC_PARSE_CONS_RETURN_NONE
162#define TC_PARSE_CONS_RETURN_NONE BFD_RELOC_NONE
163#endif
164
ba8826a8
AO
165struct line_entry
166{
220e750f 167 struct line_entry *next;
07a53e5c 168 symbolS *label;
220e750f 169 struct dwarf2_line_info loc;
e6c774b4 170};
fac0d250 171
ba8826a8
AO
172/* Don't change the offset of next in line_entry. set_or_check_view
173 calls in dwarf2_gen_line_info_1 depend on it. */
174static char unused[offsetof(struct line_entry, next) ? -1 : 1]
175ATTRIBUTE_UNUSED;
176
177struct line_subseg
178{
220e750f
RH
179 struct line_subseg *next;
180 subsegT subseg;
181 struct line_entry *head;
182 struct line_entry **ptail;
e410add4 183 struct line_entry **pmove_tail;
220e750f 184};
353e2c69 185
ba8826a8
AO
186struct line_seg
187{
220e750f
RH
188 struct line_seg *next;
189 segT seg;
190 struct line_subseg *head;
191 symbolS *text_start;
192 symbolS *text_end;
193};
194
195/* Collects data for all line table entries during assembly. */
196static struct line_seg *all_segs;
1e9cc1c2 197static struct line_seg **last_seg_ptr;
220e750f 198
ba8826a8
AO
199struct file_entry
200{
a7ed1ca2 201 const char *filename;
220e750f
RH
202 unsigned int dir;
203};
204
205/* Table of files used by .debug_line. */
206static struct file_entry *files;
207static unsigned int files_in_use;
208static unsigned int files_allocated;
209
a7ed1ca2
NC
210/* Table of directories used by .debug_line. */
211static char **dirs;
212static unsigned int dirs_in_use;
213static unsigned int dirs_allocated;
214
b34976b6 215/* TRUE when we've seen a .loc directive recently. Used to avoid
220e750f 216 doing work when there's nothing to do. */
1eee4adc 217bfd_boolean dwarf2_loc_directive_seen;
220e750f 218
07a53e5c
RH
219/* TRUE when we're supposed to set the basic block mark whenever a
220 label is seen. */
221bfd_boolean dwarf2_loc_mark_labels;
222
220e750f 223/* Current location as indicated by the most recent .loc directive. */
ba8826a8
AO
224static struct dwarf2_line_info current =
225{
bd0eb99b 226 1, 1, 0, 0,
92846e72 227 DWARF2_LINE_DEFAULT_IS_STMT ? DWARF2_FLAG_IS_STMT : 0,
ba8826a8 228 0, NULL
bd0eb99b 229};
220e750f 230
ba8826a8
AO
231/* This symbol is used to recognize view number forced resets in loc
232 lists. */
233static symbolS *force_reset_view;
234
235/* This symbol evaluates to an expression that, if nonzero, indicates
236 some view assert check failed. */
237static symbolS *view_assert_failed;
238
220e750f
RH
239/* The size of an address on the target. */
240static unsigned int sizeof_address;
241\f
a2e22468 242static unsigned int get_filenum (const char *, unsigned int);
413a266c 243
c5c0a210 244#ifndef TC_DWARF2_EMIT_OFFSET
802f5d9e 245#define TC_DWARF2_EMIT_OFFSET generic_dwarf2_emit_offset
c5c0a210 246
6174d9c8
RH
247/* Create an offset to .dwarf2_*. */
248
249static void
a2e22468 250generic_dwarf2_emit_offset (symbolS *symbol, unsigned int size)
6174d9c8 251{
91d6fa6a 252 expressionS exp;
6174d9c8 253
031e3350 254 memset (&exp, 0, sizeof exp);
91d6fa6a
NC
255 exp.X_op = O_symbol;
256 exp.X_add_symbol = symbol;
257 exp.X_add_number = 0;
258 emit_expr (&exp, size);
6174d9c8 259}
c5c0a210 260#endif
6174d9c8 261
e410add4 262/* Find or create (if CREATE_P) an entry for SEG+SUBSEG in ALL_SEGS. */
220e750f
RH
263
264static struct line_subseg *
e410add4 265get_line_subseg (segT seg, subsegT subseg, bfd_boolean create_p)
220e750f 266{
5f3fd8b4 267 struct line_seg *s = seg_info (seg)->dwarf2_line_seg;
91d6fa6a 268 struct line_subseg **pss, *lss;
fac0d250 269
1e9cc1c2
NC
270 if (s == NULL)
271 {
e410add4
RS
272 if (!create_p)
273 return NULL;
274
325801bd 275 s = XNEW (struct line_seg);
1e9cc1c2
NC
276 s->next = NULL;
277 s->seg = seg;
278 s->head = NULL;
279 *last_seg_ptr = s;
280 last_seg_ptr = &s->next;
5f3fd8b4 281 seg_info (seg)->dwarf2_line_seg = s;
1e9cc1c2
NC
282 }
283 gas_assert (seg == s->seg);
220e750f 284
91d6fa6a 285 for (pss = &s->head; (lss = *pss) != NULL ; pss = &lss->next)
fac0d250 286 {
91d6fa6a 287 if (lss->subseg == subseg)
ee515fb7 288 goto found_subseg;
91d6fa6a 289 if (lss->subseg > subseg)
220e750f 290 break;
fac0d250 291 }
220e750f 292
325801bd 293 lss = XNEW (struct line_subseg);
91d6fa6a
NC
294 lss->next = *pss;
295 lss->subseg = subseg;
296 lss->head = NULL;
297 lss->ptail = &lss->head;
e410add4 298 lss->pmove_tail = &lss->head;
91d6fa6a 299 *pss = lss;
220e750f
RH
300
301 found_subseg:
91d6fa6a 302 return lss;
fac0d250
RH
303}
304
ba8826a8
AO
305/* (Un)reverse the line_entry list starting from H. */
306
307static struct line_entry *
308reverse_line_entry_list (struct line_entry *h)
309{
310 struct line_entry *p = NULL, *e, *n;
311
312 for (e = h; e; e = n)
313 {
314 n = e->next;
315 e->next = p;
316 p = e;
317 }
318 return p;
319}
320
321/* Compute the view for E based on the previous entry P. If we
322 introduce an (undefined) view symbol for P, and H is given (P must
323 be the tail in this case), introduce view symbols for earlier list
324 entries as well, until one of them is constant. */
325
326static void
327set_or_check_view (struct line_entry *e, struct line_entry *p,
328 struct line_entry *h)
329{
330 expressionS viewx;
331
332 memset (&viewx, 0, sizeof (viewx));
333 viewx.X_unsigned = 1;
334
335 /* First, compute !(E->label > P->label), to tell whether or not
336 we're to reset the view number. If we can't resolve it to a
337 constant, keep it symbolic. */
338 if (!p || (e->loc.view == force_reset_view && force_reset_view))
339 {
340 viewx.X_op = O_constant;
341 viewx.X_add_number = 0;
342 viewx.X_add_symbol = NULL;
343 viewx.X_op_symbol = NULL;
344 }
345 else
346 {
347 viewx.X_op = O_gt;
348 viewx.X_add_number = 0;
349 viewx.X_add_symbol = e->label;
350 viewx.X_op_symbol = p->label;
351 resolve_expression (&viewx);
352 if (viewx.X_op == O_constant)
353 viewx.X_add_number = !viewx.X_add_number;
354 else
355 {
356 viewx.X_add_symbol = make_expr_symbol (&viewx);
357 viewx.X_add_number = 0;
358 viewx.X_op_symbol = NULL;
359 viewx.X_op = O_logical_not;
360 }
361 }
362
363 if (S_IS_DEFINED (e->loc.view) && symbol_constant_p (e->loc.view))
364 {
365 expressionS *value = symbol_get_value_expression (e->loc.view);
366 /* We can't compare the view numbers at this point, because in
367 VIEWX we've only determined whether we're to reset it so
368 far. */
369 if (viewx.X_op == O_constant)
370 {
371 if (!value->X_add_number != !viewx.X_add_number)
372 as_bad (_("view number mismatch"));
373 }
374 /* Record the expression to check it later. It is the result of
375 a logical not, thus 0 or 1. We just add up all such deferred
376 expressions, and resolve it at the end. */
377 else if (!value->X_add_number)
378 {
379 symbolS *deferred = make_expr_symbol (&viewx);
380 if (view_assert_failed)
381 {
382 expressionS chk;
031e3350 383
ba8826a8
AO
384 memset (&chk, 0, sizeof (chk));
385 chk.X_unsigned = 1;
386 chk.X_op = O_add;
387 chk.X_add_number = 0;
388 chk.X_add_symbol = view_assert_failed;
389 chk.X_op_symbol = deferred;
390 deferred = make_expr_symbol (&chk);
391 }
392 view_assert_failed = deferred;
393 }
394 }
395
396 if (viewx.X_op != O_constant || viewx.X_add_number)
397 {
398 expressionS incv;
399
400 if (!p->loc.view)
401 {
402 p->loc.view = symbol_temp_make ();
403 gas_assert (!S_IS_DEFINED (p->loc.view));
404 }
405
406 memset (&incv, 0, sizeof (incv));
407 incv.X_unsigned = 1;
408 incv.X_op = O_symbol;
409 incv.X_add_symbol = p->loc.view;
410 incv.X_add_number = 1;
411
412 if (viewx.X_op == O_constant)
413 {
414 gas_assert (viewx.X_add_number == 1);
415 viewx = incv;
416 }
417 else
418 {
419 viewx.X_add_symbol = make_expr_symbol (&viewx);
420 viewx.X_add_number = 0;
421 viewx.X_op_symbol = make_expr_symbol (&incv);
422 viewx.X_op = O_multiply;
423 }
424 }
425
426 if (!S_IS_DEFINED (e->loc.view))
427 {
428 symbol_set_value_expression (e->loc.view, &viewx);
429 S_SET_SEGMENT (e->loc.view, absolute_section);
430 symbol_set_frag (e->loc.view, &zero_address_frag);
431 }
432
433 /* Define and attempt to simplify any earlier views needed to
434 compute E's. */
435 if (h && p && p->loc.view && !S_IS_DEFINED (p->loc.view))
436 {
437 struct line_entry *h2;
438 /* Reverse the list to avoid quadratic behavior going backwards
439 in a single-linked list. */
440 struct line_entry *r = reverse_line_entry_list (h);
441
442 gas_assert (r == p);
443 /* Set or check views until we find a defined or absent view. */
444 do
445 set_or_check_view (r, r->next, NULL);
446 while (r->next && r->next->loc.view && !S_IS_DEFINED (r->next->loc.view)
447 && (r = r->next));
448
449 /* Unreverse the list, so that we can go forward again. */
450 h2 = reverse_line_entry_list (p);
451 gas_assert (h2 == h);
452
453 /* Starting from the last view we just defined, attempt to
454 simplify the view expressions, until we do so to P. */
455 do
456 {
457 gas_assert (S_IS_DEFINED (r->loc.view));
458 resolve_expression (symbol_get_value_expression (r->loc.view));
459 }
460 while (r != p && (r = r->next));
461
462 /* Now that we've defined and computed all earlier views that might
463 be needed to compute E's, attempt to simplify it. */
464 resolve_expression (symbol_get_value_expression (e->loc.view));
465 }
466}
467
6a50d470 468/* Record an entry for LOC occurring at LABEL. */
07a53e5c
RH
469
470static void
6a50d470 471dwarf2_gen_line_info_1 (symbolS *label, struct dwarf2_line_info *loc)
07a53e5c 472{
6a50d470 473 struct line_subseg *lss;
07a53e5c
RH
474 struct line_entry *e;
475
325801bd 476 e = XNEW (struct line_entry);
07a53e5c 477 e->next = NULL;
6a50d470 478 e->label = label;
07a53e5c
RH
479 e->loc = *loc;
480
e410add4 481 lss = get_line_subseg (now_seg, now_subseg, TRUE);
ba8826a8
AO
482
483 if (loc->view)
484 set_or_check_view (e,
485 !lss->head ? NULL : (struct line_entry *)lss->ptail,
486 lss->head);
487
6a50d470
RS
488 *lss->ptail = e;
489 lss->ptail = &e->next;
07a53e5c
RH
490}
491
436d9e46 492/* Record an entry for LOC occurring at OFS within the current fragment. */
353e2c69 493
220e750f 494void
a2e22468 495dwarf2_gen_line_info (addressT ofs, struct dwarf2_line_info *loc)
fac0d250 496{
1ea5c325
MS
497 static unsigned int line = -1;
498 static unsigned int filenum = -1;
220e750f 499
6a50d470
RS
500 symbolS *sym;
501
220e750f
RH
502 /* Early out for as-yet incomplete location information. */
503 if (loc->filenum == 0 || loc->line == 0)
504 return;
505
ffa554ed
GK
506 /* Don't emit sequences of line symbols for the same line when the
507 symbols apply to assembler code. It is necessary to emit
508 duplicate line symbols when a compiler asks for them, because GDB
509 uses them to determine the end of the prologue. */
d1a6c242 510 if (debug_type == DEBUG_DWARF2
ffa554ed 511 && line == loc->line && filenum == loc->filenum)
1ea5c325
MS
512 return;
513
514 line = loc->line;
515 filenum = loc->filenum;
516
453dc3f0
NC
517 if (linkrelax)
518 {
519 char name[120];
520
521 /* Use a non-fake name for the line number location,
522 so that it can be referred to by relocations. */
523 sprintf (name, ".Loc.%u.%u", line, filenum);
6a50d470 524 sym = symbol_new (name, now_seg, ofs, frag_now);
453dc3f0
NC
525 }
526 else
6a50d470
RS
527 sym = symbol_temp_new (now_seg, ofs, frag_now);
528 dwarf2_gen_line_info_1 (sym, loc);
220e750f 529}
fac0d250 530
ecea7679
RH
531/* Returns the current source information. If .file directives have
532 been encountered, the info for the corresponding source file is
533 returned. Otherwise, the info for the assembly source file is
534 returned. */
535
220e750f 536void
a2e22468 537dwarf2_where (struct dwarf2_line_info *line)
220e750f
RH
538{
539 if (debug_type == DEBUG_DWARF2)
fac0d250 540 {
ba8826a8
AO
541 const char *filename;
542
543 memset (line, 0, sizeof (*line));
544 filename = as_where (&line->line);
a7ed1ca2 545 line->filenum = get_filenum (filename, 0);
220e750f 546 line->column = 0;
bd0eb99b 547 line->flags = DWARF2_FLAG_IS_STMT;
ecea7679 548 line->isa = current.isa;
92846e72 549 line->discriminator = current.discriminator;
ba8826a8 550 line->view = NULL;
fac0d250 551 }
220e750f
RH
552 else
553 *line = current;
fac0d250
RH
554}
555
7fd3924a 556/* A hook to allow the target backend to inform the line number state
ecea7679
RH
557 machine of isa changes when assembler debug info is enabled. */
558
559void
560dwarf2_set_isa (unsigned int isa)
561{
562 current.isa = isa;
563}
564
220e750f
RH
565/* Called for each machine instruction, or relatively atomic group of
566 machine instructions (ie built-in macro). The instruction or group
567 is SIZE bytes in length. If dwarf2 line number generation is called
568 for, emit a line statement appropriately. */
353e2c69 569
220e750f 570void
a2e22468 571dwarf2_emit_insn (int size)
fac0d250 572{
220e750f 573 struct dwarf2_line_info loc;
fac0d250 574
ba8826a8
AO
575 if (debug_type != DEBUG_DWARF2
576 ? !dwarf2_loc_directive_seen
577 : !seen_at_least_1_file ())
220e750f 578 return;
7fd3924a
AM
579
580 dwarf2_where (&loc);
b6675117 581
220e750f 582 dwarf2_gen_line_info (frag_now_fix () - size, &loc);
661ba50f
BW
583 dwarf2_consume_line_info ();
584}
585
e410add4
RS
586/* Move all previously-emitted line entries for the current position by
587 DELTA bytes. This function cannot be used to move the same entries
588 twice. */
589
590void
591dwarf2_move_insn (int delta)
592{
593 struct line_subseg *lss;
594 struct line_entry *e;
595 valueT now;
596
597 if (delta == 0)
598 return;
599
600 lss = get_line_subseg (now_seg, now_subseg, FALSE);
601 if (!lss)
602 return;
603
604 now = frag_now_fix ();
605 while ((e = *lss->pmove_tail))
606 {
607 if (S_GET_VALUE (e->label) == now)
608 S_SET_VALUE (e->label, now + delta);
609 lss->pmove_tail = &e->next;
610 }
611}
612
661ba50f
BW
613/* Called after the current line information has been either used with
614 dwarf2_gen_line_info or saved with a machine instruction for later use.
615 This resets the state of the line number information to reflect that
616 it has been used. */
617
618void
619dwarf2_consume_line_info (void)
620{
621 /* Unless we generate DWARF2 debugging information for each
622 assembler line, we only emit one line symbol for one LOC. */
7fd3924a 623 dwarf2_loc_directive_seen = FALSE;
bd0eb99b
RH
624
625 current.flags &= ~(DWARF2_FLAG_BASIC_BLOCK
626 | DWARF2_FLAG_PROLOGUE_END
627 | DWARF2_FLAG_EPILOGUE_BEGIN);
92846e72 628 current.discriminator = 0;
3a00b02d 629 current.view = NULL;
220e750f 630}
fac0d250 631
07a53e5c
RH
632/* Called for each (preferably code) label. If dwarf2_loc_mark_labels
633 is enabled, emit a basic block marker. */
634
635void
636dwarf2_emit_label (symbolS *label)
637{
638 struct dwarf2_line_info loc;
639
640 if (!dwarf2_loc_mark_labels)
641 return;
642 if (S_GET_SEGMENT (label) != now_seg)
643 return;
644 if (!(bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE))
645 return;
7fd3924a
AM
646 if (files_in_use == 0 && debug_type != DEBUG_DWARF2)
647 return;
648
649 dwarf2_where (&loc);
07a53e5c
RH
650
651 loc.flags |= DWARF2_FLAG_BASIC_BLOCK;
652
6a50d470 653 dwarf2_gen_line_info_1 (label, &loc);
7fd3924a 654 dwarf2_consume_line_info ();
07a53e5c
RH
655}
656
a7ed1ca2
NC
657/* Get a .debug_line file number for FILENAME. If NUM is nonzero,
658 allocate it on that file table slot, otherwise return the first
659 empty one. */
220e750f
RH
660
661static unsigned int
a2e22468 662get_filenum (const char *filename, unsigned int num)
220e750f 663{
a7ed1ca2
NC
664 static unsigned int last_used, last_used_dir_len;
665 const char *file;
666 size_t dir_len;
667 unsigned int i, dir;
220e750f 668
a7ed1ca2
NC
669 if (num == 0 && last_used)
670 {
671 if (! files[last_used].dir
8b6efd89 672 && filename_cmp (filename, files[last_used].filename) == 0)
a7ed1ca2
NC
673 return last_used;
674 if (files[last_used].dir
8b6efd89
KT
675 && filename_ncmp (filename, dirs[files[last_used].dir],
676 last_used_dir_len) == 0
a7ed1ca2 677 && IS_DIR_SEPARATOR (filename [last_used_dir_len])
8b6efd89
KT
678 && filename_cmp (filename + last_used_dir_len + 1,
679 files[last_used].filename) == 0)
a7ed1ca2
NC
680 return last_used;
681 }
220e750f 682
a7ed1ca2
NC
683 file = lbasename (filename);
684 /* Don't make empty string from / or A: from A:/ . */
685#ifdef HAVE_DOS_BASED_FILE_SYSTEM
686 if (file <= filename + 3)
687 file = filename;
688#else
689 if (file == filename + 1)
690 file = filename;
691#endif
692 dir_len = file - filename;
693
694 dir = 0;
695 if (dir_len)
696 {
01e1a5bc 697#ifndef DWARF2_DIR_SHOULD_END_WITH_SEPARATOR
a7ed1ca2 698 --dir_len;
01e1a5bc 699#endif
a7ed1ca2 700 for (dir = 1; dir < dirs_in_use; ++dir)
8b6efd89 701 if (filename_ncmp (filename, dirs[dir], dir_len) == 0
a7ed1ca2
NC
702 && dirs[dir][dir_len] == '\0')
703 break;
704
705 if (dir >= dirs_in_use)
706 {
707 if (dir >= dirs_allocated)
708 {
709 dirs_allocated = dir + 32;
325801bd 710 dirs = XRESIZEVEC (char *, dirs, dirs_allocated);
a7ed1ca2
NC
711 }
712
29a2809e 713 dirs[dir] = xmemdup0 (filename, dir_len);
a7ed1ca2
NC
714 dirs_in_use = dir + 1;
715 }
716 }
717
718 if (num == 0)
719 {
720 for (i = 1; i < files_in_use; ++i)
721 if (files[i].dir == dir
88b4ca40 722 && files[i].filename
8b6efd89 723 && filename_cmp (file, files[i].filename) == 0)
a7ed1ca2
NC
724 {
725 last_used = i;
726 last_used_dir_len = dir_len;
727 return i;
728 }
729 }
730 else
731 i = num;
220e750f
RH
732
733 if (i >= files_allocated)
fac0d250 734 {
249e3833
RH
735 unsigned int old = files_allocated;
736
220e750f 737 files_allocated = i + 32;
325801bd 738 files = XRESIZEVEC (struct file_entry, files, files_allocated);
249e3833
RH
739
740 memset (files + old, 0, (i + 32 - old) * sizeof (struct file_entry));
fac0d250
RH
741 }
742
a7ed1ca2
NC
743 files[i].filename = num ? file : xstrdup (file);
744 files[i].dir = dir;
10cd14b4
AM
745 if (files_in_use < i + 1)
746 files_in_use = i + 1;
220e750f 747 last_used = i;
a7ed1ca2 748 last_used_dir_len = dir_len;
220e750f
RH
749
750 return i;
751}
fac0d250 752
ecb4347a
DJ
753/* Handle two forms of .file directive:
754 - Pass .file "source.c" to s_app_file
755 - Handle .file 1 "source.c" by adding an entry to the DWARF-2 file table
220e750f 756
68d20676 757 If an entry is added to the file table, return a pointer to the filename. */
ecb4347a
DJ
758
759char *
68d20676 760dwarf2_directive_filename (void)
220e750f
RH
761{
762 offsetT num;
e46d99eb 763 char *filename;
220e750f
RH
764 int filename_len;
765
766 /* Continue to accept a bare string and pass it off. */
767 SKIP_WHITESPACE ();
768 if (*input_line_pointer == '"')
fac0d250 769 {
220e750f 770 s_app_file (0);
ecb4347a 771 return NULL;
fac0d250
RH
772 }
773
220e750f
RH
774 num = get_absolute_expression ();
775 filename = demand_copy_C_string (&filename_len);
bd0eb99b
RH
776 if (filename == NULL)
777 return NULL;
220e750f
RH
778 demand_empty_rest_of_line ();
779
249e3833 780 if (num < 1)
fac0d250 781 {
0e389e77 782 as_bad (_("file number less than one"));
ecb4347a 783 return NULL;
fac0d250
RH
784 }
785
7cadeb2c
AM
786 /* A .file directive implies compiler generated debug information is
787 being supplied. Turn off gas generated debug info. */
788 debug_type = DEBUG_NONE;
789
0e1a166b 790 if (num < (int) files_in_use && files[num].filename != 0)
220e750f 791 {
0e389e77 792 as_bad (_("file number %ld already allocated"), (long) num);
ecb4347a 793 return NULL;
249e3833 794 }
220e750f 795
a7ed1ca2 796 get_filenum (filename, num);
ecb4347a
DJ
797
798 return filename;
fac0d250
RH
799}
800
68d20676
NC
801/* Calls dwarf2_directive_filename, but discards its result.
802 Used in pseudo-op tables where the function result is ignored. */
803
804void
805dwarf2_directive_file (int dummy ATTRIBUTE_UNUSED)
806{
807 (void) dwarf2_directive_filename ();
808}
809
220e750f 810void
a2e22468 811dwarf2_directive_loc (int dummy ATTRIBUTE_UNUSED)
220e750f 812{
ecea7679
RH
813 offsetT filenum, line;
814
851feff8
DJ
815 /* If we see two .loc directives in a row, force the first one to be
816 output now. */
7cadeb2c 817 if (dwarf2_loc_directive_seen)
6a50d470 818 dwarf2_emit_insn (0);
851feff8 819
ecea7679
RH
820 filenum = get_absolute_expression ();
821 SKIP_WHITESPACE ();
822 line = get_absolute_expression ();
823
824 if (filenum < 1)
825 {
826 as_bad (_("file number less than one"));
827 return;
828 }
829 if (filenum >= (int) files_in_use || files[filenum].filename == 0)
830 {
831 as_bad (_("unassigned file number %ld"), (long) filenum);
832 return;
833 }
834
835 current.filenum = filenum;
836 current.line = line;
92846e72 837 current.discriminator = 0;
ecea7679
RH
838
839#ifndef NO_LISTING
840 if (listing)
841 {
842 if (files[filenum].dir)
843 {
844 size_t dir_len = strlen (dirs[files[filenum].dir]);
845 size_t file_len = strlen (files[filenum].filename);
add39d23 846 char *cp = XNEWVEC (char, dir_len + 1 + file_len + 1);
ecea7679
RH
847
848 memcpy (cp, dirs[files[filenum].dir], dir_len);
56487c55 849 INSERT_DIR_SEPARATOR (cp, dir_len);
ecea7679
RH
850 memcpy (cp + dir_len + 1, files[filenum].filename, file_len);
851 cp[dir_len + file_len + 1] = '\0';
852 listing_source_file (cp);
e1fa0163 853 free (cp);
ecea7679
RH
854 }
855 else
856 listing_source_file (files[filenum].filename);
857 listing_source_line (line);
858 }
859#endif
860
220e750f 861 SKIP_WHITESPACE ();
ecea7679
RH
862 if (ISDIGIT (*input_line_pointer))
863 {
864 current.column = get_absolute_expression ();
865 SKIP_WHITESPACE ();
866 }
867
868 while (ISALPHA (*input_line_pointer))
220e750f 869 {
bd0eb99b
RH
870 char *p, c;
871 offsetT value;
872
d02603dc 873 c = get_symbol_name (& p);
bd0eb99b
RH
874
875 if (strcmp (p, "basic_block") == 0)
876 {
877 current.flags |= DWARF2_FLAG_BASIC_BLOCK;
878 *input_line_pointer = c;
879 }
880 else if (strcmp (p, "prologue_end") == 0)
881 {
882 current.flags |= DWARF2_FLAG_PROLOGUE_END;
883 *input_line_pointer = c;
884 }
885 else if (strcmp (p, "epilogue_begin") == 0)
886 {
887 current.flags |= DWARF2_FLAG_EPILOGUE_BEGIN;
888 *input_line_pointer = c;
889 }
890 else if (strcmp (p, "is_stmt") == 0)
891 {
d02603dc 892 (void) restore_line_pointer (c);
bd0eb99b
RH
893 value = get_absolute_expression ();
894 if (value == 0)
895 current.flags &= ~DWARF2_FLAG_IS_STMT;
896 else if (value == 1)
897 current.flags |= DWARF2_FLAG_IS_STMT;
898 else
ecea7679
RH
899 {
900 as_bad (_("is_stmt value not 0 or 1"));
901 return;
902 }
bd0eb99b
RH
903 }
904 else if (strcmp (p, "isa") == 0)
905 {
d02603dc 906 (void) restore_line_pointer (c);
bd0eb99b 907 value = get_absolute_expression ();
ecea7679 908 if (value >= 0)
bd0eb99b 909 current.isa = value;
ecea7679
RH
910 else
911 {
912 as_bad (_("isa number less than zero"));
913 return;
914 }
bd0eb99b 915 }
92846e72
CC
916 else if (strcmp (p, "discriminator") == 0)
917 {
d02603dc 918 (void) restore_line_pointer (c);
92846e72
CC
919 value = get_absolute_expression ();
920 if (value >= 0)
921 current.discriminator = value;
922 else
923 {
924 as_bad (_("discriminator less than zero"));
925 return;
926 }
927 }
ba8826a8
AO
928 else if (strcmp (p, "view") == 0)
929 {
930 symbolS *sym;
931
932 (void) restore_line_pointer (c);
933 SKIP_WHITESPACE ();
934
935 if (ISDIGIT (*input_line_pointer)
936 || *input_line_pointer == '-')
937 {
938 bfd_boolean force_reset = *input_line_pointer == '-';
939
940 value = get_absolute_expression ();
941 if (value != 0)
942 {
943 as_bad (_("numeric view can only be asserted to zero"));
944 return;
945 }
946 if (force_reset && force_reset_view)
947 sym = force_reset_view;
948 else
949 {
950 sym = symbol_temp_new (absolute_section, value,
951 &zero_address_frag);
952 if (force_reset)
953 force_reset_view = sym;
954 }
955 }
956 else
957 {
958 char *name = read_symbol_name ();
959
960 if (!name)
961 return;
962 sym = symbol_find_or_make (name);
963 if (S_IS_DEFINED (sym))
964 {
965 if (!S_CAN_BE_REDEFINED (sym))
966 as_bad (_("symbol `%s' is already defined"), name);
967 else
968 sym = symbol_clone (sym, 1);
969 S_SET_SEGMENT (sym, undefined_section);
970 S_SET_VALUE (sym, 0);
971 symbol_set_frag (sym, &zero_address_frag);
972 }
973 }
974 current.view = sym;
975 }
bd0eb99b
RH
976 else
977 {
ecea7679 978 as_bad (_("unknown .loc sub-directive `%s'"), p);
d02603dc 979 (void) restore_line_pointer (c);
bd0eb99b
RH
980 return;
981 }
982
d02603dc 983 SKIP_WHITESPACE_AFTER_NAME ();
bd0eb99b
RH
984 }
985
986 demand_empty_rest_of_line ();
1eee4adc 987 dwarf2_loc_directive_seen = TRUE;
7cadeb2c 988 debug_type = DEBUG_NONE;
ba8826a8
AO
989
990 /* If we were given a view id, emit the row right away. */
991 if (current.view)
992 dwarf2_emit_insn (0);
220e750f 993}
07a53e5c
RH
994
995void
996dwarf2_directive_loc_mark_labels (int dummy ATTRIBUTE_UNUSED)
997{
998 offsetT value = get_absolute_expression ();
999
1000 if (value != 0 && value != 1)
1001 {
1002 as_bad (_("expected 0 or 1"));
1003 ignore_rest_of_line ();
1004 }
1005 else
1006 {
1007 dwarf2_loc_mark_labels = value != 0;
1008 demand_empty_rest_of_line ();
1009 }
1010}
220e750f
RH
1011\f
1012static struct frag *
a2e22468 1013first_frag_for_seg (segT seg)
220e750f 1014{
c9049d30 1015 return seg_info (seg)->frchainP->frch_root;
220e750f
RH
1016}
1017
1018static struct frag *
a2e22468 1019last_frag_for_seg (segT seg)
220e750f 1020{
c9049d30 1021 frchainS *f = seg_info (seg)->frchainP;
220e750f 1022
c9049d30
AM
1023 while (f->frch_next != NULL)
1024 f = f->frch_next;
220e750f 1025
c9049d30 1026 return f->frch_last;
220e750f
RH
1027}
1028\f
1029/* Emit a single byte into the current segment. */
1030
1031static inline void
a2e22468 1032out_byte (int byte)
220e750f
RH
1033{
1034 FRAG_APPEND_1_CHAR (byte);
1035}
1036
1037/* Emit a statement program opcode into the current segment. */
1038
1039static inline void
a2e22468 1040out_opcode (int opc)
220e750f
RH
1041{
1042 out_byte (opc);
1043}
1044
1045/* Emit a two-byte word into the current segment. */
1046
1047static inline void
a2e22468 1048out_two (int data)
220e750f
RH
1049{
1050 md_number_to_chars (frag_more (2), data, 2);
1051}
1052
1053/* Emit a four byte word into the current segment. */
1054
1055static inline void
a2e22468 1056out_four (int data)
220e750f
RH
1057{
1058 md_number_to_chars (frag_more (4), data, 4);
1059}
1060
1061/* Emit an unsigned "little-endian base 128" number. */
1062
fac0d250 1063static void
a2e22468 1064out_uleb128 (addressT value)
220e750f
RH
1065{
1066 output_leb128 (frag_more (sizeof_leb128 (value, 0)), value, 0);
1067}
1068
92846e72
CC
1069/* Emit a signed "little-endian base 128" number. */
1070
1071static void
1072out_leb128 (addressT value)
1073{
1074 output_leb128 (frag_more (sizeof_leb128 (value, 1)), value, 1);
1075}
1076
220e750f
RH
1077/* Emit a tuple for .debug_abbrev. */
1078
1079static inline void
a2e22468 1080out_abbrev (int name, int form)
fac0d250 1081{
220e750f
RH
1082 out_uleb128 (name);
1083 out_uleb128 (form);
1084}
fac0d250 1085
220e750f 1086/* Get the size of a fragment. */
fac0d250 1087
220e750f 1088static offsetT
c9049d30 1089get_frag_fix (fragS *frag, segT seg)
220e750f
RH
1090{
1091 frchainS *fr;
1092
1093 if (frag->fr_next)
1094 return frag->fr_fix;
1095
1096 /* If a fragment is the last in the chain, special measures must be
1097 taken to find its size before relaxation, since it may be pending
1098 on some subsegment chain. */
c9049d30 1099 for (fr = seg_info (seg)->frchainP; fr; fr = fr->frch_next)
220e750f 1100 if (fr->frch_last == frag)
c5c0a210 1101 return (char *) obstack_next_free (&fr->frch_obstack) - frag->fr_literal;
220e750f
RH
1102
1103 abort ();
1104}
fac0d250 1105
220e750f 1106/* Set an absolute address (may result in a relocation entry). */
fac0d250 1107
220e750f 1108static void
07a53e5c 1109out_set_addr (symbolS *sym)
220e750f 1110{
91d6fa6a 1111 expressionS exp;
9e3af0e7 1112
031e3350 1113 memset (&exp, 0, sizeof exp);
fac0d250 1114 out_opcode (DW_LNS_extended_op);
220e750f 1115 out_uleb128 (sizeof_address + 1);
fac0d250
RH
1116
1117 out_opcode (DW_LNE_set_address);
91d6fa6a
NC
1118 exp.X_op = O_symbol;
1119 exp.X_add_symbol = sym;
1120 exp.X_add_number = 0;
1121 emit_expr (&exp, sizeof_address);
fac0d250
RH
1122}
1123
a2e22468 1124static void scale_addr_delta (addressT *);
c8970b4b 1125
a3b75434 1126static void
d7342424 1127scale_addr_delta (addressT *addr_delta)
a3b75434
DD
1128{
1129 static int printed_this = 0;
8fbf7334 1130 if (DWARF2_LINE_MIN_INSN_LENGTH > 1)
a3b75434 1131 {
8fbf7334
JL
1132 if (*addr_delta % DWARF2_LINE_MIN_INSN_LENGTH != 0 && !printed_this)
1133 {
1134 as_bad("unaligned opcodes detected in executable segment");
1135 printed_this = 1;
1136 }
1137 *addr_delta /= DWARF2_LINE_MIN_INSN_LENGTH;
a3b75434 1138 }
a3b75434 1139}
a3b75434 1140
220e750f
RH
1141/* Encode a pair of line and address skips as efficiently as possible.
1142 Note that the line skip is signed, whereas the address skip is unsigned.
353e2c69 1143
220e750f
RH
1144 The following two routines *must* be kept in sync. This is
1145 enforced by making emit_inc_line_addr abort if we do not emit
1146 exactly the expected number of bytes. */
1147
1148static int
a2e22468 1149size_inc_line_addr (int line_delta, addressT addr_delta)
fac0d250 1150{
220e750f
RH
1151 unsigned int tmp, opcode;
1152 int len = 0;
fac0d250 1153
220e750f 1154 /* Scale the address delta by the minimum instruction length. */
a3b75434 1155 scale_addr_delta (&addr_delta);
220e750f
RH
1156
1157 /* INT_MAX is a signal that this is actually a DW_LNE_end_sequence.
1158 We cannot use special opcodes here, since we want the end_sequence
1159 to emit the matrix entry. */
1160 if (line_delta == INT_MAX)
fac0d250 1161 {
220e750f
RH
1162 if (addr_delta == MAX_SPECIAL_ADDR_DELTA)
1163 len = 1;
fac0d250 1164 else
220e750f
RH
1165 len = 1 + sizeof_leb128 (addr_delta, 0);
1166 return len + 3;
fac0d250 1167 }
fac0d250 1168
220e750f
RH
1169 /* Bias the line delta by the base. */
1170 tmp = line_delta - DWARF2_LINE_BASE;
fac0d250 1171
220e750f
RH
1172 /* If the line increment is out of range of a special opcode, we
1173 must encode it with DW_LNS_advance_line. */
1174 if (tmp >= DWARF2_LINE_RANGE)
1175 {
1176 len = 1 + sizeof_leb128 (line_delta, 1);
1177 line_delta = 0;
1178 tmp = 0 - DWARF2_LINE_BASE;
1179 }
fac0d250 1180
220e750f
RH
1181 /* Bias the opcode by the special opcode base. */
1182 tmp += DWARF2_LINE_OPCODE_BASE;
353e2c69 1183
220e750f
RH
1184 /* Avoid overflow when addr_delta is large. */
1185 if (addr_delta < 256 + MAX_SPECIAL_ADDR_DELTA)
1186 {
1187 /* Try using a special opcode. */
1188 opcode = tmp + addr_delta * DWARF2_LINE_RANGE;
1189 if (opcode <= 255)
1190 return len + 1;
1191
1192 /* Try using DW_LNS_const_add_pc followed by special op. */
1193 opcode = tmp + (addr_delta - MAX_SPECIAL_ADDR_DELTA) * DWARF2_LINE_RANGE;
1194 if (opcode <= 255)
1195 return len + 2;
1196 }
1197
1198 /* Otherwise use DW_LNS_advance_pc. */
1199 len += 1 + sizeof_leb128 (addr_delta, 0);
1200
1201 /* DW_LNS_copy or special opcode. */
1202 len += 1;
1203
1204 return len;
1205}
fac0d250 1206
220e750f 1207static void
a2e22468 1208emit_inc_line_addr (int line_delta, addressT addr_delta, char *p, int len)
220e750f
RH
1209{
1210 unsigned int tmp, opcode;
1211 int need_copy = 0;
1212 char *end = p + len;
fac0d250 1213
07a53e5c
RH
1214 /* Line number sequences cannot go backward in addresses. This means
1215 we've incorrectly ordered the statements in the sequence. */
9c2799c2 1216 gas_assert ((offsetT) addr_delta >= 0);
07a53e5c 1217
220e750f 1218 /* Scale the address delta by the minimum instruction length. */
a3b75434
DD
1219 scale_addr_delta (&addr_delta);
1220
220e750f
RH
1221 /* INT_MAX is a signal that this is actually a DW_LNE_end_sequence.
1222 We cannot use special opcodes here, since we want the end_sequence
1223 to emit the matrix entry. */
1224 if (line_delta == INT_MAX)
fac0d250 1225 {
220e750f
RH
1226 if (addr_delta == MAX_SPECIAL_ADDR_DELTA)
1227 *p++ = DW_LNS_const_add_pc;
1228 else
fac0d250 1229 {
220e750f
RH
1230 *p++ = DW_LNS_advance_pc;
1231 p += output_leb128 (p, addr_delta, 0);
fac0d250 1232 }
220e750f
RH
1233
1234 *p++ = DW_LNS_extended_op;
1235 *p++ = 1;
1236 *p++ = DW_LNE_end_sequence;
1237 goto done;
fac0d250
RH
1238 }
1239
220e750f
RH
1240 /* Bias the line delta by the base. */
1241 tmp = line_delta - DWARF2_LINE_BASE;
1242
1243 /* If the line increment is out of range of a special opcode, we
1244 must encode it with DW_LNS_advance_line. */
1245 if (tmp >= DWARF2_LINE_RANGE)
fac0d250 1246 {
220e750f
RH
1247 *p++ = DW_LNS_advance_line;
1248 p += output_leb128 (p, line_delta, 1);
fac0d250 1249
220e750f
RH
1250 line_delta = 0;
1251 tmp = 0 - DWARF2_LINE_BASE;
1252 need_copy = 1;
1253 }
fac0d250 1254
bd0eb99b
RH
1255 /* Prettier, I think, to use DW_LNS_copy instead of a "line +0, addr +0"
1256 special opcode. */
1257 if (line_delta == 0 && addr_delta == 0)
1258 {
1259 *p++ = DW_LNS_copy;
1260 goto done;
1261 }
1262
220e750f
RH
1263 /* Bias the opcode by the special opcode base. */
1264 tmp += DWARF2_LINE_OPCODE_BASE;
fac0d250 1265
220e750f
RH
1266 /* Avoid overflow when addr_delta is large. */
1267 if (addr_delta < 256 + MAX_SPECIAL_ADDR_DELTA)
fac0d250 1268 {
220e750f
RH
1269 /* Try using a special opcode. */
1270 opcode = tmp + addr_delta * DWARF2_LINE_RANGE;
1271 if (opcode <= 255)
1272 {
1273 *p++ = opcode;
1274 goto done;
1275 }
1276
1277 /* Try using DW_LNS_const_add_pc followed by special op. */
1278 opcode = tmp + (addr_delta - MAX_SPECIAL_ADDR_DELTA) * DWARF2_LINE_RANGE;
1279 if (opcode <= 255)
fac0d250 1280 {
220e750f
RH
1281 *p++ = DW_LNS_const_add_pc;
1282 *p++ = opcode;
1283 goto done;
fac0d250
RH
1284 }
1285 }
220e750f
RH
1286
1287 /* Otherwise use DW_LNS_advance_pc. */
1288 *p++ = DW_LNS_advance_pc;
1289 p += output_leb128 (p, addr_delta, 0);
1290
1291 if (need_copy)
1292 *p++ = DW_LNS_copy;
fac0d250 1293 else
220e750f 1294 *p++ = tmp;
fac0d250 1295
220e750f 1296 done:
9c2799c2 1297 gas_assert (p == end);
220e750f 1298}
a8316fe2 1299
220e750f 1300/* Handy routine to combine calls to the above two routines. */
e1c05f12 1301
220e750f 1302static void
a2e22468 1303out_inc_line_addr (int line_delta, addressT addr_delta)
220e750f
RH
1304{
1305 int len = size_inc_line_addr (line_delta, addr_delta);
1306 emit_inc_line_addr (line_delta, addr_delta, frag_more (len), len);
1307}
9de8d8f1 1308
1737851b
BW
1309/* Write out an alternative form of line and address skips using
1310 DW_LNS_fixed_advance_pc opcodes. This uses more space than the default
7ddd14de
BW
1311 line and address information, but it is required if linker relaxation
1312 could change the code offsets. The following two routines *must* be
1313 kept in sync. */
453dc3f0 1314#define ADDR_DELTA_LIMIT 50000
1737851b 1315
7ddd14de
BW
1316static int
1317size_fixed_inc_line_addr (int line_delta, addressT addr_delta)
1737851b 1318{
7ddd14de 1319 int len = 0;
1737851b
BW
1320
1321 /* INT_MAX is a signal that this is actually a DW_LNE_end_sequence. */
7ddd14de
BW
1322 if (line_delta != INT_MAX)
1323 len = 1 + sizeof_leb128 (line_delta, 1);
1324
453dc3f0 1325 if (addr_delta > ADDR_DELTA_LIMIT)
7ddd14de
BW
1326 {
1327 /* DW_LNS_extended_op */
1328 len += 1 + sizeof_leb128 (sizeof_address + 1, 0);
1329 /* DW_LNE_set_address */
1330 len += 1 + sizeof_address;
1331 }
1332 else
1333 /* DW_LNS_fixed_advance_pc */
1334 len += 3;
1335
1737851b 1336 if (line_delta == INT_MAX)
7ddd14de
BW
1337 /* DW_LNS_extended_op + DW_LNE_end_sequence */
1338 len += 3;
1339 else
1340 /* DW_LNS_copy */
1341 len += 1;
1342
1343 return len;
1344}
1345
1346static void
1347emit_fixed_inc_line_addr (int line_delta, addressT addr_delta, fragS *frag,
1348 char *p, int len)
1349{
91d6fa6a 1350 expressionS *pexp;
7ddd14de
BW
1351 char *end = p + len;
1352
1353 /* Line number sequences cannot go backward in addresses. This means
1354 we've incorrectly ordered the statements in the sequence. */
9c2799c2 1355 gas_assert ((offsetT) addr_delta >= 0);
7ddd14de 1356
b40bf0a2
NC
1357 /* Verify that we have kept in sync with size_fixed_inc_line_addr. */
1358 gas_assert (len == size_fixed_inc_line_addr (line_delta, addr_delta));
1359
7ddd14de
BW
1360 /* INT_MAX is a signal that this is actually a DW_LNE_end_sequence. */
1361 if (line_delta != INT_MAX)
1362 {
1363 *p++ = DW_LNS_advance_line;
1364 p += output_leb128 (p, line_delta, 1);
1365 }
1366
91d6fa6a 1367 pexp = symbol_get_value_expression (frag->fr_symbol);
7ddd14de
BW
1368
1369 /* The DW_LNS_fixed_advance_pc opcode has a 2-byte operand so it can
1370 advance the address by at most 64K. Linker relaxation (without
1371 which this function would not be used) could change the operand by
1372 an unknown amount. If the address increment is getting close to
1373 the limit, just reset the address. */
453dc3f0 1374 if (addr_delta > ADDR_DELTA_LIMIT)
1737851b 1375 {
7ddd14de 1376 symbolS *to_sym;
91d6fa6a 1377 expressionS exp;
7ddd14de 1378
031e3350 1379 memset (&exp, 0, sizeof exp);
9f6db0d3 1380 gas_assert (pexp->X_op == O_subtract);
91d6fa6a 1381 to_sym = pexp->X_add_symbol;
7ddd14de
BW
1382
1383 *p++ = DW_LNS_extended_op;
1384 p += output_leb128 (p, sizeof_address + 1, 0);
1385 *p++ = DW_LNE_set_address;
91d6fa6a
NC
1386 exp.X_op = O_symbol;
1387 exp.X_add_symbol = to_sym;
1388 exp.X_add_number = 0;
62ebcb5c 1389 emit_expr_fix (&exp, sizeof_address, frag, p, TC_PARSE_CONS_RETURN_NONE);
7ddd14de
BW
1390 p += sizeof_address;
1391 }
1392 else
1393 {
1394 *p++ = DW_LNS_fixed_advance_pc;
62ebcb5c 1395 emit_expr_fix (pexp, 2, frag, p, TC_PARSE_CONS_RETURN_NONE);
7ddd14de 1396 p += 2;
1737851b
BW
1397 }
1398
7ddd14de
BW
1399 if (line_delta == INT_MAX)
1400 {
1401 *p++ = DW_LNS_extended_op;
1402 *p++ = 1;
1403 *p++ = DW_LNE_end_sequence;
1404 }
1405 else
1406 *p++ = DW_LNS_copy;
1737851b 1407
9c2799c2 1408 gas_assert (p == end);
1737851b
BW
1409}
1410
220e750f
RH
1411/* Generate a variant frag that we can use to relax address/line
1412 increments between fragments of the target segment. */
9e3af0e7 1413
220e750f 1414static void
07a53e5c 1415relax_inc_line_addr (int line_delta, symbolS *to_sym, symbolS *from_sym)
220e750f 1416{
91d6fa6a 1417 expressionS exp;
220e750f 1418 int max_chars;
6576f0b5 1419
031e3350 1420 memset (&exp, 0, sizeof exp);
91d6fa6a
NC
1421 exp.X_op = O_subtract;
1422 exp.X_add_symbol = to_sym;
1423 exp.X_op_symbol = from_sym;
1424 exp.X_add_number = 0;
fac0d250 1425
220e750f
RH
1426 /* The maximum size of the frag is the line delta with a maximum
1427 sized address delta. */
7ddd14de
BW
1428 if (DWARF2_USE_FIXED_ADVANCE_PC)
1429 max_chars = size_fixed_inc_line_addr (line_delta,
1430 -DWARF2_LINE_MIN_INSN_LENGTH);
1431 else
1432 max_chars = size_inc_line_addr (line_delta, -DWARF2_LINE_MIN_INSN_LENGTH);
fac0d250 1433
220e750f 1434 frag_var (rs_dwarf2dbg, max_chars, max_chars, 1,
91d6fa6a 1435 make_expr_symbol (&exp), line_delta, NULL);
220e750f 1436}
fac0d250 1437
220e750f
RH
1438/* The function estimates the size of a rs_dwarf2dbg variant frag
1439 based on the current values of the symbols. It is called before
1440 the relaxation loop. We set fr_subtype to the expected length. */
fac0d250 1441
220e750f 1442int
a2e22468 1443dwarf2dbg_estimate_size_before_relax (fragS *frag)
220e750f
RH
1444{
1445 offsetT addr_delta;
1446 int size;
fac0d250 1447
6386f3a7 1448 addr_delta = resolve_symbol_value (frag->fr_symbol);
7ddd14de
BW
1449 if (DWARF2_USE_FIXED_ADVANCE_PC)
1450 size = size_fixed_inc_line_addr (frag->fr_offset, addr_delta);
1451 else
1452 size = size_inc_line_addr (frag->fr_offset, addr_delta);
fac0d250 1453
220e750f 1454 frag->fr_subtype = size;
fac0d250 1455
220e750f
RH
1456 return size;
1457}
1458
1459/* This function relaxes a rs_dwarf2dbg variant frag based on the
1460 current values of the symbols. fr_subtype is the current length
1461 of the frag. This returns the change in frag length. */
1462
1463int
a2e22468 1464dwarf2dbg_relax_frag (fragS *frag)
220e750f
RH
1465{
1466 int old_size, new_size;
fac0d250 1467
220e750f
RH
1468 old_size = frag->fr_subtype;
1469 new_size = dwarf2dbg_estimate_size_before_relax (frag);
ee515fb7 1470
220e750f 1471 return new_size - old_size;
fac0d250
RH
1472}
1473
220e750f
RH
1474/* This function converts a rs_dwarf2dbg variant frag into a normal
1475 fill frag. This is called after all relaxation has been done.
1476 fr_subtype will be the desired length of the frag. */
1477
1478void
a2e22468 1479dwarf2dbg_convert_frag (fragS *frag)
fac0d250 1480{
220e750f
RH
1481 offsetT addr_diff;
1482
453dc3f0
NC
1483 if (DWARF2_USE_FIXED_ADVANCE_PC)
1484 {
2b0f3761 1485 /* If linker relaxation is enabled then the distance between the two
453dc3f0
NC
1486 symbols in the frag->fr_symbol expression might change. Hence we
1487 cannot rely upon the value computed by resolve_symbol_value.
1488 Instead we leave the expression unfinalized and allow
1489 emit_fixed_inc_line_addr to create a fixup (which later becomes a
1490 relocation) that will allow the linker to correctly compute the
1491 actual address difference. We have to use a fixed line advance for
1492 this as we cannot (easily) relocate leb128 encoded values. */
1493 int saved_finalize_syms = finalize_syms;
1494
1495 finalize_syms = 0;
1496 addr_diff = resolve_symbol_value (frag->fr_symbol);
1497 finalize_syms = saved_finalize_syms;
1498 }
1499 else
1500 addr_diff = resolve_symbol_value (frag->fr_symbol);
fac0d250 1501
220e750f
RH
1502 /* fr_var carries the max_chars that we created the fragment with.
1503 fr_subtype carries the current expected length. We must, of
1504 course, have allocated enough memory earlier. */
9c2799c2 1505 gas_assert (frag->fr_var >= (int) frag->fr_subtype);
fac0d250 1506
7ddd14de
BW
1507 if (DWARF2_USE_FIXED_ADVANCE_PC)
1508 emit_fixed_inc_line_addr (frag->fr_offset, addr_diff, frag,
1509 frag->fr_literal + frag->fr_fix,
1510 frag->fr_subtype);
1511 else
1512 emit_inc_line_addr (frag->fr_offset, addr_diff,
1513 frag->fr_literal + frag->fr_fix, frag->fr_subtype);
220e750f
RH
1514
1515 frag->fr_fix += frag->fr_subtype;
1516 frag->fr_type = rs_fill;
1517 frag->fr_var = 0;
1518 frag->fr_offset = 0;
1519}
1520
1521/* Generate .debug_line content for the chain of line number entries
1522 beginning at E, for segment SEG. */
1523
1524static void
a2e22468 1525process_entries (segT seg, struct line_entry *e)
220e750f
RH
1526{
1527 unsigned filenum = 1;
1528 unsigned line = 1;
1529 unsigned column = 0;
bd0eb99b
RH
1530 unsigned isa = 0;
1531 unsigned flags = DWARF2_LINE_DEFAULT_IS_STMT ? DWARF2_FLAG_IS_STMT : 0;
07a53e5c
RH
1532 fragS *last_frag = NULL, *frag;
1533 addressT last_frag_ofs = 0, frag_ofs;
fead5cd9 1534 symbolS *last_lab = NULL, *lab;
220e750f
RH
1535 struct line_entry *next;
1536
b40bf0a2
NC
1537 if (flag_dwarf_sections)
1538 {
1539 char * name;
1540 const char * sec_name;
1541
2b0f3761 1542 /* Switch to the relevant sub-section before we start to emit
b40bf0a2
NC
1543 the line number table.
1544
1545 FIXME: These sub-sections do not have a normal Line Number
1546 Program Header, thus strictly speaking they are not valid
1547 DWARF sections. Unfortunately the DWARF standard assumes
1548 a one-to-one relationship between compilation units and
1549 line number tables. Thus we have to have a .debug_line
1550 section, as well as our sub-sections, and we have to ensure
1551 that all of the sub-sections are merged into a proper
1552 .debug_line section before a debugger sees them. */
3739860c 1553
b40bf0a2
NC
1554 sec_name = bfd_get_section_name (stdoutput, seg);
1555 if (strcmp (sec_name, ".text") != 0)
1556 {
29a2809e 1557 name = concat (".debug_line", sec_name, (char *) NULL);
b40bf0a2
NC
1558 subseg_set (subseg_get (name, FALSE), 0);
1559 }
1560 else
1561 /* Don't create a .debug_line.text section -
1562 that is redundant. Instead just switch back to the
1563 normal .debug_line section. */
1564 subseg_set (subseg_get (".debug_line", FALSE), 0);
1565 }
1566
fead5cd9 1567 do
fac0d250 1568 {
07a53e5c 1569 int line_delta;
220e750f
RH
1570
1571 if (filenum != e->loc.filenum)
fac0d250 1572 {
220e750f
RH
1573 filenum = e->loc.filenum;
1574 out_opcode (DW_LNS_set_file);
1575 out_uleb128 (filenum);
220e750f
RH
1576 }
1577
1578 if (column != e->loc.column)
1579 {
1580 column = e->loc.column;
1581 out_opcode (DW_LNS_set_column);
1582 out_uleb128 (column);
220e750f
RH
1583 }
1584
92846e72
CC
1585 if (e->loc.discriminator != 0)
1586 {
1587 out_opcode (DW_LNS_extended_op);
1588 out_leb128 (1 + sizeof_leb128 (e->loc.discriminator, 0));
1589 out_opcode (DW_LNE_set_discriminator);
1590 out_uleb128 (e->loc.discriminator);
1591 }
1592
bd0eb99b
RH
1593 if (isa != e->loc.isa)
1594 {
1595 isa = e->loc.isa;
1596 out_opcode (DW_LNS_set_isa);
1597 out_uleb128 (isa);
bd0eb99b
RH
1598 }
1599
1600 if ((e->loc.flags ^ flags) & DWARF2_FLAG_IS_STMT)
220e750f
RH
1601 {
1602 flags = e->loc.flags;
1603 out_opcode (DW_LNS_negate_stmt);
220e750f
RH
1604 }
1605
bd0eb99b 1606 if (e->loc.flags & DWARF2_FLAG_BASIC_BLOCK)
07a53e5c 1607 out_opcode (DW_LNS_set_basic_block);
220e750f 1608
bd0eb99b 1609 if (e->loc.flags & DWARF2_FLAG_PROLOGUE_END)
07a53e5c 1610 out_opcode (DW_LNS_set_prologue_end);
bd0eb99b
RH
1611
1612 if (e->loc.flags & DWARF2_FLAG_EPILOGUE_BEGIN)
07a53e5c 1613 out_opcode (DW_LNS_set_epilogue_begin);
bd0eb99b 1614
fb81275c
JM
1615 /* Don't try to optimize away redundant entries; gdb wants two
1616 entries for a function where the code starts on the same line as
1617 the {, and there's no way to identify that case here. Trust gcc
1618 to optimize appropriately. */
07a53e5c
RH
1619 line_delta = e->loc.line - line;
1620 lab = e->label;
1621 frag = symbol_get_frag (lab);
1622 frag_ofs = S_GET_VALUE (lab);
220e750f 1623
ba8826a8
AO
1624 if (last_frag == NULL
1625 || (e->loc.view == force_reset_view && force_reset_view
1626 /* If we're going to reset the view, but we know we're
1627 advancing the PC, we don't have to force with
1628 set_address. We know we do when we're at the same
1629 address of the same frag, and we know we might when
1630 we're in the beginning of a frag, and we were at the
1631 end of the previous frag. */
1632 && (frag == last_frag
1633 ? (last_frag_ofs == frag_ofs)
1634 : (frag_ofs == 0
1635 && ((offsetT)last_frag_ofs
1636 >= get_frag_fix (last_frag, seg))))))
220e750f 1637 {
07a53e5c
RH
1638 out_set_addr (lab);
1639 out_inc_line_addr (line_delta, 0);
220e750f 1640 }
7ddd14de 1641 else if (frag == last_frag && ! DWARF2_USE_FIXED_ADVANCE_PC)
07a53e5c
RH
1642 out_inc_line_addr (line_delta, frag_ofs - last_frag_ofs);
1643 else
1644 relax_inc_line_addr (line_delta, lab, last_lab);
1645
1646 line = e->loc.line;
1647 last_lab = lab;
1648 last_frag = frag;
1649 last_frag_ofs = frag_ofs;
220e750f
RH
1650
1651 next = e->next;
1652 free (e);
1653 e = next;
fac0d250 1654 }
fead5cd9 1655 while (e);
353e2c69 1656
220e750f 1657 /* Emit a DW_LNE_end_sequence for the end of the section. */
07a53e5c 1658 frag = last_frag_for_seg (seg);
c9049d30 1659 frag_ofs = get_frag_fix (frag, seg);
7ddd14de 1660 if (frag == last_frag && ! DWARF2_USE_FIXED_ADVANCE_PC)
07a53e5c 1661 out_inc_line_addr (INT_MAX, frag_ofs - last_frag_ofs);
220e750f 1662 else
07a53e5c
RH
1663 {
1664 lab = symbol_temp_new (seg, frag_ofs, frag);
1665 relax_inc_line_addr (INT_MAX, lab, last_lab);
1666 }
fac0d250
RH
1667}
1668
220e750f
RH
1669/* Emit the directory and file tables for .debug_line. */
1670
fac0d250 1671static void
a2e22468 1672out_file_list (void)
fac0d250
RH
1673{
1674 size_t size;
3d6b762c 1675 const char *dir;
fac0d250 1676 char *cp;
220e750f
RH
1677 unsigned int i;
1678
a7ed1ca2
NC
1679 /* Emit directory list. */
1680 for (i = 1; i < dirs_in_use; ++i)
1681 {
3d6b762c
JM
1682 dir = remap_debug_filename (dirs[i]);
1683 size = strlen (dir) + 1;
a7ed1ca2 1684 cp = frag_more (size);
3d6b762c 1685 memcpy (cp, dir, size);
a7ed1ca2
NC
1686 }
1687 /* Terminate it. */
220e750f 1688 out_byte ('\0');
fac0d250 1689
220e750f 1690 for (i = 1; i < files_in_use; ++i)
fac0d250 1691 {
01e1a5bc
NC
1692 const char *fullfilename;
1693
249e3833
RH
1694 if (files[i].filename == NULL)
1695 {
0e389e77 1696 as_bad (_("unassigned file number %ld"), (long) i);
88b4ca40
RH
1697 /* Prevent a crash later, particularly for file 1. */
1698 files[i].filename = "";
249e3833
RH
1699 continue;
1700 }
1701
01e1a5bc
NC
1702 fullfilename = DWARF2_FILE_NAME (files[i].filename,
1703 files[i].dir ? dirs [files [i].dir] : "");
1704 size = strlen (fullfilename) + 1;
fac0d250 1705 cp = frag_more (size);
01e1a5bc 1706 memcpy (cp, fullfilename, size);
fac0d250 1707
220e750f 1708 out_uleb128 (files[i].dir); /* directory number */
01e1a5bc
NC
1709 /* Output the last modification timestamp. */
1710 out_uleb128 (DWARF2_FILE_TIME_NAME (files[i].filename,
1711 files[i].dir ? dirs [files [i].dir] : ""));
1712 /* Output the filesize. */
1713 out_uleb128 (DWARF2_FILE_SIZE_NAME (files[i].filename,
1714 files[i].dir ? dirs [files [i].dir] : ""));
fac0d250 1715 }
353e2c69
KH
1716
1717 /* Terminate filename list. */
1718 out_byte (0);
fac0d250
RH
1719}
1720
413a266c
AM
1721/* Switch to SEC and output a header length field. Return the size of
1722 offsets used in SEC. The caller must set EXPR->X_add_symbol value
d025d5e5
MW
1723 to the end of the section. EXPR->X_add_number will be set to the
1724 negative size of the header. */
413a266c
AM
1725
1726static int
91d6fa6a 1727out_header (asection *sec, expressionS *exp)
413a266c
AM
1728{
1729 symbolS *start_sym;
1730 symbolS *end_sym;
1731
1732 subseg_set (sec, 0);
b57dc16f 1733
0f8f0c57
NC
1734 if (flag_dwarf_sections)
1735 {
1736 /* If we are going to put the start and end symbols in different
1737 sections, then we need real symbols, not just fake, local ones. */
1738 frag_now_fix ();
1739 start_sym = symbol_make (".Ldebug_line_start");
1740 end_sym = symbol_make (".Ldebug_line_end");
1741 symbol_set_value_now (start_sym);
1742 }
1743 else
0f8f0c57
NC
1744 {
1745 start_sym = symbol_temp_new_now ();
1746 end_sym = symbol_temp_make ();
1747 }
413a266c
AM
1748
1749 /* Total length of the information. */
91d6fa6a
NC
1750 exp->X_op = O_subtract;
1751 exp->X_add_symbol = end_sym;
1752 exp->X_op_symbol = start_sym;
413a266c
AM
1753
1754 switch (DWARF2_FORMAT (sec))
1755 {
1756 case dwarf2_format_32bit:
91d6fa6a
NC
1757 exp->X_add_number = -4;
1758 emit_expr (exp, 4);
413a266c
AM
1759 return 4;
1760
1761 case dwarf2_format_64bit:
91d6fa6a 1762 exp->X_add_number = -12;
413a266c 1763 out_four (-1);
91d6fa6a 1764 emit_expr (exp, 8);
413a266c
AM
1765 return 8;
1766
1767 case dwarf2_format_64bit_irix:
91d6fa6a
NC
1768 exp->X_add_number = -8;
1769 emit_expr (exp, 8);
413a266c
AM
1770 return 8;
1771 }
1772
1773 as_fatal (_("internal error: unknown dwarf2 format"));
1774 return 0;
1775}
1776
220e750f
RH
1777/* Emit the collected .debug_line data. */
1778
1779static void
a2e22468 1780out_debug_line (segT line_seg)
220e750f 1781{
91d6fa6a 1782 expressionS exp;
02fe846e 1783 symbolS *prologue_start, *prologue_end;
220e750f
RH
1784 symbolS *line_end;
1785 struct line_seg *s;
14e777e0 1786 int sizeof_offset;
220e750f 1787
031e3350 1788 memset (&exp, 0, sizeof exp);
91d6fa6a
NC
1789 sizeof_offset = out_header (line_seg, &exp);
1790 line_end = exp.X_add_symbol;
220e750f
RH
1791
1792 /* Version. */
88ebb0a1 1793 out_two (DWARF2_LINE_VERSION);
220e750f
RH
1794
1795 /* Length of the prologue following this length. */
02fe846e 1796 prologue_start = symbol_temp_make ();
413a266c 1797 prologue_end = symbol_temp_make ();
02fe846e 1798 exp.X_op = O_subtract;
91d6fa6a 1799 exp.X_add_symbol = prologue_end;
02fe846e
AM
1800 exp.X_op_symbol = prologue_start;
1801 exp.X_add_number = 0;
91d6fa6a 1802 emit_expr (&exp, sizeof_offset);
02fe846e 1803 symbol_set_value_now (prologue_start);
220e750f
RH
1804
1805 /* Parameters of the state machine. */
1806 out_byte (DWARF2_LINE_MIN_INSN_LENGTH);
1807 out_byte (DWARF2_LINE_DEFAULT_IS_STMT);
1808 out_byte (DWARF2_LINE_BASE);
1809 out_byte (DWARF2_LINE_RANGE);
1810 out_byte (DWARF2_LINE_OPCODE_BASE);
1811
1812 /* Standard opcode lengths. */
1813 out_byte (0); /* DW_LNS_copy */
1814 out_byte (1); /* DW_LNS_advance_pc */
1815 out_byte (1); /* DW_LNS_advance_line */
1816 out_byte (1); /* DW_LNS_set_file */
1817 out_byte (1); /* DW_LNS_set_column */
1818 out_byte (0); /* DW_LNS_negate_stmt */
1819 out_byte (0); /* DW_LNS_set_basic_block */
1820 out_byte (0); /* DW_LNS_const_add_pc */
1821 out_byte (1); /* DW_LNS_fixed_advance_pc */
bd0eb99b
RH
1822 out_byte (0); /* DW_LNS_set_prologue_end */
1823 out_byte (0); /* DW_LNS_set_epilogue_begin */
1824 out_byte (1); /* DW_LNS_set_isa */
220e750f
RH
1825
1826 out_file_list ();
1827
b7d6ed97 1828 symbol_set_value_now (prologue_end);
220e750f
RH
1829
1830 /* For each section, emit a statement program. */
ee515fb7 1831 for (s = all_segs; s; s = s->next)
9aec2026
NC
1832 if (SEG_NORMAL (s->seg))
1833 process_entries (s->seg, s->head->head);
1834 else
1835 as_warn ("dwarf line number information for %s ignored",
1836 segment_name (s->seg));
220e750f 1837
b40bf0a2
NC
1838 if (flag_dwarf_sections)
1839 /* We have to switch to the special .debug_line_end section
1840 before emitting the end-of-debug_line symbol. The linker
1841 script arranges for this section to be placed after all the
1842 (potentially garbage collected) .debug_line.<foo> sections.
1843 This section contains the line_end symbol which is used to
1844 compute the size of the linked .debug_line section, as seen
1845 in the DWARF Line Number header. */
1846 subseg_set (subseg_get (".debug_line_end", FALSE), 0);
1847
b7d6ed97 1848 symbol_set_value_now (line_end);
220e750f
RH
1849}
1850
802f5d9e
NC
1851static void
1852out_debug_ranges (segT ranges_seg)
1853{
1854 unsigned int addr_size = sizeof_address;
1855 struct line_seg *s;
91d6fa6a 1856 expressionS exp;
802f5d9e
NC
1857 unsigned int i;
1858
031e3350 1859 memset (&exp, 0, sizeof exp);
802f5d9e
NC
1860 subseg_set (ranges_seg, 0);
1861
1862 /* Base Address Entry. */
7fd3924a 1863 for (i = 0; i < addr_size; i++)
802f5d9e 1864 out_byte (0xff);
7fd3924a 1865 for (i = 0; i < addr_size; i++)
802f5d9e
NC
1866 out_byte (0);
1867
1868 /* Range List Entry. */
1869 for (s = all_segs; s; s = s->next)
1870 {
1871 fragS *frag;
1872 symbolS *beg, *end;
1873
1874 frag = first_frag_for_seg (s->seg);
1875 beg = symbol_temp_new (s->seg, 0, frag);
1876 s->text_start = beg;
1877
1878 frag = last_frag_for_seg (s->seg);
1879 end = symbol_temp_new (s->seg, get_frag_fix (frag, s->seg), frag);
1880 s->text_end = end;
1881
91d6fa6a
NC
1882 exp.X_op = O_symbol;
1883 exp.X_add_symbol = beg;
1884 exp.X_add_number = 0;
1885 emit_expr (&exp, addr_size);
802f5d9e 1886
91d6fa6a
NC
1887 exp.X_op = O_symbol;
1888 exp.X_add_symbol = end;
1889 exp.X_add_number = 0;
1890 emit_expr (&exp, addr_size);
802f5d9e
NC
1891 }
1892
1893 /* End of Range Entry. */
7fd3924a 1894 for (i = 0; i < addr_size; i++)
802f5d9e 1895 out_byte (0);
7fd3924a 1896 for (i = 0; i < addr_size; i++)
802f5d9e
NC
1897 out_byte (0);
1898}
1899
220e750f
RH
1900/* Emit data for .debug_aranges. */
1901
58b5739a 1902static void
a2e22468 1903out_debug_aranges (segT aranges_seg, segT info_seg)
fac0d250 1904{
220e750f 1905 unsigned int addr_size = sizeof_address;
d025d5e5 1906 offsetT size;
220e750f 1907 struct line_seg *s;
91d6fa6a 1908 expressionS exp;
413a266c 1909 symbolS *aranges_end;
220e750f 1910 char *p;
413a266c 1911 int sizeof_offset;
fac0d250 1912
031e3350 1913 memset (&exp, 0, sizeof exp);
91d6fa6a
NC
1914 sizeof_offset = out_header (aranges_seg, &exp);
1915 aranges_end = exp.X_add_symbol;
d025d5e5 1916 size = -exp.X_add_number;
fac0d250 1917
220e750f 1918 /* Version. */
88ebb0a1 1919 out_two (DWARF2_ARANGES_VERSION);
d025d5e5 1920 size += 2;
4dc7ead9 1921
220e750f 1922 /* Offset to .debug_info. */
413a266c 1923 TC_DWARF2_EMIT_OFFSET (section_symbol (info_seg), sizeof_offset);
d025d5e5 1924 size += sizeof_offset;
220e750f
RH
1925
1926 /* Size of an address (offset portion). */
1927 out_byte (addr_size);
d025d5e5 1928 size++;
220e750f
RH
1929
1930 /* Size of a segment descriptor. */
1931 out_byte (0);
d025d5e5 1932 size++;
220e750f
RH
1933
1934 /* Align the header. */
d025d5e5
MW
1935 while ((size++ % (2 * addr_size)) > 0)
1936 out_byte (0);
4dc7ead9 1937
ee515fb7 1938 for (s = all_segs; s; s = s->next)
220e750f
RH
1939 {
1940 fragS *frag;
1941 symbolS *beg, *end;
1942
1943 frag = first_frag_for_seg (s->seg);
b7d6ed97 1944 beg = symbol_temp_new (s->seg, 0, frag);
220e750f
RH
1945 s->text_start = beg;
1946
1947 frag = last_frag_for_seg (s->seg);
c9049d30 1948 end = symbol_temp_new (s->seg, get_frag_fix (frag, s->seg), frag);
220e750f
RH
1949 s->text_end = end;
1950
91d6fa6a
NC
1951 exp.X_op = O_symbol;
1952 exp.X_add_symbol = beg;
1953 exp.X_add_number = 0;
1954 emit_expr (&exp, addr_size);
220e750f 1955
91d6fa6a
NC
1956 exp.X_op = O_subtract;
1957 exp.X_add_symbol = end;
1958 exp.X_op_symbol = beg;
1959 exp.X_add_number = 0;
1960 emit_expr (&exp, addr_size);
220e750f 1961 }
4dc7ead9 1962
220e750f
RH
1963 p = frag_more (2 * addr_size);
1964 md_number_to_chars (p, 0, addr_size);
1965 md_number_to_chars (p + addr_size, 0, addr_size);
413a266c
AM
1966
1967 symbol_set_value_now (aranges_end);
4dc7ead9
RH
1968}
1969
220e750f
RH
1970/* Emit data for .debug_abbrev. Note that this must be kept in
1971 sync with out_debug_info below. */
fac0d250 1972
220e750f 1973static void
413a266c
AM
1974out_debug_abbrev (segT abbrev_seg,
1975 segT info_seg ATTRIBUTE_UNUSED,
1976 segT line_seg ATTRIBUTE_UNUSED)
220e750f
RH
1977{
1978 subseg_set (abbrev_seg, 0);
fac0d250 1979
220e750f
RH
1980 out_uleb128 (1);
1981 out_uleb128 (DW_TAG_compile_unit);
1982 out_byte (DW_CHILDREN_no);
413a266c
AM
1983 if (DWARF2_FORMAT (line_seg) == dwarf2_format_32bit)
1984 out_abbrev (DW_AT_stmt_list, DW_FORM_data4);
1985 else
1986 out_abbrev (DW_AT_stmt_list, DW_FORM_data8);
220e750f 1987 if (all_segs->next == NULL)
4dc7ead9 1988 {
220e750f 1989 out_abbrev (DW_AT_low_pc, DW_FORM_addr);
88ebb0a1
MW
1990 if (DWARF2_VERSION < 4)
1991 out_abbrev (DW_AT_high_pc, DW_FORM_addr);
1992 else
1993 out_abbrev (DW_AT_high_pc, (sizeof_address == 4
1994 ? DW_FORM_data4 : DW_FORM_data8));
220e750f 1995 }
802f5d9e
NC
1996 else
1997 {
413a266c 1998 if (DWARF2_FORMAT (info_seg) == dwarf2_format_32bit)
802f5d9e
NC
1999 out_abbrev (DW_AT_ranges, DW_FORM_data4);
2000 else
2001 out_abbrev (DW_AT_ranges, DW_FORM_data8);
2002 }
49fced12
MW
2003 out_abbrev (DW_AT_name, DW_FORM_strp);
2004 out_abbrev (DW_AT_comp_dir, DW_FORM_strp);
2005 out_abbrev (DW_AT_producer, DW_FORM_strp);
220e750f
RH
2006 out_abbrev (DW_AT_language, DW_FORM_data2);
2007 out_abbrev (0, 0);
a987bfc9
RH
2008
2009 /* Terminate the abbreviations for this compilation unit. */
2010 out_byte (0);
220e750f 2011}
4dc7ead9 2012
220e750f 2013/* Emit a description of this compilation unit for .debug_info. */
4dc7ead9 2014
220e750f 2015static void
49fced12
MW
2016out_debug_info (segT info_seg, segT abbrev_seg, segT line_seg, segT ranges_seg,
2017 symbolS *name_sym, symbolS *comp_dir_sym, symbolS *producer_sym)
220e750f 2018{
91d6fa6a 2019 expressionS exp;
220e750f 2020 symbolS *info_end;
14e777e0 2021 int sizeof_offset;
4dc7ead9 2022
031e3350 2023 memset (&exp, 0, sizeof exp);
91d6fa6a
NC
2024 sizeof_offset = out_header (info_seg, &exp);
2025 info_end = exp.X_add_symbol;
4dc7ead9 2026
220e750f 2027 /* DWARF version. */
fc0eebac 2028 out_two (DWARF2_VERSION);
4dc7ead9 2029
220e750f 2030 /* .debug_abbrev offset */
6174d9c8 2031 TC_DWARF2_EMIT_OFFSET (section_symbol (abbrev_seg), sizeof_offset);
4dc7ead9 2032
220e750f
RH
2033 /* Target address size. */
2034 out_byte (sizeof_address);
fac0d250 2035
220e750f
RH
2036 /* DW_TAG_compile_unit DIE abbrev */
2037 out_uleb128 (1);
fac0d250 2038
220e750f 2039 /* DW_AT_stmt_list */
413a266c
AM
2040 TC_DWARF2_EMIT_OFFSET (section_symbol (line_seg),
2041 (DWARF2_FORMAT (line_seg) == dwarf2_format_32bit
2042 ? 4 : 8));
fac0d250 2043
802f5d9e 2044 /* These two attributes are emitted if all of the code is contiguous. */
220e750f 2045 if (all_segs->next == NULL)
58b5739a 2046 {
220e750f 2047 /* DW_AT_low_pc */
91d6fa6a
NC
2048 exp.X_op = O_symbol;
2049 exp.X_add_symbol = all_segs->text_start;
2050 exp.X_add_number = 0;
2051 emit_expr (&exp, sizeof_address);
220e750f
RH
2052
2053 /* DW_AT_high_pc */
88ebb0a1
MW
2054 if (DWARF2_VERSION < 4)
2055 exp.X_op = O_symbol;
2056 else
2057 {
2058 exp.X_op = O_subtract;
2059 exp.X_op_symbol = all_segs->text_start;
2060 }
91d6fa6a
NC
2061 exp.X_add_symbol = all_segs->text_end;
2062 exp.X_add_number = 0;
2063 emit_expr (&exp, sizeof_address);
58b5739a 2064 }
802f5d9e
NC
2065 else
2066 {
eb1fe072
NC
2067 /* This attribute is emitted if the code is disjoint. */
2068 /* DW_AT_ranges. */
2069 TC_DWARF2_EMIT_OFFSET (section_symbol (ranges_seg), sizeof_offset);
802f5d9e 2070 }
58b5739a 2071
49fced12
MW
2072 /* DW_AT_name, DW_AT_comp_dir and DW_AT_producer. Symbols in .debug_str
2073 setup in out_debug_str below. */
2074 TC_DWARF2_EMIT_OFFSET (name_sym, sizeof_offset);
2075 TC_DWARF2_EMIT_OFFSET (comp_dir_sym, sizeof_offset);
2076 TC_DWARF2_EMIT_OFFSET (producer_sym, sizeof_offset);
2077
2078 /* DW_AT_language. Yes, this is probably not really MIPS, but the
2079 dwarf2 draft has no standard code for assembler. */
2080 out_two (DW_LANG_Mips_Assembler);
2081
2082 symbol_set_value_now (info_end);
2083}
2084
2085/* Emit the three debug strings needed in .debug_str and setup symbols
2086 to them for use in out_debug_info. */
2087static void
2088out_debug_str (segT str_seg, symbolS **name_sym, symbolS **comp_dir_sym,
2089 symbolS **producer_sym)
2090{
2091 char producer[128];
2092 const char *comp_dir;
2093 const char *dirname;
2094 char *p;
2095 int len;
2096
2097 subseg_set (str_seg, 0);
2098
48b91938
RH
2099 /* DW_AT_name. We don't have the actual file name that was present
2100 on the command line, so assume files[1] is the main input file.
2101 We're not supposed to get called unless at least one line number
2102 entry was emitted, so this should always be defined. */
49fced12 2103 *name_sym = symbol_temp_new_now ();
7fd3924a 2104 if (files_in_use == 0)
48b91938 2105 abort ();
a7ed1ca2
NC
2106 if (files[1].dir)
2107 {
3d6b762c
JM
2108 dirname = remap_debug_filename (dirs[files[1].dir]);
2109 len = strlen (dirname);
198f1251
TG
2110#ifdef TE_VMS
2111 /* Already has trailing slash. */
2112 p = frag_more (len);
2113 memcpy (p, dirname, len);
2114#else
a7ed1ca2 2115 p = frag_more (len + 1);
3d6b762c 2116 memcpy (p, dirname, len);
56487c55 2117 INSERT_DIR_SEPARATOR (p, len);
198f1251 2118#endif
a7ed1ca2 2119 }
48b91938
RH
2120 len = strlen (files[1].filename) + 1;
2121 p = frag_more (len);
2122 memcpy (p, files[1].filename, len);
2123
220e750f 2124 /* DW_AT_comp_dir */
49fced12 2125 *comp_dir_sym = symbol_temp_new_now ();
3d6b762c 2126 comp_dir = remap_debug_filename (getpwd ());
220e750f
RH
2127 len = strlen (comp_dir) + 1;
2128 p = frag_more (len);
2129 memcpy (p, comp_dir, len);
fac0d250 2130
220e750f 2131 /* DW_AT_producer */
49fced12 2132 *producer_sym = symbol_temp_new_now ();
220e750f
RH
2133 sprintf (producer, "GNU AS %s", VERSION);
2134 len = strlen (producer) + 1;
2135 p = frag_more (len);
2136 memcpy (p, producer, len);
fac0d250
RH
2137}
2138
1e9cc1c2
NC
2139void
2140dwarf2_init (void)
2141{
1e9cc1c2
NC
2142 last_seg_ptr = &all_segs;
2143}
2144
2145
c6cb92c5
NS
2146/* Finish the dwarf2 debug sections. We emit .debug.line if there
2147 were any .file/.loc directives, or --gdwarf2 was given, or if the
df1c40a7
L
2148 file has a non-empty .debug_info section and an empty .debug_line
2149 section. If we emit .debug_line, and the .debug_info section is
2150 empty, we also emit .debug_info, .debug_aranges and .debug_abbrev.
2151 ALL_SEGS will be non-null if there were any .file/.loc directives,
2152 or --gdwarf2 was given and there were any located instructions
2153 emitted. */
c6cb92c5 2154
fac0d250 2155void
a2e22468 2156dwarf2_finish (void)
fac0d250 2157{
220e750f
RH
2158 segT line_seg;
2159 struct line_seg *s;
c6cb92c5
NS
2160 segT info_seg;
2161 int emit_other_sections = 0;
df1c40a7 2162 int empty_debug_line = 0;
c6cb92c5
NS
2163
2164 info_seg = bfd_get_section_by_name (stdoutput, ".debug_info");
2165 emit_other_sections = info_seg == NULL || !seg_not_empty_p (info_seg);
fac0d250 2166
df1c40a7
L
2167 line_seg = bfd_get_section_by_name (stdoutput, ".debug_line");
2168 empty_debug_line = line_seg == NULL || !seg_not_empty_p (line_seg);
2169
2170 /* We can't construct a new debug_line section if we already have one.
2171 Give an error. */
2172 if (all_segs && !empty_debug_line)
2173 as_fatal ("duplicate .debug_line sections");
2174
2175 if ((!all_segs && emit_other_sections)
2176 || (!emit_other_sections && !empty_debug_line))
2177 /* If there is no line information and no non-empty .debug_info
2178 section, or if there is both a non-empty .debug_info and a non-empty
2179 .debug_line, then we do nothing. */
220e750f 2180 return;
fac0d250 2181
220e750f 2182 /* Calculate the size of an address for the target machine. */
9605f328 2183 sizeof_address = DWARF2_ADDR_SIZE (stdoutput);
fac0d250 2184
220e750f
RH
2185 /* Create and switch to the line number section. */
2186 line_seg = subseg_new (".debug_line", 0);
8a7140c3 2187 bfd_set_section_flags (stdoutput, line_seg, SEC_READONLY | SEC_DEBUGGING);
fac0d250 2188
220e750f 2189 /* For each subsection, chain the debug entries together. */
ee515fb7 2190 for (s = all_segs; s; s = s->next)
fac0d250 2191 {
91d6fa6a
NC
2192 struct line_subseg *lss = s->head;
2193 struct line_entry **ptail = lss->ptail;
220e750f 2194
91d6fa6a 2195 while ((lss = lss->next) != NULL)
220e750f 2196 {
91d6fa6a
NC
2197 *ptail = lss->head;
2198 ptail = lss->ptail;
220e750f 2199 }
fac0d250 2200 }
85a39694 2201
220e750f 2202 out_debug_line (line_seg);
85a39694 2203
c6cb92c5 2204 /* If this is assembler generated line info, and there is no
49fced12
MW
2205 debug_info already, we need .debug_info, .debug_abbrev and
2206 .debug_str sections as well. */
c6cb92c5 2207 if (emit_other_sections)
220e750f
RH
2208 {
2209 segT abbrev_seg;
220e750f 2210 segT aranges_seg;
802f5d9e 2211 segT ranges_seg;
49fced12
MW
2212 segT str_seg;
2213 symbolS *name_sym, *comp_dir_sym, *producer_sym;
4dc7ead9 2214
9c2799c2 2215 gas_assert (all_segs);
7fd3924a 2216
220e750f
RH
2217 info_seg = subseg_new (".debug_info", 0);
2218 abbrev_seg = subseg_new (".debug_abbrev", 0);
2219 aranges_seg = subseg_new (".debug_aranges", 0);
49fced12 2220 str_seg = subseg_new (".debug_str", 0);
ef99799a 2221
8a7140c3
NC
2222 bfd_set_section_flags (stdoutput, info_seg,
2223 SEC_READONLY | SEC_DEBUGGING);
2224 bfd_set_section_flags (stdoutput, abbrev_seg,
2225 SEC_READONLY | SEC_DEBUGGING);
2226 bfd_set_section_flags (stdoutput, aranges_seg,
2227 SEC_READONLY | SEC_DEBUGGING);
49fced12
MW
2228 bfd_set_section_flags (stdoutput, str_seg,
2229 (SEC_READONLY | SEC_DEBUGGING
2230 | SEC_MERGE | SEC_STRINGS));
2231 str_seg->entsize = 1;
ef99799a 2232
ee515fb7 2233 record_alignment (aranges_seg, ffs (2 * sizeof_address) - 1);
ef99799a 2234
802f5d9e
NC
2235 if (all_segs->next == NULL)
2236 ranges_seg = NULL;
2237 else
2238 {
2239 ranges_seg = subseg_new (".debug_ranges", 0);
7fd3924a 2240 bfd_set_section_flags (stdoutput, ranges_seg,
802f5d9e
NC
2241 SEC_READONLY | SEC_DEBUGGING);
2242 record_alignment (ranges_seg, ffs (2 * sizeof_address) - 1);
2243 out_debug_ranges (ranges_seg);
2244 }
2245
220e750f 2246 out_debug_aranges (aranges_seg, info_seg);
413a266c 2247 out_debug_abbrev (abbrev_seg, info_seg, line_seg);
49fced12
MW
2248 out_debug_str (str_seg, &name_sym, &comp_dir_sym, &producer_sym);
2249 out_debug_info (info_seg, abbrev_seg, line_seg, ranges_seg,
2250 name_sym, comp_dir_sym, producer_sym);
220e750f 2251 }
85a39694 2252}
ba8826a8
AO
2253
2254/* Perform any deferred checks pertaining to debug information. */
2255
2256void
2257dwarf2dbg_final_check (void)
2258{
2259 /* Perform reset-view checks. Don't evaluate view_assert_failed
2260 recursively: it could be very deep. It's a chain of adds, with
2261 each chain element pointing to the next in X_add_symbol, and
2262 holding the check value in X_op_symbol. */
2263 while (view_assert_failed)
2264 {
723dfee7 2265 expressionS *exp;
ba8826a8
AO
2266 symbolS *sym;
2267 offsetT failed;
2268
2269 gas_assert (!symbol_resolved_p (view_assert_failed));
2270
723dfee7 2271 exp = symbol_get_value_expression (view_assert_failed);
ba8826a8
AO
2272 sym = view_assert_failed;
2273
2274 /* If view_assert_failed looks like a compound check in the
2275 chain, break it up. */
723dfee7 2276 if (exp->X_op == O_add && exp->X_add_number == 0 && exp->X_unsigned)
ba8826a8 2277 {
723dfee7
HPN
2278 view_assert_failed = exp->X_add_symbol;
2279 sym = exp->X_op_symbol;
ba8826a8
AO
2280 }
2281 else
2282 view_assert_failed = NULL;
2283
2284 failed = resolve_symbol_value (sym);
2285 if (!symbol_resolved_p (sym) || failed)
2286 {
2287 as_bad (_("view number mismatch"));
2288 break;
2289 }
2290 }
2291}
This page took 0.92602 seconds and 4 git commands to generate.