]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gas/dwarf2dbg.c
* dwarf2dbg.c (struct line_entry): Replace frag and frag_ofs
[thirdparty/binutils-gdb.git] / gas / dwarf2dbg.c
CommitLineData
fac0d250 1/* dwarf2dbg.c - DWARF2 debug support
2da5c037
AM
2 Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005
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
10 the Free Software Foundation; either version 2, or (at your option)
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
RH
27 .loc FILENO LINENO [COLUMN] [basic_block] [prologue_end] \
28 [epilogue_begin] [is_stmt VALUE] [isa VALUE]
bd0eb99b 29*/
fac0d250
RH
30
31#include "ansidecl.h"
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
14e777e0 49#ifndef DWARF2_FORMAT
9605f328 50# define DWARF2_FORMAT() dwarf2_format_32bit
14e777e0
KB
51#endif
52
9605f328 53#ifndef DWARF2_ADDR_SIZE
e4475e39 54# define DWARF2_ADDR_SIZE(bfd) (bfd_arch_bits_per_address (bfd) / 8)
9605f328
AO
55#endif
56
fac0d250
RH
57#include "subsegs.h"
58
d9ac5a3b 59#include "elf/dwarf2.h"
fac0d250 60
fac0d250
RH
61/* Since we can't generate the prolog until the body is complete, we
62 use three different subsegments for .debug_line: one holding the
63 prolog, one for the directory and filename info, and one for the
64 body ("statement program"). */
65#define DL_PROLOG 0
66#define DL_FILES 1
67#define DL_BODY 2
68
69/* First special line opcde - leave room for the standard opcodes.
70 Note: If you want to change this, you'll have to update the
71 "standard_opcode_lengths" table that is emitted below in
bd0eb99b
RH
72 out_debug_line(). */
73#define DWARF2_LINE_OPCODE_BASE 13
fac0d250
RH
74
75#ifndef DWARF2_LINE_BASE
76 /* Minimum line offset in a special line info. opcode. This value
77 was chosen to give a reasonable range of values. */
78# define DWARF2_LINE_BASE -5
79#endif
80
81/* Range of line offsets in a special line info. opcode. */
82#ifndef DWARF2_LINE_RANGE
83# define DWARF2_LINE_RANGE 14
84#endif
85
86#ifndef DWARF2_LINE_MIN_INSN_LENGTH
87 /* Define the architecture-dependent minimum instruction length (in
88 bytes). This value should be rather too small than too big. */
4dc7ead9 89# define DWARF2_LINE_MIN_INSN_LENGTH 1
fac0d250
RH
90#endif
91
bd0eb99b 92/* Flag that indicates the initial value of the is_stmt_start flag. */
fac0d250
RH
93#define DWARF2_LINE_DEFAULT_IS_STMT 1
94
cb30237e 95/* Given a special op, return the line skip amount. */
fac0d250
RH
96#define SPECIAL_LINE(op) \
97 (((op) - DWARF2_LINE_OPCODE_BASE)%DWARF2_LINE_RANGE + DWARF2_LINE_BASE)
98
99/* Given a special op, return the address skip amount (in units of
100 DWARF2_LINE_MIN_INSN_LENGTH. */
101#define SPECIAL_ADDR(op) (((op) - DWARF2_LINE_OPCODE_BASE)/DWARF2_LINE_RANGE)
102
cb30237e 103/* The maximum address skip amount that can be encoded with a special op. */
fac0d250
RH
104#define MAX_SPECIAL_ADDR_DELTA SPECIAL_ADDR(255)
105
ee515fb7 106struct line_entry {
220e750f 107 struct line_entry *next;
07a53e5c 108 symbolS *label;
220e750f 109 struct dwarf2_line_info loc;
e6c774b4 110};
fac0d250 111
ee515fb7 112struct line_subseg {
220e750f
RH
113 struct line_subseg *next;
114 subsegT subseg;
115 struct line_entry *head;
116 struct line_entry **ptail;
117};
353e2c69 118
ee515fb7 119struct line_seg {
220e750f
RH
120 struct line_seg *next;
121 segT seg;
122 struct line_subseg *head;
123 symbolS *text_start;
124 symbolS *text_end;
125};
126
127/* Collects data for all line table entries during assembly. */
128static struct line_seg *all_segs;
129
ee515fb7 130struct file_entry {
a7ed1ca2 131 const char *filename;
220e750f
RH
132 unsigned int dir;
133};
134
135/* Table of files used by .debug_line. */
136static struct file_entry *files;
137static unsigned int files_in_use;
138static unsigned int files_allocated;
139
a7ed1ca2
NC
140/* Table of directories used by .debug_line. */
141static char **dirs;
142static unsigned int dirs_in_use;
143static unsigned int dirs_allocated;
144
b34976b6 145/* TRUE when we've seen a .loc directive recently. Used to avoid
220e750f 146 doing work when there's nothing to do. */
b34976b6 147static bfd_boolean loc_directive_seen;
220e750f 148
07a53e5c
RH
149/* TRUE when we're supposed to set the basic block mark whenever a
150 label is seen. */
151bfd_boolean dwarf2_loc_mark_labels;
152
220e750f 153/* Current location as indicated by the most recent .loc directive. */
bd0eb99b
RH
154static struct dwarf2_line_info current = {
155 1, 1, 0, 0,
156 DWARF2_LINE_DEFAULT_IS_STMT ? DWARF2_FLAG_IS_STMT : 0
157};
220e750f 158
220e750f
RH
159/* The size of an address on the target. */
160static unsigned int sizeof_address;
161\f
a2e22468
KH
162static struct line_subseg *get_line_subseg (segT, subsegT);
163static unsigned int get_filenum (const char *, unsigned int);
164static struct frag *first_frag_for_seg (segT);
165static struct frag *last_frag_for_seg (segT);
166static void out_byte (int);
167static void out_opcode (int);
168static void out_two (int);
169static void out_four (int);
170static void out_abbrev (int, int);
171static void out_uleb128 (addressT);
172static offsetT get_frag_fix (fragS *);
07a53e5c 173static void out_set_addr (symbolS *);
a2e22468
KH
174static int size_inc_line_addr (int, addressT);
175static void emit_inc_line_addr (int, addressT, char *, int);
176static void out_inc_line_addr (int, addressT);
07a53e5c 177static void relax_inc_line_addr (int, symbolS *, symbolS *);
a2e22468
KH
178static void process_entries (segT, struct line_entry *);
179static void out_file_list (void);
180static void out_debug_line (segT);
181static void out_debug_aranges (segT, segT);
182static void out_debug_abbrev (segT);
183static void out_debug_info (segT, segT, segT);
220e750f 184\f
c5c0a210
AM
185#ifndef TC_DWARF2_EMIT_OFFSET
186# define TC_DWARF2_EMIT_OFFSET generic_dwarf2_emit_offset
a2e22468 187static void generic_dwarf2_emit_offset (symbolS *, unsigned int);
c5c0a210 188
6174d9c8
RH
189/* Create an offset to .dwarf2_*. */
190
191static void
a2e22468 192generic_dwarf2_emit_offset (symbolS *symbol, unsigned int size)
6174d9c8
RH
193{
194 expressionS expr;
195
196 expr.X_op = O_symbol;
197 expr.X_add_symbol = symbol;
198 expr.X_add_number = 0;
199 emit_expr (&expr, size);
200}
c5c0a210 201#endif
6174d9c8 202
220e750f
RH
203/* Find or create an entry for SEG+SUBSEG in ALL_SEGS. */
204
205static struct line_subseg *
a2e22468 206get_line_subseg (segT seg, subsegT subseg)
220e750f
RH
207{
208 static segT last_seg;
209 static subsegT last_subseg;
210 static struct line_subseg *last_line_subseg;
211
212 struct line_seg *s;
213 struct line_subseg **pss, *ss;
fac0d250 214
220e750f
RH
215 if (seg == last_seg && subseg == last_subseg)
216 return last_line_subseg;
217
ee515fb7 218 for (s = all_segs; s; s = s->next)
220e750f
RH
219 if (s->seg == seg)
220 goto found_seg;
221
222 s = (struct line_seg *) xmalloc (sizeof (*s));
223 s->next = all_segs;
224 s->seg = seg;
225 s->head = NULL;
226 all_segs = s;
227
228 found_seg:
229 for (pss = &s->head; (ss = *pss) != NULL ; pss = &ss->next)
fac0d250 230 {
220e750f 231 if (ss->subseg == subseg)
ee515fb7 232 goto found_subseg;
220e750f
RH
233 if (ss->subseg > subseg)
234 break;
fac0d250 235 }
220e750f
RH
236
237 ss = (struct line_subseg *) xmalloc (sizeof (*ss));
238 ss->next = *pss;
239 ss->subseg = subseg;
240 ss->head = NULL;
241 ss->ptail = &ss->head;
242 *pss = ss;
243
244 found_subseg:
245 last_seg = seg;
246 last_subseg = subseg;
247 last_line_subseg = ss;
248
249 return ss;
fac0d250
RH
250}
251
07a53e5c
RH
252/* Record an entry for LOC occurring at LABEL. */
253
254static void
255dwarf2_gen_line_info_1 (symbolS *label, struct dwarf2_line_info *loc)
256{
257 struct line_subseg *ss;
258 struct line_entry *e;
259
260 e = (struct line_entry *) xmalloc (sizeof (*e));
261 e->next = NULL;
262 e->label = label;
263 e->loc = *loc;
264
265 ss = get_line_subseg (now_seg, now_subseg);
266 *ss->ptail = e;
267 ss->ptail = &e->next;
268}
269
436d9e46 270/* Record an entry for LOC occurring at OFS within the current fragment. */
353e2c69 271
220e750f 272void
a2e22468 273dwarf2_gen_line_info (addressT ofs, struct dwarf2_line_info *loc)
fac0d250 274{
1ea5c325
MS
275 static unsigned int line = -1;
276 static unsigned int filenum = -1;
220e750f 277
07a53e5c
RH
278 symbolS *sym;
279
220e750f
RH
280 /* Early out for as-yet incomplete location information. */
281 if (loc->filenum == 0 || loc->line == 0)
282 return;
283
ffa554ed
GK
284 /* Don't emit sequences of line symbols for the same line when the
285 symbols apply to assembler code. It is necessary to emit
286 duplicate line symbols when a compiler asks for them, because GDB
287 uses them to determine the end of the prologue. */
d1a6c242 288 if (debug_type == DEBUG_DWARF2
ffa554ed 289 && line == loc->line && filenum == loc->filenum)
1ea5c325
MS
290 return;
291
292 line = loc->line;
293 filenum = loc->filenum;
294
07a53e5c
RH
295 sym = symbol_temp_new (now_seg, ofs, frag_now);
296 dwarf2_gen_line_info_1 (sym, loc);
220e750f 297}
fac0d250 298
ecea7679
RH
299/* Returns the current source information. If .file directives have
300 been encountered, the info for the corresponding source file is
301 returned. Otherwise, the info for the assembly source file is
302 returned. */
303
220e750f 304void
a2e22468 305dwarf2_where (struct dwarf2_line_info *line)
220e750f
RH
306{
307 if (debug_type == DEBUG_DWARF2)
fac0d250 308 {
220e750f
RH
309 char *filename;
310 as_where (&filename, &line->line);
a7ed1ca2 311 line->filenum = get_filenum (filename, 0);
220e750f 312 line->column = 0;
bd0eb99b 313 line->flags = DWARF2_FLAG_IS_STMT;
ecea7679 314 line->isa = current.isa;
fac0d250 315 }
220e750f
RH
316 else
317 *line = current;
fac0d250
RH
318}
319
ecea7679
RH
320/* A hook to allow the target backend to inform the line number state
321 machine of isa changes when assembler debug info is enabled. */
322
323void
324dwarf2_set_isa (unsigned int isa)
325{
326 current.isa = isa;
327}
328
220e750f
RH
329/* Called for each machine instruction, or relatively atomic group of
330 machine instructions (ie built-in macro). The instruction or group
331 is SIZE bytes in length. If dwarf2 line number generation is called
332 for, emit a line statement appropriately. */
353e2c69 333
220e750f 334void
a2e22468 335dwarf2_emit_insn (int size)
fac0d250 336{
220e750f 337 struct dwarf2_line_info loc;
fac0d250 338
b6675117 339 if (loc_directive_seen)
1080e97d
L
340 {
341 /* Use the last location established by a .loc directive, not
342 the value returned by dwarf2_where(). That calls as_where()
343 which will return either the logical input file name (foo.c)
344 or the physical input file name (foo.s) and not the file name
345 specified in the most recent .loc directive (eg foo.h). */
346 loc = current;
347
348 /* Unless we generate DWARF2 debugging information for each
349 assembler line, we only emit one line symbol for one LOC. */
350 if (debug_type != DEBUG_DWARF2)
b34976b6 351 loc_directive_seen = FALSE;
1080e97d 352 }
b6675117 353 else if (debug_type != DEBUG_DWARF2)
220e750f 354 return;
b6675117 355 else
bd0eb99b 356 dwarf2_where (&loc);
b6675117 357
220e750f 358 dwarf2_gen_line_info (frag_now_fix () - size, &loc);
bd0eb99b
RH
359
360 current.flags &= ~(DWARF2_FLAG_BASIC_BLOCK
361 | DWARF2_FLAG_PROLOGUE_END
362 | DWARF2_FLAG_EPILOGUE_BEGIN);
220e750f 363}
fac0d250 364
07a53e5c
RH
365/* Called for each (preferably code) label. If dwarf2_loc_mark_labels
366 is enabled, emit a basic block marker. */
367
368void
369dwarf2_emit_label (symbolS *label)
370{
371 struct dwarf2_line_info loc;
372
373 if (!dwarf2_loc_mark_labels)
374 return;
375 if (S_GET_SEGMENT (label) != now_seg)
376 return;
377 if (!(bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE))
378 return;
379
380 if (debug_type == DEBUG_DWARF2)
381 dwarf2_where (&loc);
382 else
383 {
384 loc = current;
385 loc_directive_seen = FALSE;
386 }
387
388 loc.flags |= DWARF2_FLAG_BASIC_BLOCK;
389
390 current.flags &= ~(DWARF2_FLAG_BASIC_BLOCK
391 | DWARF2_FLAG_PROLOGUE_END
392 | DWARF2_FLAG_EPILOGUE_BEGIN);
393
394 dwarf2_gen_line_info_1 (label, &loc);
395}
396
a7ed1ca2
NC
397/* Get a .debug_line file number for FILENAME. If NUM is nonzero,
398 allocate it on that file table slot, otherwise return the first
399 empty one. */
220e750f
RH
400
401static unsigned int
a2e22468 402get_filenum (const char *filename, unsigned int num)
220e750f 403{
a7ed1ca2
NC
404 static unsigned int last_used, last_used_dir_len;
405 const char *file;
406 size_t dir_len;
407 unsigned int i, dir;
220e750f 408
a7ed1ca2
NC
409 if (num == 0 && last_used)
410 {
411 if (! files[last_used].dir
412 && strcmp (filename, files[last_used].filename) == 0)
413 return last_used;
414 if (files[last_used].dir
415 && strncmp (filename, dirs[files[last_used].dir],
416 last_used_dir_len) == 0
417 && IS_DIR_SEPARATOR (filename [last_used_dir_len])
418 && strcmp (filename + last_used_dir_len + 1,
419 files[last_used].filename) == 0)
420 return last_used;
421 }
220e750f 422
a7ed1ca2
NC
423 file = lbasename (filename);
424 /* Don't make empty string from / or A: from A:/ . */
425#ifdef HAVE_DOS_BASED_FILE_SYSTEM
426 if (file <= filename + 3)
427 file = filename;
428#else
429 if (file == filename + 1)
430 file = filename;
431#endif
432 dir_len = file - filename;
433
434 dir = 0;
435 if (dir_len)
436 {
437 --dir_len;
438 for (dir = 1; dir < dirs_in_use; ++dir)
4dde8e61 439 if (strncmp (filename, dirs[dir], dir_len) == 0
a7ed1ca2
NC
440 && dirs[dir][dir_len] == '\0')
441 break;
442
443 if (dir >= dirs_in_use)
444 {
445 if (dir >= dirs_allocated)
446 {
447 dirs_allocated = dir + 32;
448 dirs = (char **)
449 xrealloc (dirs, (dir + 32) * sizeof (const char *));
450 }
451
452 dirs[dir] = xmalloc (dir_len + 1);
453 memcpy (dirs[dir], filename, dir_len);
454 dirs[dir][dir_len] = '\0';
455 dirs_in_use = dir + 1;
456 }
457 }
458
459 if (num == 0)
460 {
461 for (i = 1; i < files_in_use; ++i)
462 if (files[i].dir == dir
88b4ca40 463 && files[i].filename
a7ed1ca2
NC
464 && strcmp (file, files[i].filename) == 0)
465 {
466 last_used = i;
467 last_used_dir_len = dir_len;
468 return i;
469 }
470 }
471 else
472 i = num;
220e750f
RH
473
474 if (i >= files_allocated)
fac0d250 475 {
249e3833
RH
476 unsigned int old = files_allocated;
477
220e750f
RH
478 files_allocated = i + 32;
479 files = (struct file_entry *)
ee515fb7 480 xrealloc (files, (i + 32) * sizeof (struct file_entry));
249e3833
RH
481
482 memset (files + old, 0, (i + 32 - old) * sizeof (struct file_entry));
fac0d250
RH
483 }
484
a7ed1ca2
NC
485 files[i].filename = num ? file : xstrdup (file);
486 files[i].dir = dir;
220e750f
RH
487 files_in_use = i + 1;
488 last_used = i;
a7ed1ca2 489 last_used_dir_len = dir_len;
220e750f
RH
490
491 return i;
492}
fac0d250 493
ecb4347a
DJ
494/* Handle two forms of .file directive:
495 - Pass .file "source.c" to s_app_file
496 - Handle .file 1 "source.c" by adding an entry to the DWARF-2 file table
220e750f 497
ecb4347a
DJ
498 If an entry is added to the file table, return a pointer to the filename. */
499
500char *
a2e22468 501dwarf2_directive_file (int dummy ATTRIBUTE_UNUSED)
220e750f
RH
502{
503 offsetT num;
e46d99eb 504 char *filename;
220e750f
RH
505 int filename_len;
506
507 /* Continue to accept a bare string and pass it off. */
508 SKIP_WHITESPACE ();
509 if (*input_line_pointer == '"')
fac0d250 510 {
220e750f 511 s_app_file (0);
ecb4347a 512 return NULL;
fac0d250
RH
513 }
514
220e750f
RH
515 num = get_absolute_expression ();
516 filename = demand_copy_C_string (&filename_len);
bd0eb99b
RH
517 if (filename == NULL)
518 return NULL;
220e750f
RH
519 demand_empty_rest_of_line ();
520
249e3833 521 if (num < 1)
fac0d250 522 {
0e389e77 523 as_bad (_("file number less than one"));
ecb4347a 524 return NULL;
fac0d250
RH
525 }
526
0e1a166b 527 if (num < (int) files_in_use && files[num].filename != 0)
220e750f 528 {
0e389e77 529 as_bad (_("file number %ld already allocated"), (long) num);
ecb4347a 530 return NULL;
249e3833 531 }
220e750f 532
a7ed1ca2 533 get_filenum (filename, num);
ecb4347a
DJ
534
535 return filename;
fac0d250
RH
536}
537
220e750f 538void
a2e22468 539dwarf2_directive_loc (int dummy ATTRIBUTE_UNUSED)
220e750f 540{
ecea7679
RH
541 offsetT filenum, line;
542
543 filenum = get_absolute_expression ();
544 SKIP_WHITESPACE ();
545 line = get_absolute_expression ();
546
547 if (filenum < 1)
548 {
549 as_bad (_("file number less than one"));
550 return;
551 }
552 if (filenum >= (int) files_in_use || files[filenum].filename == 0)
553 {
554 as_bad (_("unassigned file number %ld"), (long) filenum);
555 return;
556 }
557
558 current.filenum = filenum;
559 current.line = line;
560
561#ifndef NO_LISTING
562 if (listing)
563 {
564 if (files[filenum].dir)
565 {
566 size_t dir_len = strlen (dirs[files[filenum].dir]);
567 size_t file_len = strlen (files[filenum].filename);
568 char *cp = (char *) alloca (dir_len + 1 + file_len + 1);
569
570 memcpy (cp, dirs[files[filenum].dir], dir_len);
571 cp[dir_len] = '/';
572 memcpy (cp + dir_len + 1, files[filenum].filename, file_len);
573 cp[dir_len + file_len + 1] = '\0';
574 listing_source_file (cp);
575 }
576 else
577 listing_source_file (files[filenum].filename);
578 listing_source_line (line);
579 }
580#endif
581
220e750f 582 SKIP_WHITESPACE ();
ecea7679
RH
583 if (ISDIGIT (*input_line_pointer))
584 {
585 current.column = get_absolute_expression ();
586 SKIP_WHITESPACE ();
587 }
588
589 while (ISALPHA (*input_line_pointer))
220e750f 590 {
bd0eb99b
RH
591 char *p, c;
592 offsetT value;
593
594 p = input_line_pointer;
595 c = get_symbol_end ();
596
597 if (strcmp (p, "basic_block") == 0)
598 {
599 current.flags |= DWARF2_FLAG_BASIC_BLOCK;
600 *input_line_pointer = c;
601 }
602 else if (strcmp (p, "prologue_end") == 0)
603 {
604 current.flags |= DWARF2_FLAG_PROLOGUE_END;
605 *input_line_pointer = c;
606 }
607 else if (strcmp (p, "epilogue_begin") == 0)
608 {
609 current.flags |= DWARF2_FLAG_EPILOGUE_BEGIN;
610 *input_line_pointer = c;
611 }
612 else if (strcmp (p, "is_stmt") == 0)
613 {
614 *input_line_pointer = c;
615 value = get_absolute_expression ();
616 if (value == 0)
617 current.flags &= ~DWARF2_FLAG_IS_STMT;
618 else if (value == 1)
619 current.flags |= DWARF2_FLAG_IS_STMT;
620 else
ecea7679
RH
621 {
622 as_bad (_("is_stmt value not 0 or 1"));
623 return;
624 }
bd0eb99b
RH
625 }
626 else if (strcmp (p, "isa") == 0)
627 {
628 *input_line_pointer = c;
629 value = get_absolute_expression ();
ecea7679 630 if (value >= 0)
bd0eb99b 631 current.isa = value;
ecea7679
RH
632 else
633 {
634 as_bad (_("isa number less than zero"));
635 return;
636 }
bd0eb99b
RH
637 }
638 else
639 {
ecea7679 640 as_bad (_("unknown .loc sub-directive `%s'"), p);
bd0eb99b 641 *input_line_pointer = c;
bd0eb99b
RH
642 return;
643 }
644
ecea7679 645 SKIP_WHITESPACE ();
bd0eb99b
RH
646 }
647
648 demand_empty_rest_of_line ();
649 loc_directive_seen = TRUE;
220e750f 650}
07a53e5c
RH
651
652void
653dwarf2_directive_loc_mark_labels (int dummy ATTRIBUTE_UNUSED)
654{
655 offsetT value = get_absolute_expression ();
656
657 if (value != 0 && value != 1)
658 {
659 as_bad (_("expected 0 or 1"));
660 ignore_rest_of_line ();
661 }
662 else
663 {
664 dwarf2_loc_mark_labels = value != 0;
665 demand_empty_rest_of_line ();
666 }
667}
220e750f
RH
668\f
669static struct frag *
a2e22468 670first_frag_for_seg (segT seg)
220e750f
RH
671{
672 frchainS *f, *first = NULL;
673
ee515fb7 674 for (f = frchain_root; f; f = f->frch_next)
220e750f
RH
675 if (f->frch_seg == seg
676 && (! first || first->frch_subseg > f->frch_subseg))
677 first = f;
678
679 return first ? first->frch_root : NULL;
680}
681
682static struct frag *
a2e22468 683last_frag_for_seg (segT seg)
220e750f
RH
684{
685 frchainS *f, *last = NULL;
686
ee515fb7 687 for (f = frchain_root; f; f = f->frch_next)
220e750f
RH
688 if (f->frch_seg == seg
689 && (! last || last->frch_subseg < f->frch_subseg))
690 last= f;
691
692 return last ? last->frch_last : NULL;
693}
694\f
695/* Emit a single byte into the current segment. */
696
697static inline void
a2e22468 698out_byte (int byte)
220e750f
RH
699{
700 FRAG_APPEND_1_CHAR (byte);
701}
702
703/* Emit a statement program opcode into the current segment. */
704
705static inline void
a2e22468 706out_opcode (int opc)
220e750f
RH
707{
708 out_byte (opc);
709}
710
711/* Emit a two-byte word into the current segment. */
712
713static inline void
a2e22468 714out_two (int data)
220e750f
RH
715{
716 md_number_to_chars (frag_more (2), data, 2);
717}
718
719/* Emit a four byte word into the current segment. */
720
721static inline void
a2e22468 722out_four (int data)
220e750f
RH
723{
724 md_number_to_chars (frag_more (4), data, 4);
725}
726
727/* Emit an unsigned "little-endian base 128" number. */
728
fac0d250 729static void
a2e22468 730out_uleb128 (addressT value)
220e750f
RH
731{
732 output_leb128 (frag_more (sizeof_leb128 (value, 0)), value, 0);
733}
734
735/* Emit a tuple for .debug_abbrev. */
736
737static inline void
a2e22468 738out_abbrev (int name, int form)
fac0d250 739{
220e750f
RH
740 out_uleb128 (name);
741 out_uleb128 (form);
742}
fac0d250 743
220e750f 744/* Get the size of a fragment. */
fac0d250 745
220e750f 746static offsetT
a2e22468 747get_frag_fix (fragS *frag)
220e750f
RH
748{
749 frchainS *fr;
750
751 if (frag->fr_next)
752 return frag->fr_fix;
753
754 /* If a fragment is the last in the chain, special measures must be
755 taken to find its size before relaxation, since it may be pending
756 on some subsegment chain. */
ee515fb7 757 for (fr = frchain_root; fr; fr = fr->frch_next)
220e750f 758 if (fr->frch_last == frag)
c5c0a210 759 return (char *) obstack_next_free (&fr->frch_obstack) - frag->fr_literal;
220e750f
RH
760
761 abort ();
762}
fac0d250 763
220e750f 764/* Set an absolute address (may result in a relocation entry). */
fac0d250 765
220e750f 766static void
07a53e5c 767out_set_addr (symbolS *sym)
220e750f
RH
768{
769 expressionS expr;
9e3af0e7 770
fac0d250 771 out_opcode (DW_LNS_extended_op);
220e750f 772 out_uleb128 (sizeof_address + 1);
fac0d250
RH
773
774 out_opcode (DW_LNE_set_address);
775 expr.X_op = O_symbol;
776 expr.X_add_symbol = sym;
777 expr.X_add_number = 0;
220e750f 778 emit_expr (&expr, sizeof_address);
fac0d250
RH
779}
780
a3b75434 781#if DWARF2_LINE_MIN_INSN_LENGTH > 1
a2e22468 782static void scale_addr_delta (addressT *);
c8970b4b 783
a3b75434 784static void
d7342424 785scale_addr_delta (addressT *addr_delta)
a3b75434
DD
786{
787 static int printed_this = 0;
788 if (*addr_delta % DWARF2_LINE_MIN_INSN_LENGTH != 0)
789 {
790 if (!printed_this)
791 as_bad("unaligned opcodes detected in executable segment");
792 printed_this = 1;
793 }
794 *addr_delta /= DWARF2_LINE_MIN_INSN_LENGTH;
795}
796#else
797#define scale_addr_delta(A)
798#endif
799
220e750f
RH
800/* Encode a pair of line and address skips as efficiently as possible.
801 Note that the line skip is signed, whereas the address skip is unsigned.
353e2c69 802
220e750f
RH
803 The following two routines *must* be kept in sync. This is
804 enforced by making emit_inc_line_addr abort if we do not emit
805 exactly the expected number of bytes. */
806
807static int
a2e22468 808size_inc_line_addr (int line_delta, addressT addr_delta)
fac0d250 809{
220e750f
RH
810 unsigned int tmp, opcode;
811 int len = 0;
fac0d250 812
220e750f 813 /* Scale the address delta by the minimum instruction length. */
a3b75434 814 scale_addr_delta (&addr_delta);
220e750f
RH
815
816 /* INT_MAX is a signal that this is actually a DW_LNE_end_sequence.
817 We cannot use special opcodes here, since we want the end_sequence
818 to emit the matrix entry. */
819 if (line_delta == INT_MAX)
fac0d250 820 {
220e750f
RH
821 if (addr_delta == MAX_SPECIAL_ADDR_DELTA)
822 len = 1;
fac0d250 823 else
220e750f
RH
824 len = 1 + sizeof_leb128 (addr_delta, 0);
825 return len + 3;
fac0d250 826 }
fac0d250 827
220e750f
RH
828 /* Bias the line delta by the base. */
829 tmp = line_delta - DWARF2_LINE_BASE;
fac0d250 830
220e750f
RH
831 /* If the line increment is out of range of a special opcode, we
832 must encode it with DW_LNS_advance_line. */
833 if (tmp >= DWARF2_LINE_RANGE)
834 {
835 len = 1 + sizeof_leb128 (line_delta, 1);
836 line_delta = 0;
837 tmp = 0 - DWARF2_LINE_BASE;
838 }
fac0d250 839
220e750f
RH
840 /* Bias the opcode by the special opcode base. */
841 tmp += DWARF2_LINE_OPCODE_BASE;
353e2c69 842
220e750f
RH
843 /* Avoid overflow when addr_delta is large. */
844 if (addr_delta < 256 + MAX_SPECIAL_ADDR_DELTA)
845 {
846 /* Try using a special opcode. */
847 opcode = tmp + addr_delta * DWARF2_LINE_RANGE;
848 if (opcode <= 255)
849 return len + 1;
850
851 /* Try using DW_LNS_const_add_pc followed by special op. */
852 opcode = tmp + (addr_delta - MAX_SPECIAL_ADDR_DELTA) * DWARF2_LINE_RANGE;
853 if (opcode <= 255)
854 return len + 2;
855 }
856
857 /* Otherwise use DW_LNS_advance_pc. */
858 len += 1 + sizeof_leb128 (addr_delta, 0);
859
860 /* DW_LNS_copy or special opcode. */
861 len += 1;
862
863 return len;
864}
fac0d250 865
220e750f 866static void
a2e22468 867emit_inc_line_addr (int line_delta, addressT addr_delta, char *p, int len)
220e750f
RH
868{
869 unsigned int tmp, opcode;
870 int need_copy = 0;
871 char *end = p + len;
fac0d250 872
07a53e5c
RH
873 /* Line number sequences cannot go backward in addresses. This means
874 we've incorrectly ordered the statements in the sequence. */
875 assert ((offsetT) addr_delta >= 0);
876
220e750f 877 /* Scale the address delta by the minimum instruction length. */
a3b75434
DD
878 scale_addr_delta (&addr_delta);
879
220e750f
RH
880 /* INT_MAX is a signal that this is actually a DW_LNE_end_sequence.
881 We cannot use special opcodes here, since we want the end_sequence
882 to emit the matrix entry. */
883 if (line_delta == INT_MAX)
fac0d250 884 {
220e750f
RH
885 if (addr_delta == MAX_SPECIAL_ADDR_DELTA)
886 *p++ = DW_LNS_const_add_pc;
887 else
fac0d250 888 {
220e750f
RH
889 *p++ = DW_LNS_advance_pc;
890 p += output_leb128 (p, addr_delta, 0);
fac0d250 891 }
220e750f
RH
892
893 *p++ = DW_LNS_extended_op;
894 *p++ = 1;
895 *p++ = DW_LNE_end_sequence;
896 goto done;
fac0d250
RH
897 }
898
220e750f
RH
899 /* Bias the line delta by the base. */
900 tmp = line_delta - DWARF2_LINE_BASE;
901
902 /* If the line increment is out of range of a special opcode, we
903 must encode it with DW_LNS_advance_line. */
904 if (tmp >= DWARF2_LINE_RANGE)
fac0d250 905 {
220e750f
RH
906 *p++ = DW_LNS_advance_line;
907 p += output_leb128 (p, line_delta, 1);
fac0d250 908
220e750f
RH
909 line_delta = 0;
910 tmp = 0 - DWARF2_LINE_BASE;
911 need_copy = 1;
912 }
fac0d250 913
bd0eb99b
RH
914 /* Prettier, I think, to use DW_LNS_copy instead of a "line +0, addr +0"
915 special opcode. */
916 if (line_delta == 0 && addr_delta == 0)
917 {
918 *p++ = DW_LNS_copy;
919 goto done;
920 }
921
220e750f
RH
922 /* Bias the opcode by the special opcode base. */
923 tmp += DWARF2_LINE_OPCODE_BASE;
fac0d250 924
220e750f
RH
925 /* Avoid overflow when addr_delta is large. */
926 if (addr_delta < 256 + MAX_SPECIAL_ADDR_DELTA)
fac0d250 927 {
220e750f
RH
928 /* Try using a special opcode. */
929 opcode = tmp + addr_delta * DWARF2_LINE_RANGE;
930 if (opcode <= 255)
931 {
932 *p++ = opcode;
933 goto done;
934 }
935
936 /* Try using DW_LNS_const_add_pc followed by special op. */
937 opcode = tmp + (addr_delta - MAX_SPECIAL_ADDR_DELTA) * DWARF2_LINE_RANGE;
938 if (opcode <= 255)
fac0d250 939 {
220e750f
RH
940 *p++ = DW_LNS_const_add_pc;
941 *p++ = opcode;
942 goto done;
fac0d250
RH
943 }
944 }
220e750f
RH
945
946 /* Otherwise use DW_LNS_advance_pc. */
947 *p++ = DW_LNS_advance_pc;
948 p += output_leb128 (p, addr_delta, 0);
949
950 if (need_copy)
951 *p++ = DW_LNS_copy;
fac0d250 952 else
220e750f 953 *p++ = tmp;
fac0d250 954
220e750f
RH
955 done:
956 assert (p == end);
957}
a8316fe2 958
220e750f 959/* Handy routine to combine calls to the above two routines. */
e1c05f12 960
220e750f 961static void
a2e22468 962out_inc_line_addr (int line_delta, addressT addr_delta)
220e750f
RH
963{
964 int len = size_inc_line_addr (line_delta, addr_delta);
965 emit_inc_line_addr (line_delta, addr_delta, frag_more (len), len);
966}
9de8d8f1 967
220e750f
RH
968/* Generate a variant frag that we can use to relax address/line
969 increments between fragments of the target segment. */
9e3af0e7 970
220e750f 971static void
07a53e5c 972relax_inc_line_addr (int line_delta, symbolS *to_sym, symbolS *from_sym)
220e750f 973{
220e750f
RH
974 expressionS expr;
975 int max_chars;
6576f0b5 976
220e750f
RH
977 expr.X_op = O_subtract;
978 expr.X_add_symbol = to_sym;
979 expr.X_op_symbol = from_sym;
980 expr.X_add_number = 0;
fac0d250 981
220e750f
RH
982 /* The maximum size of the frag is the line delta with a maximum
983 sized address delta. */
984 max_chars = size_inc_line_addr (line_delta, -DWARF2_LINE_MIN_INSN_LENGTH);
fac0d250 985
220e750f
RH
986 frag_var (rs_dwarf2dbg, max_chars, max_chars, 1,
987 make_expr_symbol (&expr), line_delta, NULL);
988}
fac0d250 989
220e750f
RH
990/* The function estimates the size of a rs_dwarf2dbg variant frag
991 based on the current values of the symbols. It is called before
992 the relaxation loop. We set fr_subtype to the expected length. */
fac0d250 993
220e750f 994int
a2e22468 995dwarf2dbg_estimate_size_before_relax (fragS *frag)
220e750f
RH
996{
997 offsetT addr_delta;
998 int size;
fac0d250 999
6386f3a7 1000 addr_delta = resolve_symbol_value (frag->fr_symbol);
220e750f 1001 size = size_inc_line_addr (frag->fr_offset, addr_delta);
fac0d250 1002
220e750f 1003 frag->fr_subtype = size;
fac0d250 1004
220e750f
RH
1005 return size;
1006}
1007
1008/* This function relaxes a rs_dwarf2dbg variant frag based on the
1009 current values of the symbols. fr_subtype is the current length
1010 of the frag. This returns the change in frag length. */
1011
1012int
a2e22468 1013dwarf2dbg_relax_frag (fragS *frag)
220e750f
RH
1014{
1015 int old_size, new_size;
fac0d250 1016
220e750f
RH
1017 old_size = frag->fr_subtype;
1018 new_size = dwarf2dbg_estimate_size_before_relax (frag);
ee515fb7 1019
220e750f 1020 return new_size - old_size;
fac0d250
RH
1021}
1022
220e750f
RH
1023/* This function converts a rs_dwarf2dbg variant frag into a normal
1024 fill frag. This is called after all relaxation has been done.
1025 fr_subtype will be the desired length of the frag. */
1026
1027void
a2e22468 1028dwarf2dbg_convert_frag (fragS *frag)
fac0d250 1029{
220e750f
RH
1030 offsetT addr_diff;
1031
6386f3a7 1032 addr_diff = resolve_symbol_value (frag->fr_symbol);
fac0d250 1033
220e750f
RH
1034 /* fr_var carries the max_chars that we created the fragment with.
1035 fr_subtype carries the current expected length. We must, of
1036 course, have allocated enough memory earlier. */
bccba5f0 1037 assert (frag->fr_var >= (int) frag->fr_subtype);
fac0d250 1038
ee515fb7 1039 emit_inc_line_addr (frag->fr_offset, addr_diff,
220e750f
RH
1040 frag->fr_literal + frag->fr_fix, frag->fr_subtype);
1041
1042 frag->fr_fix += frag->fr_subtype;
1043 frag->fr_type = rs_fill;
1044 frag->fr_var = 0;
1045 frag->fr_offset = 0;
1046}
1047
1048/* Generate .debug_line content for the chain of line number entries
1049 beginning at E, for segment SEG. */
1050
1051static void
a2e22468 1052process_entries (segT seg, struct line_entry *e)
220e750f
RH
1053{
1054 unsigned filenum = 1;
1055 unsigned line = 1;
1056 unsigned column = 0;
bd0eb99b
RH
1057 unsigned isa = 0;
1058 unsigned flags = DWARF2_LINE_DEFAULT_IS_STMT ? DWARF2_FLAG_IS_STMT : 0;
07a53e5c
RH
1059 fragS *last_frag = NULL, *frag;
1060 addressT last_frag_ofs = 0, frag_ofs;
1061 symbolS *last_lab, *lab;
220e750f
RH
1062 struct line_entry *next;
1063
1064 while (e)
fac0d250 1065 {
07a53e5c 1066 int line_delta;
220e750f
RH
1067
1068 if (filenum != e->loc.filenum)
fac0d250 1069 {
220e750f
RH
1070 filenum = e->loc.filenum;
1071 out_opcode (DW_LNS_set_file);
1072 out_uleb128 (filenum);
220e750f
RH
1073 }
1074
1075 if (column != e->loc.column)
1076 {
1077 column = e->loc.column;
1078 out_opcode (DW_LNS_set_column);
1079 out_uleb128 (column);
220e750f
RH
1080 }
1081
bd0eb99b
RH
1082 if (isa != e->loc.isa)
1083 {
1084 isa = e->loc.isa;
1085 out_opcode (DW_LNS_set_isa);
1086 out_uleb128 (isa);
bd0eb99b
RH
1087 }
1088
1089 if ((e->loc.flags ^ flags) & DWARF2_FLAG_IS_STMT)
220e750f
RH
1090 {
1091 flags = e->loc.flags;
1092 out_opcode (DW_LNS_negate_stmt);
220e750f
RH
1093 }
1094
bd0eb99b 1095 if (e->loc.flags & DWARF2_FLAG_BASIC_BLOCK)
07a53e5c 1096 out_opcode (DW_LNS_set_basic_block);
220e750f 1097
bd0eb99b 1098 if (e->loc.flags & DWARF2_FLAG_PROLOGUE_END)
07a53e5c 1099 out_opcode (DW_LNS_set_prologue_end);
bd0eb99b
RH
1100
1101 if (e->loc.flags & DWARF2_FLAG_EPILOGUE_BEGIN)
07a53e5c 1102 out_opcode (DW_LNS_set_epilogue_begin);
bd0eb99b 1103
fb81275c
JM
1104 /* Don't try to optimize away redundant entries; gdb wants two
1105 entries for a function where the code starts on the same line as
1106 the {, and there's no way to identify that case here. Trust gcc
1107 to optimize appropriately. */
07a53e5c
RH
1108 line_delta = e->loc.line - line;
1109 lab = e->label;
1110 frag = symbol_get_frag (lab);
1111 frag_ofs = S_GET_VALUE (lab);
220e750f 1112
07a53e5c 1113 if (last_frag == NULL)
220e750f 1114 {
07a53e5c
RH
1115 out_set_addr (lab);
1116 out_inc_line_addr (line_delta, 0);
220e750f 1117 }
07a53e5c
RH
1118 else if (frag == last_frag)
1119 out_inc_line_addr (line_delta, frag_ofs - last_frag_ofs);
1120 else
1121 relax_inc_line_addr (line_delta, lab, last_lab);
1122
1123 line = e->loc.line;
1124 last_lab = lab;
1125 last_frag = frag;
1126 last_frag_ofs = frag_ofs;
220e750f
RH
1127
1128 next = e->next;
1129 free (e);
1130 e = next;
fac0d250 1131 }
353e2c69 1132
220e750f 1133 /* Emit a DW_LNE_end_sequence for the end of the section. */
07a53e5c
RH
1134 frag = last_frag_for_seg (seg);
1135 frag_ofs = get_frag_fix (frag);
220e750f 1136 if (frag == last_frag)
07a53e5c 1137 out_inc_line_addr (INT_MAX, frag_ofs - last_frag_ofs);
220e750f 1138 else
07a53e5c
RH
1139 {
1140 lab = symbol_temp_new (seg, frag_ofs, frag);
1141 relax_inc_line_addr (INT_MAX, lab, last_lab);
1142 }
fac0d250
RH
1143}
1144
220e750f
RH
1145/* Emit the directory and file tables for .debug_line. */
1146
fac0d250 1147static void
a2e22468 1148out_file_list (void)
fac0d250
RH
1149{
1150 size_t size;
1151 char *cp;
220e750f
RH
1152 unsigned int i;
1153
a7ed1ca2
NC
1154 /* Emit directory list. */
1155 for (i = 1; i < dirs_in_use; ++i)
1156 {
1157 size = strlen (dirs[i]) + 1;
1158 cp = frag_more (size);
1159 memcpy (cp, dirs[i], size);
1160 }
1161 /* Terminate it. */
220e750f 1162 out_byte ('\0');
fac0d250 1163
220e750f 1164 for (i = 1; i < files_in_use; ++i)
fac0d250 1165 {
249e3833
RH
1166 if (files[i].filename == NULL)
1167 {
0e389e77 1168 as_bad (_("unassigned file number %ld"), (long) i);
88b4ca40
RH
1169 /* Prevent a crash later, particularly for file 1. */
1170 files[i].filename = "";
249e3833
RH
1171 continue;
1172 }
1173
220e750f 1174 size = strlen (files[i].filename) + 1;
fac0d250 1175 cp = frag_more (size);
220e750f 1176 memcpy (cp, files[i].filename, size);
fac0d250 1177
220e750f 1178 out_uleb128 (files[i].dir); /* directory number */
fac0d250
RH
1179 out_uleb128 (0); /* last modification timestamp */
1180 out_uleb128 (0); /* filesize */
1181 }
353e2c69
KH
1182
1183 /* Terminate filename list. */
1184 out_byte (0);
fac0d250
RH
1185}
1186
220e750f
RH
1187/* Emit the collected .debug_line data. */
1188
1189static void
a2e22468 1190out_debug_line (segT line_seg)
220e750f
RH
1191{
1192 expressionS expr;
1193 symbolS *line_start;
1194 symbolS *prologue_end;
1195 symbolS *line_end;
1196 struct line_seg *s;
14e777e0
KB
1197 enum dwarf2_format d2f;
1198 int sizeof_offset;
220e750f
RH
1199
1200 subseg_set (line_seg, 0);
1201
b7d6ed97
RH
1202 line_start = symbol_temp_new_now ();
1203 prologue_end = symbol_temp_make ();
1204 line_end = symbol_temp_make ();
220e750f
RH
1205
1206 /* Total length of the information for this compilation unit. */
1207 expr.X_op = O_subtract;
1208 expr.X_add_symbol = line_end;
1209 expr.X_op_symbol = line_start;
14e777e0
KB
1210
1211 d2f = DWARF2_FORMAT ();
1212 if (d2f == dwarf2_format_32bit)
1213 {
1214 expr.X_add_number = -4;
1215 emit_expr (&expr, 4);
1216 sizeof_offset = 4;
1217 }
1218 else if (d2f == dwarf2_format_64bit)
1219 {
1220 expr.X_add_number = -12;
1221 out_four (-1);
1222 emit_expr (&expr, 8);
1223 sizeof_offset = 8;
1224 }
1225 else if (d2f == dwarf2_format_64bit_irix)
1226 {
1227 expr.X_add_number = -8;
1228 emit_expr (&expr, 8);
1229 sizeof_offset = 8;
1230 }
1231 else
1232 {
1233 as_fatal (_("internal error: unknown dwarf2 format"));
1234 }
220e750f
RH
1235
1236 /* Version. */
1237 out_two (2);
1238
1239 /* Length of the prologue following this length. */
1240 expr.X_op = O_subtract;
1241 expr.X_add_symbol = prologue_end;
1242 expr.X_op_symbol = line_start;
1243 expr.X_add_number = - (4 + 2 + 4);
14e777e0 1244 emit_expr (&expr, sizeof_offset);
220e750f
RH
1245
1246 /* Parameters of the state machine. */
1247 out_byte (DWARF2_LINE_MIN_INSN_LENGTH);
1248 out_byte (DWARF2_LINE_DEFAULT_IS_STMT);
1249 out_byte (DWARF2_LINE_BASE);
1250 out_byte (DWARF2_LINE_RANGE);
1251 out_byte (DWARF2_LINE_OPCODE_BASE);
1252
1253 /* Standard opcode lengths. */
1254 out_byte (0); /* DW_LNS_copy */
1255 out_byte (1); /* DW_LNS_advance_pc */
1256 out_byte (1); /* DW_LNS_advance_line */
1257 out_byte (1); /* DW_LNS_set_file */
1258 out_byte (1); /* DW_LNS_set_column */
1259 out_byte (0); /* DW_LNS_negate_stmt */
1260 out_byte (0); /* DW_LNS_set_basic_block */
1261 out_byte (0); /* DW_LNS_const_add_pc */
1262 out_byte (1); /* DW_LNS_fixed_advance_pc */
bd0eb99b
RH
1263 out_byte (0); /* DW_LNS_set_prologue_end */
1264 out_byte (0); /* DW_LNS_set_epilogue_begin */
1265 out_byte (1); /* DW_LNS_set_isa */
220e750f
RH
1266
1267 out_file_list ();
1268
b7d6ed97 1269 symbol_set_value_now (prologue_end);
220e750f
RH
1270
1271 /* For each section, emit a statement program. */
ee515fb7 1272 for (s = all_segs; s; s = s->next)
220e750f
RH
1273 process_entries (s->seg, s->head->head);
1274
b7d6ed97 1275 symbol_set_value_now (line_end);
220e750f
RH
1276}
1277
1278/* Emit data for .debug_aranges. */
1279
58b5739a 1280static void
a2e22468 1281out_debug_aranges (segT aranges_seg, segT info_seg)
fac0d250 1282{
220e750f
RH
1283 unsigned int addr_size = sizeof_address;
1284 addressT size, skip;
1285 struct line_seg *s;
1286 expressionS expr;
1287 char *p;
fac0d250 1288
220e750f 1289 size = 4 + 2 + 4 + 1 + 1;
fac0d250 1290
ee515fb7
KH
1291 skip = 2 * addr_size - (size & (2 * addr_size - 1));
1292 if (skip == 2 * addr_size)
220e750f
RH
1293 skip = 0;
1294 size += skip;
fac0d250 1295
ee515fb7
KH
1296 for (s = all_segs; s; s = s->next)
1297 size += 2 * addr_size;
fac0d250 1298
ee515fb7 1299 size += 2 * addr_size;
fac0d250 1300
220e750f 1301 subseg_set (aranges_seg, 0);
fac0d250 1302
220e750f
RH
1303 /* Length of the compilation unit. */
1304 out_four (size - 4);
fac0d250 1305
220e750f
RH
1306 /* Version. */
1307 out_two (2);
4dc7ead9 1308
220e750f 1309 /* Offset to .debug_info. */
6174d9c8
RH
1310 /* ??? sizeof_offset */
1311 TC_DWARF2_EMIT_OFFSET (section_symbol (info_seg), 4);
220e750f
RH
1312
1313 /* Size of an address (offset portion). */
1314 out_byte (addr_size);
1315
1316 /* Size of a segment descriptor. */
1317 out_byte (0);
1318
1319 /* Align the header. */
1320 if (skip)
ee515fb7 1321 frag_align (ffs (2 * addr_size) - 1, 0, 0);
4dc7ead9 1322
ee515fb7 1323 for (s = all_segs; s; s = s->next)
220e750f
RH
1324 {
1325 fragS *frag;
1326 symbolS *beg, *end;
1327
1328 frag = first_frag_for_seg (s->seg);
b7d6ed97 1329 beg = symbol_temp_new (s->seg, 0, frag);
220e750f
RH
1330 s->text_start = beg;
1331
1332 frag = last_frag_for_seg (s->seg);
b7d6ed97 1333 end = symbol_temp_new (s->seg, get_frag_fix (frag), frag);
220e750f
RH
1334 s->text_end = end;
1335
1336 expr.X_op = O_symbol;
1337 expr.X_add_symbol = beg;
1338 expr.X_add_number = 0;
1339 emit_expr (&expr, addr_size);
1340
1341 expr.X_op = O_subtract;
1342 expr.X_add_symbol = end;
1343 expr.X_op_symbol = beg;
1344 expr.X_add_number = 0;
1345 emit_expr (&expr, addr_size);
1346 }
4dc7ead9 1347
220e750f
RH
1348 p = frag_more (2 * addr_size);
1349 md_number_to_chars (p, 0, addr_size);
1350 md_number_to_chars (p + addr_size, 0, addr_size);
4dc7ead9
RH
1351}
1352
220e750f
RH
1353/* Emit data for .debug_abbrev. Note that this must be kept in
1354 sync with out_debug_info below. */
fac0d250 1355
220e750f 1356static void
a2e22468 1357out_debug_abbrev (segT abbrev_seg)
220e750f
RH
1358{
1359 subseg_set (abbrev_seg, 0);
fac0d250 1360
220e750f
RH
1361 out_uleb128 (1);
1362 out_uleb128 (DW_TAG_compile_unit);
1363 out_byte (DW_CHILDREN_no);
1364 out_abbrev (DW_AT_stmt_list, DW_FORM_data4);
1365 if (all_segs->next == NULL)
4dc7ead9 1366 {
220e750f
RH
1367 out_abbrev (DW_AT_low_pc, DW_FORM_addr);
1368 out_abbrev (DW_AT_high_pc, DW_FORM_addr);
1369 }
48b91938 1370 out_abbrev (DW_AT_name, DW_FORM_string);
220e750f
RH
1371 out_abbrev (DW_AT_comp_dir, DW_FORM_string);
1372 out_abbrev (DW_AT_producer, DW_FORM_string);
1373 out_abbrev (DW_AT_language, DW_FORM_data2);
1374 out_abbrev (0, 0);
a987bfc9
RH
1375
1376 /* Terminate the abbreviations for this compilation unit. */
1377 out_byte (0);
220e750f 1378}
4dc7ead9 1379
220e750f 1380/* Emit a description of this compilation unit for .debug_info. */
4dc7ead9 1381
220e750f 1382static void
a2e22468 1383out_debug_info (segT info_seg, segT abbrev_seg, segT line_seg)
220e750f
RH
1384{
1385 char producer[128];
1386 char *comp_dir;
1387 expressionS expr;
1388 symbolS *info_start;
1389 symbolS *info_end;
1390 char *p;
1391 int len;
14e777e0
KB
1392 enum dwarf2_format d2f;
1393 int sizeof_offset;
4dc7ead9 1394
220e750f 1395 subseg_set (info_seg, 0);
4dc7ead9 1396
b7d6ed97
RH
1397 info_start = symbol_temp_new_now ();
1398 info_end = symbol_temp_make ();
4dc7ead9 1399
220e750f
RH
1400 /* Compilation Unit length. */
1401 expr.X_op = O_subtract;
1402 expr.X_add_symbol = info_end;
1403 expr.X_op_symbol = info_start;
14e777e0
KB
1404
1405 d2f = DWARF2_FORMAT ();
1406 if (d2f == dwarf2_format_32bit)
1407 {
1408 expr.X_add_number = -4;
1409 emit_expr (&expr, 4);
1410 sizeof_offset = 4;
1411 }
1412 else if (d2f == dwarf2_format_64bit)
1413 {
1414 expr.X_add_number = -12;
1415 out_four (-1);
1416 emit_expr (&expr, 8);
1417 sizeof_offset = 8;
1418 }
1419 else if (d2f == dwarf2_format_64bit_irix)
1420 {
1421 expr.X_add_number = -8;
1422 emit_expr (&expr, 8);
1423 sizeof_offset = 8;
1424 }
1425 else
1426 {
1427 as_fatal (_("internal error: unknown dwarf2 format"));
1428 }
4dc7ead9 1429
220e750f
RH
1430 /* DWARF version. */
1431 out_two (2);
4dc7ead9 1432
220e750f 1433 /* .debug_abbrev offset */
6174d9c8 1434 TC_DWARF2_EMIT_OFFSET (section_symbol (abbrev_seg), sizeof_offset);
4dc7ead9 1435
220e750f
RH
1436 /* Target address size. */
1437 out_byte (sizeof_address);
fac0d250 1438
220e750f
RH
1439 /* DW_TAG_compile_unit DIE abbrev */
1440 out_uleb128 (1);
fac0d250 1441
220e750f 1442 /* DW_AT_stmt_list */
6174d9c8
RH
1443 /* ??? sizeof_offset */
1444 TC_DWARF2_EMIT_OFFSET (section_symbol (line_seg), 4);
fac0d250 1445
220e750f
RH
1446 /* These two attributes may only be emitted if all of the code is
1447 contiguous. Multiple sections are not that. */
1448 if (all_segs->next == NULL)
58b5739a 1449 {
220e750f
RH
1450 /* DW_AT_low_pc */
1451 expr.X_op = O_symbol;
1452 expr.X_add_symbol = all_segs->text_start;
1453 expr.X_add_number = 0;
1454 emit_expr (&expr, sizeof_address);
1455
1456 /* DW_AT_high_pc */
1457 expr.X_op = O_symbol;
1458 expr.X_add_symbol = all_segs->text_end;
1459 expr.X_add_number = 0;
1460 emit_expr (&expr, sizeof_address);
58b5739a
RH
1461 }
1462
48b91938
RH
1463 /* DW_AT_name. We don't have the actual file name that was present
1464 on the command line, so assume files[1] is the main input file.
1465 We're not supposed to get called unless at least one line number
1466 entry was emitted, so this should always be defined. */
1467 if (!files || files_in_use < 1)
1468 abort ();
a7ed1ca2
NC
1469 if (files[1].dir)
1470 {
1471 len = strlen (dirs[files[1].dir]);
1472 p = frag_more (len + 1);
1473 memcpy (p, dirs[files[1].dir], len);
1474 p[len] = '/';
1475 }
48b91938
RH
1476 len = strlen (files[1].filename) + 1;
1477 p = frag_more (len);
1478 memcpy (p, files[1].filename, len);
1479
220e750f
RH
1480 /* DW_AT_comp_dir */
1481 comp_dir = getpwd ();
1482 len = strlen (comp_dir) + 1;
1483 p = frag_more (len);
1484 memcpy (p, comp_dir, len);
fac0d250 1485
220e750f
RH
1486 /* DW_AT_producer */
1487 sprintf (producer, "GNU AS %s", VERSION);
1488 len = strlen (producer) + 1;
1489 p = frag_more (len);
1490 memcpy (p, producer, len);
fac0d250 1491
220e750f
RH
1492 /* DW_AT_language. Yes, this is probably not really MIPS, but the
1493 dwarf2 draft has no standard code for assembler. */
1494 out_two (DW_LANG_Mips_Assembler);
1495
b7d6ed97 1496 symbol_set_value_now (info_end);
fac0d250
RH
1497}
1498
c6cb92c5
NS
1499/* Finish the dwarf2 debug sections. We emit .debug.line if there
1500 were any .file/.loc directives, or --gdwarf2 was given, or if the
1501 file has a non-empty .debug_info section. If we emit .debug_line,
1502 and the .debug_info section is empty, we also emit .debug_info,
1503 .debug_aranges and .debug_abbrev. ALL_SEGS will be non-null if
1504 there were any .file/.loc directives, or --gdwarf2 was given and
1505 there were any located instructions emitted. */
1506
fac0d250 1507void
a2e22468 1508dwarf2_finish (void)
fac0d250 1509{
220e750f
RH
1510 segT line_seg;
1511 struct line_seg *s;
c6cb92c5
NS
1512 segT info_seg;
1513 int emit_other_sections = 0;
1514
1515 info_seg = bfd_get_section_by_name (stdoutput, ".debug_info");
1516 emit_other_sections = info_seg == NULL || !seg_not_empty_p (info_seg);
fac0d250 1517
c6cb92c5
NS
1518 if (!all_segs && emit_other_sections)
1519 /* There is no line information and no non-empty .debug_info
1520 section. */
220e750f 1521 return;
fac0d250 1522
220e750f 1523 /* Calculate the size of an address for the target machine. */
9605f328 1524 sizeof_address = DWARF2_ADDR_SIZE (stdoutput);
fac0d250 1525
220e750f
RH
1526 /* Create and switch to the line number section. */
1527 line_seg = subseg_new (".debug_line", 0);
8a7140c3 1528 bfd_set_section_flags (stdoutput, line_seg, SEC_READONLY | SEC_DEBUGGING);
fac0d250 1529
220e750f 1530 /* For each subsection, chain the debug entries together. */
ee515fb7 1531 for (s = all_segs; s; s = s->next)
fac0d250 1532 {
220e750f
RH
1533 struct line_subseg *ss = s->head;
1534 struct line_entry **ptail = ss->ptail;
1535
1536 while ((ss = ss->next) != NULL)
1537 {
1538 *ptail = ss->head;
1539 ptail = ss->ptail;
1540 }
fac0d250 1541 }
85a39694 1542
220e750f 1543 out_debug_line (line_seg);
85a39694 1544
c6cb92c5
NS
1545 /* If this is assembler generated line info, and there is no
1546 debug_info already, we need .debug_info and .debug_abbrev
1547 sections as well. */
1548 if (emit_other_sections)
220e750f
RH
1549 {
1550 segT abbrev_seg;
220e750f 1551 segT aranges_seg;
4dc7ead9 1552
c6cb92c5
NS
1553 assert (all_segs);
1554
220e750f
RH
1555 info_seg = subseg_new (".debug_info", 0);
1556 abbrev_seg = subseg_new (".debug_abbrev", 0);
1557 aranges_seg = subseg_new (".debug_aranges", 0);
ef99799a 1558
8a7140c3
NC
1559 bfd_set_section_flags (stdoutput, info_seg,
1560 SEC_READONLY | SEC_DEBUGGING);
1561 bfd_set_section_flags (stdoutput, abbrev_seg,
1562 SEC_READONLY | SEC_DEBUGGING);
1563 bfd_set_section_flags (stdoutput, aranges_seg,
1564 SEC_READONLY | SEC_DEBUGGING);
ef99799a 1565
ee515fb7 1566 record_alignment (aranges_seg, ffs (2 * sizeof_address) - 1);
ef99799a 1567
220e750f
RH
1568 out_debug_aranges (aranges_seg, info_seg);
1569 out_debug_abbrev (abbrev_seg);
1570 out_debug_info (info_seg, abbrev_seg, line_seg);
1571 }
85a39694 1572}