* auxv.c (fprint_target_auxv): Handle extended cache data tags.
[deliverable/binutils-gdb.git] / gas / dwarf2dbg.c
CommitLineData
fac0d250 1/* dwarf2dbg.c - DWARF2 debug support
aa820537 2 Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
2da5c037 3 Free Software Foundation, Inc.
fac0d250
RH
4 Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
5
6 This file is part of GAS, the GNU Assembler.
7
8 GAS is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
ec2655a6 10 the Free Software Foundation; either version 3, or (at your option)
fac0d250
RH
11 any later version.
12
13 GAS is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GAS; see the file COPYING. If not, write to the Free
4b4da160
NC
20 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
21 02110-1301, USA. */
fac0d250 22
89b66cde 23/* Logical line numbers can be controlled by the compiler via the
bd0eb99b 24 following directives:
fac0d250
RH
25
26 .file FILENO "file.c"
ecea7679 27 .loc FILENO LINENO [COLUMN] [basic_block] [prologue_end] \
92846e72
CC
28 [epilogue_begin] [is_stmt VALUE] [isa VALUE] \
29 [discriminator VALUE]
bd0eb99b 30*/
fac0d250 31
fac0d250 32#include "as.h"
bd0eb99b 33#include "safe-ctype.h"
92eb7b32 34
42dbf88c
NC
35#ifdef HAVE_LIMITS_H
36#include <limits.h>
92625c16 37#else
6717891c
NC
38#ifdef HAVE_SYS_PARAM_H
39#include <sys/param.h>
40#endif
6256f9dd 41#ifndef INT_MAX
ee515fb7 42#define INT_MAX (int) (((unsigned) (-1)) >> 1)
42dbf88c 43#endif
b8f080d6 44#endif
42dbf88c 45
70658493 46#include "dwarf2dbg.h"
a7ed1ca2 47#include <filenames.h>
70658493 48
56487c55
NC
49#ifdef HAVE_DOS_BASED_FILE_SYSTEM
50/* We need to decide which character to use as a directory separator.
51 Just because HAVE_DOS_BASED_FILE_SYSTEM is defined, it does not
52 necessarily mean that the backslash character is the one to use.
53 Some environments, eg Cygwin, can support both naming conventions.
54 So we use the heuristic that we only need to use the backslash if
55 the path is an absolute path starting with a DOS style drive
56 selector. eg C: or D: */
57# define INSERT_DIR_SEPARATOR(string, offset) \
58 do \
59 { \
60 if (offset > 1 \
7fd3924a
AM
61 && string[0] != 0 \
62 && string[1] == ':') \
56487c55
NC
63 string [offset] = '\\'; \
64 else \
65 string [offset] = '/'; \
66 } \
67 while (0)
68#else
69# define INSERT_DIR_SEPARATOR(string, offset) string[offset] = '/'
70#endif
71
14e777e0 72#ifndef DWARF2_FORMAT
413a266c 73# define DWARF2_FORMAT(SEC) dwarf2_format_32bit
14e777e0
KB
74#endif
75
9605f328 76#ifndef DWARF2_ADDR_SIZE
e4475e39 77# define DWARF2_ADDR_SIZE(bfd) (bfd_arch_bits_per_address (bfd) / 8)
9605f328
AO
78#endif
79
01e1a5bc
NC
80#ifndef DWARF2_FILE_NAME
81#define DWARF2_FILE_NAME(FILENAME, DIRNAME) FILENAME
82#endif
83
84#ifndef DWARF2_FILE_TIME_NAME
85#define DWARF2_FILE_TIME_NAME(FILENAME,DIRNAME) 0
86#endif
87
88#ifndef DWARF2_FILE_SIZE_NAME
89#define DWARF2_FILE_SIZE_NAME(FILENAME,DIRNAME) 0
90#endif
91
fc0eebac
TG
92#ifndef DWARF2_VERSION
93#define DWARF2_VERSION 2
94#endif
95
88ebb0a1
MW
96/* The .debug_aranges version has been 2 in DWARF version 2, 3 and 4. */
97#ifndef DWARF2_ARANGES_VERSION
98#define DWARF2_ARANGES_VERSION 2
99#endif
100
101/* This implementation output version 2 .debug_line information. */
102#ifndef DWARF2_LINE_VERSION
103#define DWARF2_LINE_VERSION 2
104#endif
105
fac0d250
RH
106#include "subsegs.h"
107
fa8f86ff 108#include "dwarf2.h"
fac0d250 109
fac0d250
RH
110/* Since we can't generate the prolog until the body is complete, we
111 use three different subsegments for .debug_line: one holding the
112 prolog, one for the directory and filename info, and one for the
113 body ("statement program"). */
114#define DL_PROLOG 0
115#define DL_FILES 1
116#define DL_BODY 2
117
1737851b
BW
118/* If linker relaxation might change offsets in the code, the DWARF special
119 opcodes and variable-length operands cannot be used. If this macro is
120 nonzero, use the DW_LNS_fixed_advance_pc opcode instead. */
121#ifndef DWARF2_USE_FIXED_ADVANCE_PC
122# define DWARF2_USE_FIXED_ADVANCE_PC 0
123#endif
124
fac0d250
RH
125/* First special line opcde - leave room for the standard opcodes.
126 Note: If you want to change this, you'll have to update the
127 "standard_opcode_lengths" table that is emitted below in
bd0eb99b
RH
128 out_debug_line(). */
129#define DWARF2_LINE_OPCODE_BASE 13
fac0d250
RH
130
131#ifndef DWARF2_LINE_BASE
132 /* Minimum line offset in a special line info. opcode. This value
133 was chosen to give a reasonable range of values. */
134# define DWARF2_LINE_BASE -5
135#endif
136
137/* Range of line offsets in a special line info. opcode. */
138#ifndef DWARF2_LINE_RANGE
139# define DWARF2_LINE_RANGE 14
140#endif
141
142#ifndef DWARF2_LINE_MIN_INSN_LENGTH
143 /* Define the architecture-dependent minimum instruction length (in
144 bytes). This value should be rather too small than too big. */
4dc7ead9 145# define DWARF2_LINE_MIN_INSN_LENGTH 1
fac0d250
RH
146#endif
147
bd0eb99b 148/* Flag that indicates the initial value of the is_stmt_start flag. */
fac0d250
RH
149#define DWARF2_LINE_DEFAULT_IS_STMT 1
150
cb30237e 151/* Given a special op, return the line skip amount. */
fac0d250
RH
152#define SPECIAL_LINE(op) \
153 (((op) - DWARF2_LINE_OPCODE_BASE)%DWARF2_LINE_RANGE + DWARF2_LINE_BASE)
154
155/* Given a special op, return the address skip amount (in units of
156 DWARF2_LINE_MIN_INSN_LENGTH. */
157#define SPECIAL_ADDR(op) (((op) - DWARF2_LINE_OPCODE_BASE)/DWARF2_LINE_RANGE)
158
cb30237e 159/* The maximum address skip amount that can be encoded with a special op. */
fac0d250
RH
160#define MAX_SPECIAL_ADDR_DELTA SPECIAL_ADDR(255)
161
ee515fb7 162struct line_entry {
220e750f 163 struct line_entry *next;
07a53e5c 164 symbolS *label;
220e750f 165 struct dwarf2_line_info loc;
e6c774b4 166};
fac0d250 167
ee515fb7 168struct line_subseg {
220e750f
RH
169 struct line_subseg *next;
170 subsegT subseg;
171 struct line_entry *head;
172 struct line_entry **ptail;
173};
353e2c69 174
ee515fb7 175struct line_seg {
220e750f
RH
176 struct line_seg *next;
177 segT seg;
178 struct line_subseg *head;
179 symbolS *text_start;
180 symbolS *text_end;
181};
182
183/* Collects data for all line table entries during assembly. */
184static struct line_seg *all_segs;
1e9cc1c2
NC
185/* Hash used to quickly lookup a segment by name, avoiding the need to search
186 through the all_segs list. */
187static struct hash_control *all_segs_hash;
188static struct line_seg **last_seg_ptr;
220e750f 189
ee515fb7 190struct file_entry {
a7ed1ca2 191 const char *filename;
220e750f
RH
192 unsigned int dir;
193};
194
195/* Table of files used by .debug_line. */
196static struct file_entry *files;
197static unsigned int files_in_use;
198static unsigned int files_allocated;
199
a7ed1ca2
NC
200/* Table of directories used by .debug_line. */
201static char **dirs;
202static unsigned int dirs_in_use;
203static unsigned int dirs_allocated;
204
b34976b6 205/* TRUE when we've seen a .loc directive recently. Used to avoid
220e750f 206 doing work when there's nothing to do. */
1eee4adc 207bfd_boolean dwarf2_loc_directive_seen;
220e750f 208
07a53e5c
RH
209/* TRUE when we're supposed to set the basic block mark whenever a
210 label is seen. */
211bfd_boolean dwarf2_loc_mark_labels;
212
220e750f 213/* Current location as indicated by the most recent .loc directive. */
bd0eb99b
RH
214static struct dwarf2_line_info current = {
215 1, 1, 0, 0,
92846e72
CC
216 DWARF2_LINE_DEFAULT_IS_STMT ? DWARF2_FLAG_IS_STMT : 0,
217 0
bd0eb99b 218};
220e750f 219
5045d766
RS
220/* Lines that are at the same location as CURRENT, and which are waiting
221 for a label. */
222static struct line_entry *pending_lines, **pending_lines_tail = &pending_lines;
223
220e750f
RH
224/* The size of an address on the target. */
225static unsigned int sizeof_address;
226\f
a2e22468 227static unsigned int get_filenum (const char *, unsigned int);
413a266c 228
c5c0a210 229#ifndef TC_DWARF2_EMIT_OFFSET
802f5d9e 230#define TC_DWARF2_EMIT_OFFSET generic_dwarf2_emit_offset
c5c0a210 231
6174d9c8
RH
232/* Create an offset to .dwarf2_*. */
233
234static void
a2e22468 235generic_dwarf2_emit_offset (symbolS *symbol, unsigned int size)
6174d9c8 236{
91d6fa6a 237 expressionS exp;
6174d9c8 238
91d6fa6a
NC
239 exp.X_op = O_symbol;
240 exp.X_add_symbol = symbol;
241 exp.X_add_number = 0;
242 emit_expr (&exp, size);
6174d9c8 243}
c5c0a210 244#endif
6174d9c8 245
220e750f
RH
246/* Find or create an entry for SEG+SUBSEG in ALL_SEGS. */
247
248static struct line_subseg *
a2e22468 249get_line_subseg (segT seg, subsegT subseg)
220e750f
RH
250{
251 static segT last_seg;
252 static subsegT last_subseg;
253 static struct line_subseg *last_line_subseg;
254
1e9cc1c2 255 struct line_seg *s;
91d6fa6a 256 struct line_subseg **pss, *lss;
fac0d250 257
220e750f
RH
258 if (seg == last_seg && subseg == last_subseg)
259 return last_line_subseg;
260
1e9cc1c2
NC
261 s = (struct line_seg *) hash_find (all_segs_hash, seg->name);
262 if (s == NULL)
263 {
264 s = (struct line_seg *) xmalloc (sizeof (*s));
265 s->next = NULL;
266 s->seg = seg;
267 s->head = NULL;
268 *last_seg_ptr = s;
269 last_seg_ptr = &s->next;
270 hash_insert (all_segs_hash, seg->name, s);
271 }
272 gas_assert (seg == s->seg);
220e750f 273
91d6fa6a 274 for (pss = &s->head; (lss = *pss) != NULL ; pss = &lss->next)
fac0d250 275 {
91d6fa6a 276 if (lss->subseg == subseg)
ee515fb7 277 goto found_subseg;
91d6fa6a 278 if (lss->subseg > subseg)
220e750f 279 break;
fac0d250 280 }
220e750f 281
91d6fa6a
NC
282 lss = (struct line_subseg *) xmalloc (sizeof (*lss));
283 lss->next = *pss;
284 lss->subseg = subseg;
285 lss->head = NULL;
286 lss->ptail = &lss->head;
287 *pss = lss;
220e750f
RH
288
289 found_subseg:
290 last_seg = seg;
291 last_subseg = subseg;
91d6fa6a 292 last_line_subseg = lss;
220e750f 293
91d6fa6a 294 return lss;
fac0d250
RH
295}
296
5045d766 297/* Push LOC onto the pending lines list. */
07a53e5c
RH
298
299static void
5045d766 300dwarf2_push_line (struct dwarf2_line_info *loc)
07a53e5c 301{
07a53e5c
RH
302 struct line_entry *e;
303
304 e = (struct line_entry *) xmalloc (sizeof (*e));
305 e->next = NULL;
5045d766 306 e->label = NULL;
07a53e5c
RH
307 e->loc = *loc;
308
5045d766
RS
309 *pending_lines_tail = e;
310 pending_lines_tail = &(*pending_lines_tail)->next;
311}
312
313/* Emit all pending line information. LABEL is the label with which the
314 lines should be associated, or null if they should be associated with
315 the current position. */
316
317static void
318dwarf2_flush_pending_lines (symbolS *label)
319{
320 if (pending_lines)
321 {
322 struct line_subseg *lss;
323 struct line_entry *e;
324
325 if (!label)
48b07401 326 label = symbol_temp_new_now ();
5045d766
RS
327
328 for (e = pending_lines; e; e = e->next)
329 e->label = label;
330
331 lss = get_line_subseg (now_seg, now_subseg);
332 *lss->ptail = pending_lines;
333 lss->ptail = pending_lines_tail;
334
335 pending_lines = NULL;
336 pending_lines_tail = &pending_lines;
337 }
07a53e5c
RH
338}
339
436d9e46 340/* Record an entry for LOC occurring at OFS within the current fragment. */
353e2c69 341
220e750f 342void
a2e22468 343dwarf2_gen_line_info (addressT ofs, struct dwarf2_line_info *loc)
fac0d250 344{
1ea5c325
MS
345 static unsigned int line = -1;
346 static unsigned int filenum = -1;
220e750f
RH
347
348 /* Early out for as-yet incomplete location information. */
349 if (loc->filenum == 0 || loc->line == 0)
350 return;
351
ffa554ed
GK
352 /* Don't emit sequences of line symbols for the same line when the
353 symbols apply to assembler code. It is necessary to emit
354 duplicate line symbols when a compiler asks for them, because GDB
355 uses them to determine the end of the prologue. */
d1a6c242 356 if (debug_type == DEBUG_DWARF2
ffa554ed 357 && line == loc->line && filenum == loc->filenum)
1ea5c325
MS
358 return;
359
360 line = loc->line;
361 filenum = loc->filenum;
362
5045d766
RS
363 dwarf2_push_line (loc);
364 dwarf2_flush_pending_lines (symbol_temp_new (now_seg, ofs, frag_now));
220e750f 365}
fac0d250 366
ecea7679
RH
367/* Returns the current source information. If .file directives have
368 been encountered, the info for the corresponding source file is
369 returned. Otherwise, the info for the assembly source file is
370 returned. */
371
220e750f 372void
a2e22468 373dwarf2_where (struct dwarf2_line_info *line)
220e750f
RH
374{
375 if (debug_type == DEBUG_DWARF2)
fac0d250 376 {
220e750f
RH
377 char *filename;
378 as_where (&filename, &line->line);
a7ed1ca2 379 line->filenum = get_filenum (filename, 0);
220e750f 380 line->column = 0;
bd0eb99b 381 line->flags = DWARF2_FLAG_IS_STMT;
ecea7679 382 line->isa = current.isa;
92846e72 383 line->discriminator = current.discriminator;
fac0d250 384 }
220e750f
RH
385 else
386 *line = current;
fac0d250
RH
387}
388
7fd3924a 389/* A hook to allow the target backend to inform the line number state
ecea7679
RH
390 machine of isa changes when assembler debug info is enabled. */
391
392void
393dwarf2_set_isa (unsigned int isa)
394{
395 current.isa = isa;
396}
397
220e750f
RH
398/* Called for each machine instruction, or relatively atomic group of
399 machine instructions (ie built-in macro). The instruction or group
400 is SIZE bytes in length. If dwarf2 line number generation is called
401 for, emit a line statement appropriately. */
353e2c69 402
220e750f 403void
a2e22468 404dwarf2_emit_insn (int size)
fac0d250 405{
220e750f 406 struct dwarf2_line_info loc;
fac0d250 407
7fd3924a 408 if (!dwarf2_loc_directive_seen && debug_type != DEBUG_DWARF2)
220e750f 409 return;
7fd3924a
AM
410
411 dwarf2_where (&loc);
b6675117 412
220e750f 413 dwarf2_gen_line_info (frag_now_fix () - size, &loc);
661ba50f
BW
414 dwarf2_consume_line_info ();
415}
416
417/* Called after the current line information has been either used with
418 dwarf2_gen_line_info or saved with a machine instruction for later use.
419 This resets the state of the line number information to reflect that
420 it has been used. */
421
422void
423dwarf2_consume_line_info (void)
424{
5045d766
RS
425 /* If the consumer has stashed the current location away for later use,
426 assume that any earlier location information should be associated
427 with ".". */
428 dwarf2_flush_pending_lines (NULL);
429
661ba50f
BW
430 /* Unless we generate DWARF2 debugging information for each
431 assembler line, we only emit one line symbol for one LOC. */
7fd3924a 432 dwarf2_loc_directive_seen = FALSE;
bd0eb99b
RH
433
434 current.flags &= ~(DWARF2_FLAG_BASIC_BLOCK
435 | DWARF2_FLAG_PROLOGUE_END
436 | DWARF2_FLAG_EPILOGUE_BEGIN);
92846e72 437 current.discriminator = 0;
220e750f 438}
fac0d250 439
07a53e5c
RH
440/* Called for each (preferably code) label. If dwarf2_loc_mark_labels
441 is enabled, emit a basic block marker. */
442
443void
444dwarf2_emit_label (symbolS *label)
445{
446 struct dwarf2_line_info loc;
447
448 if (!dwarf2_loc_mark_labels)
449 return;
450 if (S_GET_SEGMENT (label) != now_seg)
451 return;
452 if (!(bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE))
453 return;
7fd3924a
AM
454 if (files_in_use == 0 && debug_type != DEBUG_DWARF2)
455 return;
456
457 dwarf2_where (&loc);
07a53e5c
RH
458
459 loc.flags |= DWARF2_FLAG_BASIC_BLOCK;
460
5045d766
RS
461 dwarf2_push_line (&loc);
462 dwarf2_flush_pending_lines (label);
7fd3924a 463 dwarf2_consume_line_info ();
07a53e5c
RH
464}
465
a7ed1ca2
NC
466/* Get a .debug_line file number for FILENAME. If NUM is nonzero,
467 allocate it on that file table slot, otherwise return the first
468 empty one. */
220e750f
RH
469
470static unsigned int
a2e22468 471get_filenum (const char *filename, unsigned int num)
220e750f 472{
a7ed1ca2
NC
473 static unsigned int last_used, last_used_dir_len;
474 const char *file;
475 size_t dir_len;
476 unsigned int i, dir;
220e750f 477
a7ed1ca2
NC
478 if (num == 0 && last_used)
479 {
480 if (! files[last_used].dir
8b6efd89 481 && filename_cmp (filename, files[last_used].filename) == 0)
a7ed1ca2
NC
482 return last_used;
483 if (files[last_used].dir
8b6efd89
KT
484 && filename_ncmp (filename, dirs[files[last_used].dir],
485 last_used_dir_len) == 0
a7ed1ca2 486 && IS_DIR_SEPARATOR (filename [last_used_dir_len])
8b6efd89
KT
487 && filename_cmp (filename + last_used_dir_len + 1,
488 files[last_used].filename) == 0)
a7ed1ca2
NC
489 return last_used;
490 }
220e750f 491
a7ed1ca2
NC
492 file = lbasename (filename);
493 /* Don't make empty string from / or A: from A:/ . */
494#ifdef HAVE_DOS_BASED_FILE_SYSTEM
495 if (file <= filename + 3)
496 file = filename;
497#else
498 if (file == filename + 1)
499 file = filename;
500#endif
501 dir_len = file - filename;
502
503 dir = 0;
504 if (dir_len)
505 {
01e1a5bc 506#ifndef DWARF2_DIR_SHOULD_END_WITH_SEPARATOR
a7ed1ca2 507 --dir_len;
01e1a5bc 508#endif
a7ed1ca2 509 for (dir = 1; dir < dirs_in_use; ++dir)
8b6efd89 510 if (filename_ncmp (filename, dirs[dir], dir_len) == 0
a7ed1ca2
NC
511 && dirs[dir][dir_len] == '\0')
512 break;
513
514 if (dir >= dirs_in_use)
515 {
516 if (dir >= dirs_allocated)
517 {
518 dirs_allocated = dir + 32;
519 dirs = (char **)
520 xrealloc (dirs, (dir + 32) * sizeof (const char *));
521 }
522
1e9cc1c2 523 dirs[dir] = (char *) xmalloc (dir_len + 1);
a7ed1ca2
NC
524 memcpy (dirs[dir], filename, dir_len);
525 dirs[dir][dir_len] = '\0';
526 dirs_in_use = dir + 1;
527 }
528 }
529
530 if (num == 0)
531 {
532 for (i = 1; i < files_in_use; ++i)
533 if (files[i].dir == dir
88b4ca40 534 && files[i].filename
8b6efd89 535 && filename_cmp (file, files[i].filename) == 0)
a7ed1ca2
NC
536 {
537 last_used = i;
538 last_used_dir_len = dir_len;
539 return i;
540 }
541 }
542 else
543 i = num;
220e750f
RH
544
545 if (i >= files_allocated)
fac0d250 546 {
249e3833
RH
547 unsigned int old = files_allocated;
548
220e750f
RH
549 files_allocated = i + 32;
550 files = (struct file_entry *)
ee515fb7 551 xrealloc (files, (i + 32) * sizeof (struct file_entry));
249e3833
RH
552
553 memset (files + old, 0, (i + 32 - old) * sizeof (struct file_entry));
fac0d250
RH
554 }
555
a7ed1ca2
NC
556 files[i].filename = num ? file : xstrdup (file);
557 files[i].dir = dir;
10cd14b4
AM
558 if (files_in_use < i + 1)
559 files_in_use = i + 1;
220e750f 560 last_used = i;
a7ed1ca2 561 last_used_dir_len = dir_len;
220e750f
RH
562
563 return i;
564}
fac0d250 565
ecb4347a
DJ
566/* Handle two forms of .file directive:
567 - Pass .file "source.c" to s_app_file
568 - Handle .file 1 "source.c" by adding an entry to the DWARF-2 file table
220e750f 569
ecb4347a
DJ
570 If an entry is added to the file table, return a pointer to the filename. */
571
572char *
a2e22468 573dwarf2_directive_file (int dummy ATTRIBUTE_UNUSED)
220e750f
RH
574{
575 offsetT num;
e46d99eb 576 char *filename;
220e750f
RH
577 int filename_len;
578
579 /* Continue to accept a bare string and pass it off. */
580 SKIP_WHITESPACE ();
581 if (*input_line_pointer == '"')
fac0d250 582 {
220e750f 583 s_app_file (0);
ecb4347a 584 return NULL;
fac0d250
RH
585 }
586
220e750f
RH
587 num = get_absolute_expression ();
588 filename = demand_copy_C_string (&filename_len);
bd0eb99b
RH
589 if (filename == NULL)
590 return NULL;
220e750f
RH
591 demand_empty_rest_of_line ();
592
249e3833 593 if (num < 1)
fac0d250 594 {
0e389e77 595 as_bad (_("file number less than one"));
ecb4347a 596 return NULL;
fac0d250
RH
597 }
598
7cadeb2c
AM
599 /* A .file directive implies compiler generated debug information is
600 being supplied. Turn off gas generated debug info. */
601 debug_type = DEBUG_NONE;
602
0e1a166b 603 if (num < (int) files_in_use && files[num].filename != 0)
220e750f 604 {
0e389e77 605 as_bad (_("file number %ld already allocated"), (long) num);
ecb4347a 606 return NULL;
249e3833 607 }
220e750f 608
a7ed1ca2 609 get_filenum (filename, num);
ecb4347a
DJ
610
611 return filename;
fac0d250
RH
612}
613
220e750f 614void
a2e22468 615dwarf2_directive_loc (int dummy ATTRIBUTE_UNUSED)
220e750f 616{
ecea7679
RH
617 offsetT filenum, line;
618
851feff8
DJ
619 /* If we see two .loc directives in a row, force the first one to be
620 output now. */
7cadeb2c 621 if (dwarf2_loc_directive_seen)
5045d766 622 dwarf2_push_line (&current);
851feff8 623
ecea7679
RH
624 filenum = get_absolute_expression ();
625 SKIP_WHITESPACE ();
626 line = get_absolute_expression ();
627
628 if (filenum < 1)
629 {
630 as_bad (_("file number less than one"));
631 return;
632 }
633 if (filenum >= (int) files_in_use || files[filenum].filename == 0)
634 {
635 as_bad (_("unassigned file number %ld"), (long) filenum);
636 return;
637 }
638
639 current.filenum = filenum;
640 current.line = line;
92846e72 641 current.discriminator = 0;
ecea7679
RH
642
643#ifndef NO_LISTING
644 if (listing)
645 {
646 if (files[filenum].dir)
647 {
648 size_t dir_len = strlen (dirs[files[filenum].dir]);
649 size_t file_len = strlen (files[filenum].filename);
650 char *cp = (char *) alloca (dir_len + 1 + file_len + 1);
651
652 memcpy (cp, dirs[files[filenum].dir], dir_len);
56487c55 653 INSERT_DIR_SEPARATOR (cp, dir_len);
ecea7679
RH
654 memcpy (cp + dir_len + 1, files[filenum].filename, file_len);
655 cp[dir_len + file_len + 1] = '\0';
656 listing_source_file (cp);
657 }
658 else
659 listing_source_file (files[filenum].filename);
660 listing_source_line (line);
661 }
662#endif
663
220e750f 664 SKIP_WHITESPACE ();
ecea7679
RH
665 if (ISDIGIT (*input_line_pointer))
666 {
667 current.column = get_absolute_expression ();
668 SKIP_WHITESPACE ();
669 }
670
671 while (ISALPHA (*input_line_pointer))
220e750f 672 {
bd0eb99b
RH
673 char *p, c;
674 offsetT value;
675
676 p = input_line_pointer;
677 c = get_symbol_end ();
678
679 if (strcmp (p, "basic_block") == 0)
680 {
681 current.flags |= DWARF2_FLAG_BASIC_BLOCK;
682 *input_line_pointer = c;
683 }
684 else if (strcmp (p, "prologue_end") == 0)
685 {
686 current.flags |= DWARF2_FLAG_PROLOGUE_END;
687 *input_line_pointer = c;
688 }
689 else if (strcmp (p, "epilogue_begin") == 0)
690 {
691 current.flags |= DWARF2_FLAG_EPILOGUE_BEGIN;
692 *input_line_pointer = c;
693 }
694 else if (strcmp (p, "is_stmt") == 0)
695 {
696 *input_line_pointer = c;
697 value = get_absolute_expression ();
698 if (value == 0)
699 current.flags &= ~DWARF2_FLAG_IS_STMT;
700 else if (value == 1)
701 current.flags |= DWARF2_FLAG_IS_STMT;
702 else
ecea7679
RH
703 {
704 as_bad (_("is_stmt value not 0 or 1"));
705 return;
706 }
bd0eb99b
RH
707 }
708 else if (strcmp (p, "isa") == 0)
709 {
7fd3924a 710 *input_line_pointer = c;
bd0eb99b 711 value = get_absolute_expression ();
ecea7679 712 if (value >= 0)
bd0eb99b 713 current.isa = value;
ecea7679
RH
714 else
715 {
716 as_bad (_("isa number less than zero"));
717 return;
718 }
bd0eb99b 719 }
92846e72
CC
720 else if (strcmp (p, "discriminator") == 0)
721 {
722 *input_line_pointer = c;
723 value = get_absolute_expression ();
724 if (value >= 0)
725 current.discriminator = value;
726 else
727 {
728 as_bad (_("discriminator less than zero"));
729 return;
730 }
731 }
bd0eb99b
RH
732 else
733 {
ecea7679 734 as_bad (_("unknown .loc sub-directive `%s'"), p);
7fd3924a 735 *input_line_pointer = c;
bd0eb99b
RH
736 return;
737 }
738
ecea7679 739 SKIP_WHITESPACE ();
bd0eb99b
RH
740 }
741
742 demand_empty_rest_of_line ();
1eee4adc 743 dwarf2_loc_directive_seen = TRUE;
7cadeb2c 744 debug_type = DEBUG_NONE;
220e750f 745}
07a53e5c
RH
746
747void
748dwarf2_directive_loc_mark_labels (int dummy ATTRIBUTE_UNUSED)
749{
750 offsetT value = get_absolute_expression ();
751
752 if (value != 0 && value != 1)
753 {
754 as_bad (_("expected 0 or 1"));
755 ignore_rest_of_line ();
756 }
757 else
758 {
759 dwarf2_loc_mark_labels = value != 0;
760 demand_empty_rest_of_line ();
761 }
762}
220e750f
RH
763\f
764static struct frag *
a2e22468 765first_frag_for_seg (segT seg)
220e750f 766{
c9049d30 767 return seg_info (seg)->frchainP->frch_root;
220e750f
RH
768}
769
770static struct frag *
a2e22468 771last_frag_for_seg (segT seg)
220e750f 772{
c9049d30 773 frchainS *f = seg_info (seg)->frchainP;
220e750f 774
c9049d30
AM
775 while (f->frch_next != NULL)
776 f = f->frch_next;
220e750f 777
c9049d30 778 return f->frch_last;
220e750f
RH
779}
780\f
781/* Emit a single byte into the current segment. */
782
783static inline void
a2e22468 784out_byte (int byte)
220e750f
RH
785{
786 FRAG_APPEND_1_CHAR (byte);
787}
788
789/* Emit a statement program opcode into the current segment. */
790
791static inline void
a2e22468 792out_opcode (int opc)
220e750f
RH
793{
794 out_byte (opc);
795}
796
797/* Emit a two-byte word into the current segment. */
798
799static inline void
a2e22468 800out_two (int data)
220e750f
RH
801{
802 md_number_to_chars (frag_more (2), data, 2);
803}
804
805/* Emit a four byte word into the current segment. */
806
807static inline void
a2e22468 808out_four (int data)
220e750f
RH
809{
810 md_number_to_chars (frag_more (4), data, 4);
811}
812
813/* Emit an unsigned "little-endian base 128" number. */
814
fac0d250 815static void
a2e22468 816out_uleb128 (addressT value)
220e750f
RH
817{
818 output_leb128 (frag_more (sizeof_leb128 (value, 0)), value, 0);
819}
820
92846e72
CC
821/* Emit a signed "little-endian base 128" number. */
822
823static void
824out_leb128 (addressT value)
825{
826 output_leb128 (frag_more (sizeof_leb128 (value, 1)), value, 1);
827}
828
220e750f
RH
829/* Emit a tuple for .debug_abbrev. */
830
831static inline void
a2e22468 832out_abbrev (int name, int form)
fac0d250 833{
220e750f
RH
834 out_uleb128 (name);
835 out_uleb128 (form);
836}
fac0d250 837
220e750f 838/* Get the size of a fragment. */
fac0d250 839
220e750f 840static offsetT
c9049d30 841get_frag_fix (fragS *frag, segT seg)
220e750f
RH
842{
843 frchainS *fr;
844
845 if (frag->fr_next)
846 return frag->fr_fix;
847
848 /* If a fragment is the last in the chain, special measures must be
849 taken to find its size before relaxation, since it may be pending
850 on some subsegment chain. */
c9049d30 851 for (fr = seg_info (seg)->frchainP; fr; fr = fr->frch_next)
220e750f 852 if (fr->frch_last == frag)
c5c0a210 853 return (char *) obstack_next_free (&fr->frch_obstack) - frag->fr_literal;
220e750f
RH
854
855 abort ();
856}
fac0d250 857
220e750f 858/* Set an absolute address (may result in a relocation entry). */
fac0d250 859
220e750f 860static void
07a53e5c 861out_set_addr (symbolS *sym)
220e750f 862{
91d6fa6a 863 expressionS exp;
9e3af0e7 864
fac0d250 865 out_opcode (DW_LNS_extended_op);
220e750f 866 out_uleb128 (sizeof_address + 1);
fac0d250
RH
867
868 out_opcode (DW_LNE_set_address);
91d6fa6a
NC
869 exp.X_op = O_symbol;
870 exp.X_add_symbol = sym;
871 exp.X_add_number = 0;
872 emit_expr (&exp, sizeof_address);
fac0d250
RH
873}
874
a3b75434 875#if DWARF2_LINE_MIN_INSN_LENGTH > 1
a2e22468 876static void scale_addr_delta (addressT *);
c8970b4b 877
a3b75434 878static void
d7342424 879scale_addr_delta (addressT *addr_delta)
a3b75434
DD
880{
881 static int printed_this = 0;
882 if (*addr_delta % DWARF2_LINE_MIN_INSN_LENGTH != 0)
883 {
884 if (!printed_this)
885 as_bad("unaligned opcodes detected in executable segment");
886 printed_this = 1;
887 }
888 *addr_delta /= DWARF2_LINE_MIN_INSN_LENGTH;
889}
890#else
891#define scale_addr_delta(A)
892#endif
893
220e750f
RH
894/* Encode a pair of line and address skips as efficiently as possible.
895 Note that the line skip is signed, whereas the address skip is unsigned.
353e2c69 896
220e750f
RH
897 The following two routines *must* be kept in sync. This is
898 enforced by making emit_inc_line_addr abort if we do not emit
899 exactly the expected number of bytes. */
900
901static int
a2e22468 902size_inc_line_addr (int line_delta, addressT addr_delta)
fac0d250 903{
220e750f
RH
904 unsigned int tmp, opcode;
905 int len = 0;
fac0d250 906
220e750f 907 /* Scale the address delta by the minimum instruction length. */
a3b75434 908 scale_addr_delta (&addr_delta);
220e750f
RH
909
910 /* INT_MAX is a signal that this is actually a DW_LNE_end_sequence.
911 We cannot use special opcodes here, since we want the end_sequence
912 to emit the matrix entry. */
913 if (line_delta == INT_MAX)
fac0d250 914 {
220e750f
RH
915 if (addr_delta == MAX_SPECIAL_ADDR_DELTA)
916 len = 1;
fac0d250 917 else
220e750f
RH
918 len = 1 + sizeof_leb128 (addr_delta, 0);
919 return len + 3;
fac0d250 920 }
fac0d250 921
220e750f
RH
922 /* Bias the line delta by the base. */
923 tmp = line_delta - DWARF2_LINE_BASE;
fac0d250 924
220e750f
RH
925 /* If the line increment is out of range of a special opcode, we
926 must encode it with DW_LNS_advance_line. */
927 if (tmp >= DWARF2_LINE_RANGE)
928 {
929 len = 1 + sizeof_leb128 (line_delta, 1);
930 line_delta = 0;
931 tmp = 0 - DWARF2_LINE_BASE;
932 }
fac0d250 933
220e750f
RH
934 /* Bias the opcode by the special opcode base. */
935 tmp += DWARF2_LINE_OPCODE_BASE;
353e2c69 936
220e750f
RH
937 /* Avoid overflow when addr_delta is large. */
938 if (addr_delta < 256 + MAX_SPECIAL_ADDR_DELTA)
939 {
940 /* Try using a special opcode. */
941 opcode = tmp + addr_delta * DWARF2_LINE_RANGE;
942 if (opcode <= 255)
943 return len + 1;
944
945 /* Try using DW_LNS_const_add_pc followed by special op. */
946 opcode = tmp + (addr_delta - MAX_SPECIAL_ADDR_DELTA) * DWARF2_LINE_RANGE;
947 if (opcode <= 255)
948 return len + 2;
949 }
950
951 /* Otherwise use DW_LNS_advance_pc. */
952 len += 1 + sizeof_leb128 (addr_delta, 0);
953
954 /* DW_LNS_copy or special opcode. */
955 len += 1;
956
957 return len;
958}
fac0d250 959
220e750f 960static void
a2e22468 961emit_inc_line_addr (int line_delta, addressT addr_delta, char *p, int len)
220e750f
RH
962{
963 unsigned int tmp, opcode;
964 int need_copy = 0;
965 char *end = p + len;
fac0d250 966
07a53e5c
RH
967 /* Line number sequences cannot go backward in addresses. This means
968 we've incorrectly ordered the statements in the sequence. */
9c2799c2 969 gas_assert ((offsetT) addr_delta >= 0);
07a53e5c 970
220e750f 971 /* Scale the address delta by the minimum instruction length. */
a3b75434
DD
972 scale_addr_delta (&addr_delta);
973
220e750f
RH
974 /* INT_MAX is a signal that this is actually a DW_LNE_end_sequence.
975 We cannot use special opcodes here, since we want the end_sequence
976 to emit the matrix entry. */
977 if (line_delta == INT_MAX)
fac0d250 978 {
220e750f
RH
979 if (addr_delta == MAX_SPECIAL_ADDR_DELTA)
980 *p++ = DW_LNS_const_add_pc;
981 else
fac0d250 982 {
220e750f
RH
983 *p++ = DW_LNS_advance_pc;
984 p += output_leb128 (p, addr_delta, 0);
fac0d250 985 }
220e750f
RH
986
987 *p++ = DW_LNS_extended_op;
988 *p++ = 1;
989 *p++ = DW_LNE_end_sequence;
990 goto done;
fac0d250
RH
991 }
992
220e750f
RH
993 /* Bias the line delta by the base. */
994 tmp = line_delta - DWARF2_LINE_BASE;
995
996 /* If the line increment is out of range of a special opcode, we
997 must encode it with DW_LNS_advance_line. */
998 if (tmp >= DWARF2_LINE_RANGE)
fac0d250 999 {
220e750f
RH
1000 *p++ = DW_LNS_advance_line;
1001 p += output_leb128 (p, line_delta, 1);
fac0d250 1002
220e750f
RH
1003 line_delta = 0;
1004 tmp = 0 - DWARF2_LINE_BASE;
1005 need_copy = 1;
1006 }
fac0d250 1007
bd0eb99b
RH
1008 /* Prettier, I think, to use DW_LNS_copy instead of a "line +0, addr +0"
1009 special opcode. */
1010 if (line_delta == 0 && addr_delta == 0)
1011 {
1012 *p++ = DW_LNS_copy;
1013 goto done;
1014 }
1015
220e750f
RH
1016 /* Bias the opcode by the special opcode base. */
1017 tmp += DWARF2_LINE_OPCODE_BASE;
fac0d250 1018
220e750f
RH
1019 /* Avoid overflow when addr_delta is large. */
1020 if (addr_delta < 256 + MAX_SPECIAL_ADDR_DELTA)
fac0d250 1021 {
220e750f
RH
1022 /* Try using a special opcode. */
1023 opcode = tmp + addr_delta * DWARF2_LINE_RANGE;
1024 if (opcode <= 255)
1025 {
1026 *p++ = opcode;
1027 goto done;
1028 }
1029
1030 /* Try using DW_LNS_const_add_pc followed by special op. */
1031 opcode = tmp + (addr_delta - MAX_SPECIAL_ADDR_DELTA) * DWARF2_LINE_RANGE;
1032 if (opcode <= 255)
fac0d250 1033 {
220e750f
RH
1034 *p++ = DW_LNS_const_add_pc;
1035 *p++ = opcode;
1036 goto done;
fac0d250
RH
1037 }
1038 }
220e750f
RH
1039
1040 /* Otherwise use DW_LNS_advance_pc. */
1041 *p++ = DW_LNS_advance_pc;
1042 p += output_leb128 (p, addr_delta, 0);
1043
1044 if (need_copy)
1045 *p++ = DW_LNS_copy;
fac0d250 1046 else
220e750f 1047 *p++ = tmp;
fac0d250 1048
220e750f 1049 done:
9c2799c2 1050 gas_assert (p == end);
220e750f 1051}
a8316fe2 1052
220e750f 1053/* Handy routine to combine calls to the above two routines. */
e1c05f12 1054
220e750f 1055static void
a2e22468 1056out_inc_line_addr (int line_delta, addressT addr_delta)
220e750f
RH
1057{
1058 int len = size_inc_line_addr (line_delta, addr_delta);
1059 emit_inc_line_addr (line_delta, addr_delta, frag_more (len), len);
1060}
9de8d8f1 1061
1737851b
BW
1062/* Write out an alternative form of line and address skips using
1063 DW_LNS_fixed_advance_pc opcodes. This uses more space than the default
7ddd14de
BW
1064 line and address information, but it is required if linker relaxation
1065 could change the code offsets. The following two routines *must* be
1066 kept in sync. */
1737851b 1067
7ddd14de
BW
1068static int
1069size_fixed_inc_line_addr (int line_delta, addressT addr_delta)
1737851b 1070{
7ddd14de 1071 int len = 0;
1737851b
BW
1072
1073 /* INT_MAX is a signal that this is actually a DW_LNE_end_sequence. */
7ddd14de
BW
1074 if (line_delta != INT_MAX)
1075 len = 1 + sizeof_leb128 (line_delta, 1);
1076
1077 if (addr_delta > 50000)
1078 {
1079 /* DW_LNS_extended_op */
1080 len += 1 + sizeof_leb128 (sizeof_address + 1, 0);
1081 /* DW_LNE_set_address */
1082 len += 1 + sizeof_address;
1083 }
1084 else
1085 /* DW_LNS_fixed_advance_pc */
1086 len += 3;
1087
1737851b 1088 if (line_delta == INT_MAX)
7ddd14de
BW
1089 /* DW_LNS_extended_op + DW_LNE_end_sequence */
1090 len += 3;
1091 else
1092 /* DW_LNS_copy */
1093 len += 1;
1094
1095 return len;
1096}
1097
1098static void
1099emit_fixed_inc_line_addr (int line_delta, addressT addr_delta, fragS *frag,
1100 char *p, int len)
1101{
91d6fa6a 1102 expressionS *pexp;
7ddd14de
BW
1103 segT line_seg;
1104 char *end = p + len;
1105
1106 /* Line number sequences cannot go backward in addresses. This means
1107 we've incorrectly ordered the statements in the sequence. */
9c2799c2 1108 gas_assert ((offsetT) addr_delta >= 0);
7ddd14de
BW
1109
1110 /* INT_MAX is a signal that this is actually a DW_LNE_end_sequence. */
1111 if (line_delta != INT_MAX)
1112 {
1113 *p++ = DW_LNS_advance_line;
1114 p += output_leb128 (p, line_delta, 1);
1115 }
1116
91d6fa6a 1117 pexp = symbol_get_value_expression (frag->fr_symbol);
7ddd14de
BW
1118 line_seg = subseg_get (".debug_line", 0);
1119
1120 /* The DW_LNS_fixed_advance_pc opcode has a 2-byte operand so it can
1121 advance the address by at most 64K. Linker relaxation (without
1122 which this function would not be used) could change the operand by
1123 an unknown amount. If the address increment is getting close to
1124 the limit, just reset the address. */
1125 if (addr_delta > 50000)
1737851b 1126 {
7ddd14de 1127 symbolS *to_sym;
91d6fa6a 1128 expressionS exp;
7ddd14de 1129
9f6db0d3 1130 gas_assert (pexp->X_op == O_subtract);
91d6fa6a 1131 to_sym = pexp->X_add_symbol;
7ddd14de
BW
1132
1133 *p++ = DW_LNS_extended_op;
1134 p += output_leb128 (p, sizeof_address + 1, 0);
1135 *p++ = DW_LNE_set_address;
91d6fa6a
NC
1136 exp.X_op = O_symbol;
1137 exp.X_add_symbol = to_sym;
1138 exp.X_add_number = 0;
7ddd14de 1139 subseg_change (line_seg, 0);
91d6fa6a 1140 emit_expr_fix (&exp, sizeof_address, frag, p);
7ddd14de
BW
1141 p += sizeof_address;
1142 }
1143 else
1144 {
1145 *p++ = DW_LNS_fixed_advance_pc;
1146 subseg_change (line_seg, 0);
91d6fa6a 1147 emit_expr_fix (pexp, 2, frag, p);
7ddd14de 1148 p += 2;
1737851b
BW
1149 }
1150
7ddd14de
BW
1151 if (line_delta == INT_MAX)
1152 {
1153 *p++ = DW_LNS_extended_op;
1154 *p++ = 1;
1155 *p++ = DW_LNE_end_sequence;
1156 }
1157 else
1158 *p++ = DW_LNS_copy;
1737851b 1159
9c2799c2 1160 gas_assert (p == end);
1737851b
BW
1161}
1162
220e750f
RH
1163/* Generate a variant frag that we can use to relax address/line
1164 increments between fragments of the target segment. */
9e3af0e7 1165
220e750f 1166static void
07a53e5c 1167relax_inc_line_addr (int line_delta, symbolS *to_sym, symbolS *from_sym)
220e750f 1168{
91d6fa6a 1169 expressionS exp;
220e750f 1170 int max_chars;
6576f0b5 1171
91d6fa6a
NC
1172 exp.X_op = O_subtract;
1173 exp.X_add_symbol = to_sym;
1174 exp.X_op_symbol = from_sym;
1175 exp.X_add_number = 0;
fac0d250 1176
220e750f
RH
1177 /* The maximum size of the frag is the line delta with a maximum
1178 sized address delta. */
7ddd14de
BW
1179 if (DWARF2_USE_FIXED_ADVANCE_PC)
1180 max_chars = size_fixed_inc_line_addr (line_delta,
1181 -DWARF2_LINE_MIN_INSN_LENGTH);
1182 else
1183 max_chars = size_inc_line_addr (line_delta, -DWARF2_LINE_MIN_INSN_LENGTH);
fac0d250 1184
220e750f 1185 frag_var (rs_dwarf2dbg, max_chars, max_chars, 1,
91d6fa6a 1186 make_expr_symbol (&exp), line_delta, NULL);
220e750f 1187}
fac0d250 1188
220e750f
RH
1189/* The function estimates the size of a rs_dwarf2dbg variant frag
1190 based on the current values of the symbols. It is called before
1191 the relaxation loop. We set fr_subtype to the expected length. */
fac0d250 1192
220e750f 1193int
a2e22468 1194dwarf2dbg_estimate_size_before_relax (fragS *frag)
220e750f
RH
1195{
1196 offsetT addr_delta;
1197 int size;
fac0d250 1198
6386f3a7 1199 addr_delta = resolve_symbol_value (frag->fr_symbol);
7ddd14de
BW
1200 if (DWARF2_USE_FIXED_ADVANCE_PC)
1201 size = size_fixed_inc_line_addr (frag->fr_offset, addr_delta);
1202 else
1203 size = size_inc_line_addr (frag->fr_offset, addr_delta);
fac0d250 1204
220e750f 1205 frag->fr_subtype = size;
fac0d250 1206
220e750f
RH
1207 return size;
1208}
1209
1210/* This function relaxes a rs_dwarf2dbg variant frag based on the
1211 current values of the symbols. fr_subtype is the current length
1212 of the frag. This returns the change in frag length. */
1213
1214int
a2e22468 1215dwarf2dbg_relax_frag (fragS *frag)
220e750f
RH
1216{
1217 int old_size, new_size;
fac0d250 1218
220e750f
RH
1219 old_size = frag->fr_subtype;
1220 new_size = dwarf2dbg_estimate_size_before_relax (frag);
ee515fb7 1221
220e750f 1222 return new_size - old_size;
fac0d250
RH
1223}
1224
220e750f
RH
1225/* This function converts a rs_dwarf2dbg variant frag into a normal
1226 fill frag. This is called after all relaxation has been done.
1227 fr_subtype will be the desired length of the frag. */
1228
1229void
a2e22468 1230dwarf2dbg_convert_frag (fragS *frag)
fac0d250 1231{
220e750f
RH
1232 offsetT addr_diff;
1233
6386f3a7 1234 addr_diff = resolve_symbol_value (frag->fr_symbol);
fac0d250 1235
220e750f
RH
1236 /* fr_var carries the max_chars that we created the fragment with.
1237 fr_subtype carries the current expected length. We must, of
1238 course, have allocated enough memory earlier. */
9c2799c2 1239 gas_assert (frag->fr_var >= (int) frag->fr_subtype);
fac0d250 1240
7ddd14de
BW
1241 if (DWARF2_USE_FIXED_ADVANCE_PC)
1242 emit_fixed_inc_line_addr (frag->fr_offset, addr_diff, frag,
1243 frag->fr_literal + frag->fr_fix,
1244 frag->fr_subtype);
1245 else
1246 emit_inc_line_addr (frag->fr_offset, addr_diff,
1247 frag->fr_literal + frag->fr_fix, frag->fr_subtype);
220e750f
RH
1248
1249 frag->fr_fix += frag->fr_subtype;
1250 frag->fr_type = rs_fill;
1251 frag->fr_var = 0;
1252 frag->fr_offset = 0;
1253}
1254
1255/* Generate .debug_line content for the chain of line number entries
1256 beginning at E, for segment SEG. */
1257
1258static void
a2e22468 1259process_entries (segT seg, struct line_entry *e)
220e750f
RH
1260{
1261 unsigned filenum = 1;
1262 unsigned line = 1;
1263 unsigned column = 0;
bd0eb99b
RH
1264 unsigned isa = 0;
1265 unsigned flags = DWARF2_LINE_DEFAULT_IS_STMT ? DWARF2_FLAG_IS_STMT : 0;
07a53e5c
RH
1266 fragS *last_frag = NULL, *frag;
1267 addressT last_frag_ofs = 0, frag_ofs;
fead5cd9 1268 symbolS *last_lab = NULL, *lab;
220e750f
RH
1269 struct line_entry *next;
1270
fead5cd9 1271 do
fac0d250 1272 {
07a53e5c 1273 int line_delta;
220e750f
RH
1274
1275 if (filenum != e->loc.filenum)
fac0d250 1276 {
220e750f
RH
1277 filenum = e->loc.filenum;
1278 out_opcode (DW_LNS_set_file);
1279 out_uleb128 (filenum);
220e750f
RH
1280 }
1281
1282 if (column != e->loc.column)
1283 {
1284 column = e->loc.column;
1285 out_opcode (DW_LNS_set_column);
1286 out_uleb128 (column);
220e750f
RH
1287 }
1288
92846e72
CC
1289 if (e->loc.discriminator != 0)
1290 {
1291 out_opcode (DW_LNS_extended_op);
1292 out_leb128 (1 + sizeof_leb128 (e->loc.discriminator, 0));
1293 out_opcode (DW_LNE_set_discriminator);
1294 out_uleb128 (e->loc.discriminator);
1295 }
1296
bd0eb99b
RH
1297 if (isa != e->loc.isa)
1298 {
1299 isa = e->loc.isa;
1300 out_opcode (DW_LNS_set_isa);
1301 out_uleb128 (isa);
bd0eb99b
RH
1302 }
1303
1304 if ((e->loc.flags ^ flags) & DWARF2_FLAG_IS_STMT)
220e750f
RH
1305 {
1306 flags = e->loc.flags;
1307 out_opcode (DW_LNS_negate_stmt);
220e750f
RH
1308 }
1309
bd0eb99b 1310 if (e->loc.flags & DWARF2_FLAG_BASIC_BLOCK)
07a53e5c 1311 out_opcode (DW_LNS_set_basic_block);
220e750f 1312
bd0eb99b 1313 if (e->loc.flags & DWARF2_FLAG_PROLOGUE_END)
07a53e5c 1314 out_opcode (DW_LNS_set_prologue_end);
bd0eb99b
RH
1315
1316 if (e->loc.flags & DWARF2_FLAG_EPILOGUE_BEGIN)
07a53e5c 1317 out_opcode (DW_LNS_set_epilogue_begin);
bd0eb99b 1318
fb81275c
JM
1319 /* Don't try to optimize away redundant entries; gdb wants two
1320 entries for a function where the code starts on the same line as
1321 the {, and there's no way to identify that case here. Trust gcc
1322 to optimize appropriately. */
07a53e5c
RH
1323 line_delta = e->loc.line - line;
1324 lab = e->label;
1325 frag = symbol_get_frag (lab);
1326 frag_ofs = S_GET_VALUE (lab);
220e750f 1327
07a53e5c 1328 if (last_frag == NULL)
220e750f 1329 {
07a53e5c
RH
1330 out_set_addr (lab);
1331 out_inc_line_addr (line_delta, 0);
220e750f 1332 }
7ddd14de 1333 else if (frag == last_frag && ! DWARF2_USE_FIXED_ADVANCE_PC)
07a53e5c
RH
1334 out_inc_line_addr (line_delta, frag_ofs - last_frag_ofs);
1335 else
1336 relax_inc_line_addr (line_delta, lab, last_lab);
1337
1338 line = e->loc.line;
1339 last_lab = lab;
1340 last_frag = frag;
1341 last_frag_ofs = frag_ofs;
220e750f
RH
1342
1343 next = e->next;
1344 free (e);
1345 e = next;
fac0d250 1346 }
fead5cd9 1347 while (e);
353e2c69 1348
220e750f 1349 /* Emit a DW_LNE_end_sequence for the end of the section. */
07a53e5c 1350 frag = last_frag_for_seg (seg);
c9049d30 1351 frag_ofs = get_frag_fix (frag, seg);
7ddd14de 1352 if (frag == last_frag && ! DWARF2_USE_FIXED_ADVANCE_PC)
07a53e5c 1353 out_inc_line_addr (INT_MAX, frag_ofs - last_frag_ofs);
220e750f 1354 else
07a53e5c
RH
1355 {
1356 lab = symbol_temp_new (seg, frag_ofs, frag);
1357 relax_inc_line_addr (INT_MAX, lab, last_lab);
1358 }
fac0d250
RH
1359}
1360
220e750f
RH
1361/* Emit the directory and file tables for .debug_line. */
1362
fac0d250 1363static void
a2e22468 1364out_file_list (void)
fac0d250
RH
1365{
1366 size_t size;
3d6b762c 1367 const char *dir;
fac0d250 1368 char *cp;
220e750f
RH
1369 unsigned int i;
1370
a7ed1ca2
NC
1371 /* Emit directory list. */
1372 for (i = 1; i < dirs_in_use; ++i)
1373 {
3d6b762c
JM
1374 dir = remap_debug_filename (dirs[i]);
1375 size = strlen (dir) + 1;
a7ed1ca2 1376 cp = frag_more (size);
3d6b762c 1377 memcpy (cp, dir, size);
a7ed1ca2
NC
1378 }
1379 /* Terminate it. */
220e750f 1380 out_byte ('\0');
fac0d250 1381
220e750f 1382 for (i = 1; i < files_in_use; ++i)
fac0d250 1383 {
01e1a5bc
NC
1384 const char *fullfilename;
1385
249e3833
RH
1386 if (files[i].filename == NULL)
1387 {
0e389e77 1388 as_bad (_("unassigned file number %ld"), (long) i);
88b4ca40
RH
1389 /* Prevent a crash later, particularly for file 1. */
1390 files[i].filename = "";
249e3833
RH
1391 continue;
1392 }
1393
01e1a5bc
NC
1394 fullfilename = DWARF2_FILE_NAME (files[i].filename,
1395 files[i].dir ? dirs [files [i].dir] : "");
1396 size = strlen (fullfilename) + 1;
fac0d250 1397 cp = frag_more (size);
01e1a5bc 1398 memcpy (cp, fullfilename, size);
fac0d250 1399
220e750f 1400 out_uleb128 (files[i].dir); /* directory number */
01e1a5bc
NC
1401 /* Output the last modification timestamp. */
1402 out_uleb128 (DWARF2_FILE_TIME_NAME (files[i].filename,
1403 files[i].dir ? dirs [files [i].dir] : ""));
1404 /* Output the filesize. */
1405 out_uleb128 (DWARF2_FILE_SIZE_NAME (files[i].filename,
1406 files[i].dir ? dirs [files [i].dir] : ""));
fac0d250 1407 }
353e2c69
KH
1408
1409 /* Terminate filename list. */
1410 out_byte (0);
fac0d250
RH
1411}
1412
413a266c
AM
1413/* Switch to SEC and output a header length field. Return the size of
1414 offsets used in SEC. The caller must set EXPR->X_add_symbol value
1415 to the end of the section. */
1416
1417static int
91d6fa6a 1418out_header (asection *sec, expressionS *exp)
413a266c
AM
1419{
1420 symbolS *start_sym;
1421 symbolS *end_sym;
1422
1423 subseg_set (sec, 0);
1424 start_sym = symbol_temp_new_now ();;
1425 end_sym = symbol_temp_make ();
1426
1427 /* Total length of the information. */
91d6fa6a
NC
1428 exp->X_op = O_subtract;
1429 exp->X_add_symbol = end_sym;
1430 exp->X_op_symbol = start_sym;
413a266c
AM
1431
1432 switch (DWARF2_FORMAT (sec))
1433 {
1434 case dwarf2_format_32bit:
91d6fa6a
NC
1435 exp->X_add_number = -4;
1436 emit_expr (exp, 4);
413a266c
AM
1437 return 4;
1438
1439 case dwarf2_format_64bit:
91d6fa6a 1440 exp->X_add_number = -12;
413a266c 1441 out_four (-1);
91d6fa6a 1442 emit_expr (exp, 8);
413a266c
AM
1443 return 8;
1444
1445 case dwarf2_format_64bit_irix:
91d6fa6a
NC
1446 exp->X_add_number = -8;
1447 emit_expr (exp, 8);
413a266c
AM
1448 return 8;
1449 }
1450
1451 as_fatal (_("internal error: unknown dwarf2 format"));
1452 return 0;
1453}
1454
220e750f
RH
1455/* Emit the collected .debug_line data. */
1456
1457static void
a2e22468 1458out_debug_line (segT line_seg)
220e750f 1459{
91d6fa6a 1460 expressionS exp;
220e750f
RH
1461 symbolS *prologue_end;
1462 symbolS *line_end;
1463 struct line_seg *s;
14e777e0 1464 int sizeof_offset;
220e750f 1465
91d6fa6a
NC
1466 sizeof_offset = out_header (line_seg, &exp);
1467 line_end = exp.X_add_symbol;
220e750f
RH
1468
1469 /* Version. */
88ebb0a1 1470 out_two (DWARF2_LINE_VERSION);
220e750f
RH
1471
1472 /* Length of the prologue following this length. */
413a266c 1473 prologue_end = symbol_temp_make ();
91d6fa6a
NC
1474 exp.X_add_symbol = prologue_end;
1475 exp.X_add_number = - (4 + 2 + 4);
1476 emit_expr (&exp, sizeof_offset);
220e750f
RH
1477
1478 /* Parameters of the state machine. */
1479 out_byte (DWARF2_LINE_MIN_INSN_LENGTH);
1480 out_byte (DWARF2_LINE_DEFAULT_IS_STMT);
1481 out_byte (DWARF2_LINE_BASE);
1482 out_byte (DWARF2_LINE_RANGE);
1483 out_byte (DWARF2_LINE_OPCODE_BASE);
1484
1485 /* Standard opcode lengths. */
1486 out_byte (0); /* DW_LNS_copy */
1487 out_byte (1); /* DW_LNS_advance_pc */
1488 out_byte (1); /* DW_LNS_advance_line */
1489 out_byte (1); /* DW_LNS_set_file */
1490 out_byte (1); /* DW_LNS_set_column */
1491 out_byte (0); /* DW_LNS_negate_stmt */
1492 out_byte (0); /* DW_LNS_set_basic_block */
1493 out_byte (0); /* DW_LNS_const_add_pc */
1494 out_byte (1); /* DW_LNS_fixed_advance_pc */
bd0eb99b
RH
1495 out_byte (0); /* DW_LNS_set_prologue_end */
1496 out_byte (0); /* DW_LNS_set_epilogue_begin */
1497 out_byte (1); /* DW_LNS_set_isa */
220e750f
RH
1498
1499 out_file_list ();
1500
b7d6ed97 1501 symbol_set_value_now (prologue_end);
220e750f
RH
1502
1503 /* For each section, emit a statement program. */
ee515fb7 1504 for (s = all_segs; s; s = s->next)
9aec2026
NC
1505 if (SEG_NORMAL (s->seg))
1506 process_entries (s->seg, s->head->head);
1507 else
1508 as_warn ("dwarf line number information for %s ignored",
1509 segment_name (s->seg));
220e750f 1510
b7d6ed97 1511 symbol_set_value_now (line_end);
220e750f
RH
1512}
1513
802f5d9e
NC
1514static void
1515out_debug_ranges (segT ranges_seg)
1516{
1517 unsigned int addr_size = sizeof_address;
1518 struct line_seg *s;
91d6fa6a 1519 expressionS exp;
802f5d9e
NC
1520 unsigned int i;
1521
1522 subseg_set (ranges_seg, 0);
1523
1524 /* Base Address Entry. */
7fd3924a 1525 for (i = 0; i < addr_size; i++)
802f5d9e 1526 out_byte (0xff);
7fd3924a 1527 for (i = 0; i < addr_size; i++)
802f5d9e
NC
1528 out_byte (0);
1529
1530 /* Range List Entry. */
1531 for (s = all_segs; s; s = s->next)
1532 {
1533 fragS *frag;
1534 symbolS *beg, *end;
1535
1536 frag = first_frag_for_seg (s->seg);
1537 beg = symbol_temp_new (s->seg, 0, frag);
1538 s->text_start = beg;
1539
1540 frag = last_frag_for_seg (s->seg);
1541 end = symbol_temp_new (s->seg, get_frag_fix (frag, s->seg), frag);
1542 s->text_end = end;
1543
91d6fa6a
NC
1544 exp.X_op = O_symbol;
1545 exp.X_add_symbol = beg;
1546 exp.X_add_number = 0;
1547 emit_expr (&exp, addr_size);
802f5d9e 1548
91d6fa6a
NC
1549 exp.X_op = O_symbol;
1550 exp.X_add_symbol = end;
1551 exp.X_add_number = 0;
1552 emit_expr (&exp, addr_size);
802f5d9e
NC
1553 }
1554
1555 /* End of Range Entry. */
7fd3924a 1556 for (i = 0; i < addr_size; i++)
802f5d9e 1557 out_byte (0);
7fd3924a 1558 for (i = 0; i < addr_size; i++)
802f5d9e
NC
1559 out_byte (0);
1560}
1561
220e750f
RH
1562/* Emit data for .debug_aranges. */
1563
58b5739a 1564static void
a2e22468 1565out_debug_aranges (segT aranges_seg, segT info_seg)
fac0d250 1566{
220e750f 1567 unsigned int addr_size = sizeof_address;
220e750f 1568 struct line_seg *s;
91d6fa6a 1569 expressionS exp;
413a266c 1570 symbolS *aranges_end;
220e750f 1571 char *p;
413a266c 1572 int sizeof_offset;
fac0d250 1573
91d6fa6a
NC
1574 sizeof_offset = out_header (aranges_seg, &exp);
1575 aranges_end = exp.X_add_symbol;
fac0d250 1576
220e750f 1577 /* Version. */
88ebb0a1 1578 out_two (DWARF2_ARANGES_VERSION);
4dc7ead9 1579
220e750f 1580 /* Offset to .debug_info. */
413a266c 1581 TC_DWARF2_EMIT_OFFSET (section_symbol (info_seg), sizeof_offset);
220e750f
RH
1582
1583 /* Size of an address (offset portion). */
1584 out_byte (addr_size);
1585
1586 /* Size of a segment descriptor. */
1587 out_byte (0);
1588
1589 /* Align the header. */
413a266c 1590 frag_align (ffs (2 * addr_size) - 1, 0, 0);
4dc7ead9 1591
ee515fb7 1592 for (s = all_segs; s; s = s->next)
220e750f
RH
1593 {
1594 fragS *frag;
1595 symbolS *beg, *end;
1596
1597 frag = first_frag_for_seg (s->seg);
b7d6ed97 1598 beg = symbol_temp_new (s->seg, 0, frag);
220e750f
RH
1599 s->text_start = beg;
1600
1601 frag = last_frag_for_seg (s->seg);
c9049d30 1602 end = symbol_temp_new (s->seg, get_frag_fix (frag, s->seg), frag);
220e750f
RH
1603 s->text_end = end;
1604
91d6fa6a
NC
1605 exp.X_op = O_symbol;
1606 exp.X_add_symbol = beg;
1607 exp.X_add_number = 0;
1608 emit_expr (&exp, addr_size);
220e750f 1609
91d6fa6a
NC
1610 exp.X_op = O_subtract;
1611 exp.X_add_symbol = end;
1612 exp.X_op_symbol = beg;
1613 exp.X_add_number = 0;
1614 emit_expr (&exp, addr_size);
220e750f 1615 }
4dc7ead9 1616
220e750f
RH
1617 p = frag_more (2 * addr_size);
1618 md_number_to_chars (p, 0, addr_size);
1619 md_number_to_chars (p + addr_size, 0, addr_size);
413a266c
AM
1620
1621 symbol_set_value_now (aranges_end);
4dc7ead9
RH
1622}
1623
220e750f
RH
1624/* Emit data for .debug_abbrev. Note that this must be kept in
1625 sync with out_debug_info below. */
fac0d250 1626
220e750f 1627static void
413a266c
AM
1628out_debug_abbrev (segT abbrev_seg,
1629 segT info_seg ATTRIBUTE_UNUSED,
1630 segT line_seg ATTRIBUTE_UNUSED)
220e750f
RH
1631{
1632 subseg_set (abbrev_seg, 0);
fac0d250 1633
220e750f
RH
1634 out_uleb128 (1);
1635 out_uleb128 (DW_TAG_compile_unit);
1636 out_byte (DW_CHILDREN_no);
413a266c
AM
1637 if (DWARF2_FORMAT (line_seg) == dwarf2_format_32bit)
1638 out_abbrev (DW_AT_stmt_list, DW_FORM_data4);
1639 else
1640 out_abbrev (DW_AT_stmt_list, DW_FORM_data8);
220e750f 1641 if (all_segs->next == NULL)
4dc7ead9 1642 {
220e750f 1643 out_abbrev (DW_AT_low_pc, DW_FORM_addr);
88ebb0a1
MW
1644 if (DWARF2_VERSION < 4)
1645 out_abbrev (DW_AT_high_pc, DW_FORM_addr);
1646 else
1647 out_abbrev (DW_AT_high_pc, (sizeof_address == 4
1648 ? DW_FORM_data4 : DW_FORM_data8));
220e750f 1649 }
802f5d9e
NC
1650 else
1651 {
413a266c 1652 if (DWARF2_FORMAT (info_seg) == dwarf2_format_32bit)
802f5d9e
NC
1653 out_abbrev (DW_AT_ranges, DW_FORM_data4);
1654 else
1655 out_abbrev (DW_AT_ranges, DW_FORM_data8);
1656 }
48b91938 1657 out_abbrev (DW_AT_name, DW_FORM_string);
220e750f
RH
1658 out_abbrev (DW_AT_comp_dir, DW_FORM_string);
1659 out_abbrev (DW_AT_producer, DW_FORM_string);
1660 out_abbrev (DW_AT_language, DW_FORM_data2);
1661 out_abbrev (0, 0);
a987bfc9
RH
1662
1663 /* Terminate the abbreviations for this compilation unit. */
1664 out_byte (0);
220e750f 1665}
4dc7ead9 1666
220e750f 1667/* Emit a description of this compilation unit for .debug_info. */
4dc7ead9 1668
220e750f 1669static void
802f5d9e 1670out_debug_info (segT info_seg, segT abbrev_seg, segT line_seg, segT ranges_seg)
220e750f
RH
1671{
1672 char producer[128];
3d6b762c
JM
1673 const char *comp_dir;
1674 const char *dirname;
91d6fa6a 1675 expressionS exp;
220e750f
RH
1676 symbolS *info_end;
1677 char *p;
1678 int len;
14e777e0 1679 int sizeof_offset;
4dc7ead9 1680
91d6fa6a
NC
1681 sizeof_offset = out_header (info_seg, &exp);
1682 info_end = exp.X_add_symbol;
4dc7ead9 1683
220e750f 1684 /* DWARF version. */
fc0eebac 1685 out_two (DWARF2_VERSION);
4dc7ead9 1686
220e750f 1687 /* .debug_abbrev offset */
6174d9c8 1688 TC_DWARF2_EMIT_OFFSET (section_symbol (abbrev_seg), sizeof_offset);
4dc7ead9 1689
220e750f
RH
1690 /* Target address size. */
1691 out_byte (sizeof_address);
fac0d250 1692
220e750f
RH
1693 /* DW_TAG_compile_unit DIE abbrev */
1694 out_uleb128 (1);
fac0d250 1695
220e750f 1696 /* DW_AT_stmt_list */
413a266c
AM
1697 TC_DWARF2_EMIT_OFFSET (section_symbol (line_seg),
1698 (DWARF2_FORMAT (line_seg) == dwarf2_format_32bit
1699 ? 4 : 8));
fac0d250 1700
802f5d9e 1701 /* These two attributes are emitted if all of the code is contiguous. */
220e750f 1702 if (all_segs->next == NULL)
58b5739a 1703 {
220e750f 1704 /* DW_AT_low_pc */
91d6fa6a
NC
1705 exp.X_op = O_symbol;
1706 exp.X_add_symbol = all_segs->text_start;
1707 exp.X_add_number = 0;
1708 emit_expr (&exp, sizeof_address);
220e750f
RH
1709
1710 /* DW_AT_high_pc */
88ebb0a1
MW
1711 if (DWARF2_VERSION < 4)
1712 exp.X_op = O_symbol;
1713 else
1714 {
1715 exp.X_op = O_subtract;
1716 exp.X_op_symbol = all_segs->text_start;
1717 }
91d6fa6a
NC
1718 exp.X_add_symbol = all_segs->text_end;
1719 exp.X_add_number = 0;
1720 emit_expr (&exp, sizeof_address);
58b5739a 1721 }
802f5d9e
NC
1722 else
1723 {
eb1fe072
NC
1724 /* This attribute is emitted if the code is disjoint. */
1725 /* DW_AT_ranges. */
1726 TC_DWARF2_EMIT_OFFSET (section_symbol (ranges_seg), sizeof_offset);
802f5d9e 1727 }
58b5739a 1728
48b91938
RH
1729 /* DW_AT_name. We don't have the actual file name that was present
1730 on the command line, so assume files[1] is the main input file.
1731 We're not supposed to get called unless at least one line number
1732 entry was emitted, so this should always be defined. */
7fd3924a 1733 if (files_in_use == 0)
48b91938 1734 abort ();
a7ed1ca2
NC
1735 if (files[1].dir)
1736 {
3d6b762c
JM
1737 dirname = remap_debug_filename (dirs[files[1].dir]);
1738 len = strlen (dirname);
198f1251
TG
1739#ifdef TE_VMS
1740 /* Already has trailing slash. */
1741 p = frag_more (len);
1742 memcpy (p, dirname, len);
1743#else
a7ed1ca2 1744 p = frag_more (len + 1);
3d6b762c 1745 memcpy (p, dirname, len);
56487c55 1746 INSERT_DIR_SEPARATOR (p, len);
198f1251 1747#endif
a7ed1ca2 1748 }
48b91938
RH
1749 len = strlen (files[1].filename) + 1;
1750 p = frag_more (len);
1751 memcpy (p, files[1].filename, len);
1752
220e750f 1753 /* DW_AT_comp_dir */
3d6b762c 1754 comp_dir = remap_debug_filename (getpwd ());
220e750f
RH
1755 len = strlen (comp_dir) + 1;
1756 p = frag_more (len);
1757 memcpy (p, comp_dir, len);
fac0d250 1758
220e750f
RH
1759 /* DW_AT_producer */
1760 sprintf (producer, "GNU AS %s", VERSION);
1761 len = strlen (producer) + 1;
1762 p = frag_more (len);
1763 memcpy (p, producer, len);
fac0d250 1764
220e750f
RH
1765 /* DW_AT_language. Yes, this is probably not really MIPS, but the
1766 dwarf2 draft has no standard code for assembler. */
1767 out_two (DW_LANG_Mips_Assembler);
1768
b7d6ed97 1769 symbol_set_value_now (info_end);
fac0d250
RH
1770}
1771
1e9cc1c2
NC
1772void
1773dwarf2_init (void)
1774{
1775 all_segs_hash = hash_new ();
1776 last_seg_ptr = &all_segs;
1777}
1778
1779
c6cb92c5
NS
1780/* Finish the dwarf2 debug sections. We emit .debug.line if there
1781 were any .file/.loc directives, or --gdwarf2 was given, or if the
df1c40a7
L
1782 file has a non-empty .debug_info section and an empty .debug_line
1783 section. If we emit .debug_line, and the .debug_info section is
1784 empty, we also emit .debug_info, .debug_aranges and .debug_abbrev.
1785 ALL_SEGS will be non-null if there were any .file/.loc directives,
1786 or --gdwarf2 was given and there were any located instructions
1787 emitted. */
c6cb92c5 1788
fac0d250 1789void
a2e22468 1790dwarf2_finish (void)
fac0d250 1791{
220e750f
RH
1792 segT line_seg;
1793 struct line_seg *s;
c6cb92c5
NS
1794 segT info_seg;
1795 int emit_other_sections = 0;
df1c40a7 1796 int empty_debug_line = 0;
c6cb92c5
NS
1797
1798 info_seg = bfd_get_section_by_name (stdoutput, ".debug_info");
1799 emit_other_sections = info_seg == NULL || !seg_not_empty_p (info_seg);
fac0d250 1800
df1c40a7
L
1801 line_seg = bfd_get_section_by_name (stdoutput, ".debug_line");
1802 empty_debug_line = line_seg == NULL || !seg_not_empty_p (line_seg);
1803
1804 /* We can't construct a new debug_line section if we already have one.
1805 Give an error. */
1806 if (all_segs && !empty_debug_line)
1807 as_fatal ("duplicate .debug_line sections");
1808
1809 if ((!all_segs && emit_other_sections)
1810 || (!emit_other_sections && !empty_debug_line))
1811 /* If there is no line information and no non-empty .debug_info
1812 section, or if there is both a non-empty .debug_info and a non-empty
1813 .debug_line, then we do nothing. */
220e750f 1814 return;
fac0d250 1815
220e750f 1816 /* Calculate the size of an address for the target machine. */
9605f328 1817 sizeof_address = DWARF2_ADDR_SIZE (stdoutput);
fac0d250 1818
220e750f
RH
1819 /* Create and switch to the line number section. */
1820 line_seg = subseg_new (".debug_line", 0);
8a7140c3 1821 bfd_set_section_flags (stdoutput, line_seg, SEC_READONLY | SEC_DEBUGGING);
fac0d250 1822
220e750f 1823 /* For each subsection, chain the debug entries together. */
ee515fb7 1824 for (s = all_segs; s; s = s->next)
fac0d250 1825 {
91d6fa6a
NC
1826 struct line_subseg *lss = s->head;
1827 struct line_entry **ptail = lss->ptail;
220e750f 1828
91d6fa6a 1829 while ((lss = lss->next) != NULL)
220e750f 1830 {
91d6fa6a
NC
1831 *ptail = lss->head;
1832 ptail = lss->ptail;
220e750f 1833 }
fac0d250 1834 }
85a39694 1835
220e750f 1836 out_debug_line (line_seg);
85a39694 1837
c6cb92c5
NS
1838 /* If this is assembler generated line info, and there is no
1839 debug_info already, we need .debug_info and .debug_abbrev
1840 sections as well. */
1841 if (emit_other_sections)
220e750f
RH
1842 {
1843 segT abbrev_seg;
220e750f 1844 segT aranges_seg;
802f5d9e 1845 segT ranges_seg;
4dc7ead9 1846
9c2799c2 1847 gas_assert (all_segs);
7fd3924a 1848
220e750f
RH
1849 info_seg = subseg_new (".debug_info", 0);
1850 abbrev_seg = subseg_new (".debug_abbrev", 0);
1851 aranges_seg = subseg_new (".debug_aranges", 0);
ef99799a 1852
8a7140c3
NC
1853 bfd_set_section_flags (stdoutput, info_seg,
1854 SEC_READONLY | SEC_DEBUGGING);
1855 bfd_set_section_flags (stdoutput, abbrev_seg,
1856 SEC_READONLY | SEC_DEBUGGING);
1857 bfd_set_section_flags (stdoutput, aranges_seg,
1858 SEC_READONLY | SEC_DEBUGGING);
ef99799a 1859
ee515fb7 1860 record_alignment (aranges_seg, ffs (2 * sizeof_address) - 1);
ef99799a 1861
802f5d9e
NC
1862 if (all_segs->next == NULL)
1863 ranges_seg = NULL;
1864 else
1865 {
1866 ranges_seg = subseg_new (".debug_ranges", 0);
7fd3924a 1867 bfd_set_section_flags (stdoutput, ranges_seg,
802f5d9e
NC
1868 SEC_READONLY | SEC_DEBUGGING);
1869 record_alignment (ranges_seg, ffs (2 * sizeof_address) - 1);
1870 out_debug_ranges (ranges_seg);
1871 }
1872
220e750f 1873 out_debug_aranges (aranges_seg, info_seg);
413a266c 1874 out_debug_abbrev (abbrev_seg, info_seg, line_seg);
802f5d9e 1875 out_debug_info (info_seg, abbrev_seg, line_seg, ranges_seg);
220e750f 1876 }
85a39694 1877}
This page took 0.688811 seconds and 4 git commands to generate.