* config/tc-xtensa.c (xg_assembly_relax): Increment steps_taken for
[deliverable/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;
fead5cd9 1061 symbolS *last_lab = NULL, *lab;
220e750f
RH
1062 struct line_entry *next;
1063
fead5cd9 1064 do
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 }
fead5cd9 1132 while (e);
353e2c69 1133
220e750f 1134 /* Emit a DW_LNE_end_sequence for the end of the section. */
07a53e5c
RH
1135 frag = last_frag_for_seg (seg);
1136 frag_ofs = get_frag_fix (frag);
220e750f 1137 if (frag == last_frag)
07a53e5c 1138 out_inc_line_addr (INT_MAX, frag_ofs - last_frag_ofs);
220e750f 1139 else
07a53e5c
RH
1140 {
1141 lab = symbol_temp_new (seg, frag_ofs, frag);
1142 relax_inc_line_addr (INT_MAX, lab, last_lab);
1143 }
fac0d250
RH
1144}
1145
220e750f
RH
1146/* Emit the directory and file tables for .debug_line. */
1147
fac0d250 1148static void
a2e22468 1149out_file_list (void)
fac0d250
RH
1150{
1151 size_t size;
1152 char *cp;
220e750f
RH
1153 unsigned int i;
1154
a7ed1ca2
NC
1155 /* Emit directory list. */
1156 for (i = 1; i < dirs_in_use; ++i)
1157 {
1158 size = strlen (dirs[i]) + 1;
1159 cp = frag_more (size);
1160 memcpy (cp, dirs[i], size);
1161 }
1162 /* Terminate it. */
220e750f 1163 out_byte ('\0');
fac0d250 1164
220e750f 1165 for (i = 1; i < files_in_use; ++i)
fac0d250 1166 {
249e3833
RH
1167 if (files[i].filename == NULL)
1168 {
0e389e77 1169 as_bad (_("unassigned file number %ld"), (long) i);
88b4ca40
RH
1170 /* Prevent a crash later, particularly for file 1. */
1171 files[i].filename = "";
249e3833
RH
1172 continue;
1173 }
1174
220e750f 1175 size = strlen (files[i].filename) + 1;
fac0d250 1176 cp = frag_more (size);
220e750f 1177 memcpy (cp, files[i].filename, size);
fac0d250 1178
220e750f 1179 out_uleb128 (files[i].dir); /* directory number */
fac0d250
RH
1180 out_uleb128 (0); /* last modification timestamp */
1181 out_uleb128 (0); /* filesize */
1182 }
353e2c69
KH
1183
1184 /* Terminate filename list. */
1185 out_byte (0);
fac0d250
RH
1186}
1187
220e750f
RH
1188/* Emit the collected .debug_line data. */
1189
1190static void
a2e22468 1191out_debug_line (segT line_seg)
220e750f
RH
1192{
1193 expressionS expr;
1194 symbolS *line_start;
1195 symbolS *prologue_end;
1196 symbolS *line_end;
1197 struct line_seg *s;
14e777e0
KB
1198 enum dwarf2_format d2f;
1199 int sizeof_offset;
220e750f
RH
1200
1201 subseg_set (line_seg, 0);
1202
b7d6ed97
RH
1203 line_start = symbol_temp_new_now ();
1204 prologue_end = symbol_temp_make ();
1205 line_end = symbol_temp_make ();
220e750f
RH
1206
1207 /* Total length of the information for this compilation unit. */
1208 expr.X_op = O_subtract;
1209 expr.X_add_symbol = line_end;
1210 expr.X_op_symbol = line_start;
14e777e0
KB
1211
1212 d2f = DWARF2_FORMAT ();
1213 if (d2f == dwarf2_format_32bit)
1214 {
1215 expr.X_add_number = -4;
1216 emit_expr (&expr, 4);
1217 sizeof_offset = 4;
1218 }
1219 else if (d2f == dwarf2_format_64bit)
1220 {
1221 expr.X_add_number = -12;
1222 out_four (-1);
1223 emit_expr (&expr, 8);
1224 sizeof_offset = 8;
1225 }
1226 else if (d2f == dwarf2_format_64bit_irix)
1227 {
1228 expr.X_add_number = -8;
1229 emit_expr (&expr, 8);
1230 sizeof_offset = 8;
1231 }
1232 else
1233 {
1234 as_fatal (_("internal error: unknown dwarf2 format"));
1235 }
220e750f
RH
1236
1237 /* Version. */
1238 out_two (2);
1239
1240 /* Length of the prologue following this length. */
1241 expr.X_op = O_subtract;
1242 expr.X_add_symbol = prologue_end;
1243 expr.X_op_symbol = line_start;
1244 expr.X_add_number = - (4 + 2 + 4);
14e777e0 1245 emit_expr (&expr, sizeof_offset);
220e750f
RH
1246
1247 /* Parameters of the state machine. */
1248 out_byte (DWARF2_LINE_MIN_INSN_LENGTH);
1249 out_byte (DWARF2_LINE_DEFAULT_IS_STMT);
1250 out_byte (DWARF2_LINE_BASE);
1251 out_byte (DWARF2_LINE_RANGE);
1252 out_byte (DWARF2_LINE_OPCODE_BASE);
1253
1254 /* Standard opcode lengths. */
1255 out_byte (0); /* DW_LNS_copy */
1256 out_byte (1); /* DW_LNS_advance_pc */
1257 out_byte (1); /* DW_LNS_advance_line */
1258 out_byte (1); /* DW_LNS_set_file */
1259 out_byte (1); /* DW_LNS_set_column */
1260 out_byte (0); /* DW_LNS_negate_stmt */
1261 out_byte (0); /* DW_LNS_set_basic_block */
1262 out_byte (0); /* DW_LNS_const_add_pc */
1263 out_byte (1); /* DW_LNS_fixed_advance_pc */
bd0eb99b
RH
1264 out_byte (0); /* DW_LNS_set_prologue_end */
1265 out_byte (0); /* DW_LNS_set_epilogue_begin */
1266 out_byte (1); /* DW_LNS_set_isa */
220e750f
RH
1267
1268 out_file_list ();
1269
b7d6ed97 1270 symbol_set_value_now (prologue_end);
220e750f
RH
1271
1272 /* For each section, emit a statement program. */
ee515fb7 1273 for (s = all_segs; s; s = s->next)
220e750f
RH
1274 process_entries (s->seg, s->head->head);
1275
b7d6ed97 1276 symbol_set_value_now (line_end);
220e750f
RH
1277}
1278
1279/* Emit data for .debug_aranges. */
1280
58b5739a 1281static void
a2e22468 1282out_debug_aranges (segT aranges_seg, segT info_seg)
fac0d250 1283{
220e750f
RH
1284 unsigned int addr_size = sizeof_address;
1285 addressT size, skip;
1286 struct line_seg *s;
1287 expressionS expr;
1288 char *p;
fac0d250 1289
220e750f 1290 size = 4 + 2 + 4 + 1 + 1;
fac0d250 1291
ee515fb7
KH
1292 skip = 2 * addr_size - (size & (2 * addr_size - 1));
1293 if (skip == 2 * addr_size)
220e750f
RH
1294 skip = 0;
1295 size += skip;
fac0d250 1296
ee515fb7
KH
1297 for (s = all_segs; s; s = s->next)
1298 size += 2 * addr_size;
fac0d250 1299
ee515fb7 1300 size += 2 * addr_size;
fac0d250 1301
220e750f 1302 subseg_set (aranges_seg, 0);
fac0d250 1303
220e750f
RH
1304 /* Length of the compilation unit. */
1305 out_four (size - 4);
fac0d250 1306
220e750f
RH
1307 /* Version. */
1308 out_two (2);
4dc7ead9 1309
220e750f 1310 /* Offset to .debug_info. */
6174d9c8
RH
1311 /* ??? sizeof_offset */
1312 TC_DWARF2_EMIT_OFFSET (section_symbol (info_seg), 4);
220e750f
RH
1313
1314 /* Size of an address (offset portion). */
1315 out_byte (addr_size);
1316
1317 /* Size of a segment descriptor. */
1318 out_byte (0);
1319
1320 /* Align the header. */
1321 if (skip)
ee515fb7 1322 frag_align (ffs (2 * addr_size) - 1, 0, 0);
4dc7ead9 1323
ee515fb7 1324 for (s = all_segs; s; s = s->next)
220e750f
RH
1325 {
1326 fragS *frag;
1327 symbolS *beg, *end;
1328
1329 frag = first_frag_for_seg (s->seg);
b7d6ed97 1330 beg = symbol_temp_new (s->seg, 0, frag);
220e750f
RH
1331 s->text_start = beg;
1332
1333 frag = last_frag_for_seg (s->seg);
b7d6ed97 1334 end = symbol_temp_new (s->seg, get_frag_fix (frag), frag);
220e750f
RH
1335 s->text_end = end;
1336
1337 expr.X_op = O_symbol;
1338 expr.X_add_symbol = beg;
1339 expr.X_add_number = 0;
1340 emit_expr (&expr, addr_size);
1341
1342 expr.X_op = O_subtract;
1343 expr.X_add_symbol = end;
1344 expr.X_op_symbol = beg;
1345 expr.X_add_number = 0;
1346 emit_expr (&expr, addr_size);
1347 }
4dc7ead9 1348
220e750f
RH
1349 p = frag_more (2 * addr_size);
1350 md_number_to_chars (p, 0, addr_size);
1351 md_number_to_chars (p + addr_size, 0, addr_size);
4dc7ead9
RH
1352}
1353
220e750f
RH
1354/* Emit data for .debug_abbrev. Note that this must be kept in
1355 sync with out_debug_info below. */
fac0d250 1356
220e750f 1357static void
a2e22468 1358out_debug_abbrev (segT abbrev_seg)
220e750f
RH
1359{
1360 subseg_set (abbrev_seg, 0);
fac0d250 1361
220e750f
RH
1362 out_uleb128 (1);
1363 out_uleb128 (DW_TAG_compile_unit);
1364 out_byte (DW_CHILDREN_no);
1365 out_abbrev (DW_AT_stmt_list, DW_FORM_data4);
1366 if (all_segs->next == NULL)
4dc7ead9 1367 {
220e750f
RH
1368 out_abbrev (DW_AT_low_pc, DW_FORM_addr);
1369 out_abbrev (DW_AT_high_pc, DW_FORM_addr);
1370 }
48b91938 1371 out_abbrev (DW_AT_name, DW_FORM_string);
220e750f
RH
1372 out_abbrev (DW_AT_comp_dir, DW_FORM_string);
1373 out_abbrev (DW_AT_producer, DW_FORM_string);
1374 out_abbrev (DW_AT_language, DW_FORM_data2);
1375 out_abbrev (0, 0);
a987bfc9
RH
1376
1377 /* Terminate the abbreviations for this compilation unit. */
1378 out_byte (0);
220e750f 1379}
4dc7ead9 1380
220e750f 1381/* Emit a description of this compilation unit for .debug_info. */
4dc7ead9 1382
220e750f 1383static void
a2e22468 1384out_debug_info (segT info_seg, segT abbrev_seg, segT line_seg)
220e750f
RH
1385{
1386 char producer[128];
1387 char *comp_dir;
1388 expressionS expr;
1389 symbolS *info_start;
1390 symbolS *info_end;
1391 char *p;
1392 int len;
14e777e0
KB
1393 enum dwarf2_format d2f;
1394 int sizeof_offset;
4dc7ead9 1395
220e750f 1396 subseg_set (info_seg, 0);
4dc7ead9 1397
b7d6ed97
RH
1398 info_start = symbol_temp_new_now ();
1399 info_end = symbol_temp_make ();
4dc7ead9 1400
220e750f
RH
1401 /* Compilation Unit length. */
1402 expr.X_op = O_subtract;
1403 expr.X_add_symbol = info_end;
1404 expr.X_op_symbol = info_start;
14e777e0
KB
1405
1406 d2f = DWARF2_FORMAT ();
1407 if (d2f == dwarf2_format_32bit)
1408 {
1409 expr.X_add_number = -4;
1410 emit_expr (&expr, 4);
1411 sizeof_offset = 4;
1412 }
1413 else if (d2f == dwarf2_format_64bit)
1414 {
1415 expr.X_add_number = -12;
1416 out_four (-1);
1417 emit_expr (&expr, 8);
1418 sizeof_offset = 8;
1419 }
1420 else if (d2f == dwarf2_format_64bit_irix)
1421 {
1422 expr.X_add_number = -8;
1423 emit_expr (&expr, 8);
1424 sizeof_offset = 8;
1425 }
1426 else
1427 {
1428 as_fatal (_("internal error: unknown dwarf2 format"));
1429 }
4dc7ead9 1430
220e750f
RH
1431 /* DWARF version. */
1432 out_two (2);
4dc7ead9 1433
220e750f 1434 /* .debug_abbrev offset */
6174d9c8 1435 TC_DWARF2_EMIT_OFFSET (section_symbol (abbrev_seg), sizeof_offset);
4dc7ead9 1436
220e750f
RH
1437 /* Target address size. */
1438 out_byte (sizeof_address);
fac0d250 1439
220e750f
RH
1440 /* DW_TAG_compile_unit DIE abbrev */
1441 out_uleb128 (1);
fac0d250 1442
220e750f 1443 /* DW_AT_stmt_list */
6174d9c8
RH
1444 /* ??? sizeof_offset */
1445 TC_DWARF2_EMIT_OFFSET (section_symbol (line_seg), 4);
fac0d250 1446
220e750f
RH
1447 /* These two attributes may only be emitted if all of the code is
1448 contiguous. Multiple sections are not that. */
1449 if (all_segs->next == NULL)
58b5739a 1450 {
220e750f
RH
1451 /* DW_AT_low_pc */
1452 expr.X_op = O_symbol;
1453 expr.X_add_symbol = all_segs->text_start;
1454 expr.X_add_number = 0;
1455 emit_expr (&expr, sizeof_address);
1456
1457 /* DW_AT_high_pc */
1458 expr.X_op = O_symbol;
1459 expr.X_add_symbol = all_segs->text_end;
1460 expr.X_add_number = 0;
1461 emit_expr (&expr, sizeof_address);
58b5739a
RH
1462 }
1463
48b91938
RH
1464 /* DW_AT_name. We don't have the actual file name that was present
1465 on the command line, so assume files[1] is the main input file.
1466 We're not supposed to get called unless at least one line number
1467 entry was emitted, so this should always be defined. */
1468 if (!files || files_in_use < 1)
1469 abort ();
a7ed1ca2
NC
1470 if (files[1].dir)
1471 {
1472 len = strlen (dirs[files[1].dir]);
1473 p = frag_more (len + 1);
1474 memcpy (p, dirs[files[1].dir], len);
1475 p[len] = '/';
1476 }
48b91938
RH
1477 len = strlen (files[1].filename) + 1;
1478 p = frag_more (len);
1479 memcpy (p, files[1].filename, len);
1480
220e750f
RH
1481 /* DW_AT_comp_dir */
1482 comp_dir = getpwd ();
1483 len = strlen (comp_dir) + 1;
1484 p = frag_more (len);
1485 memcpy (p, comp_dir, len);
fac0d250 1486
220e750f
RH
1487 /* DW_AT_producer */
1488 sprintf (producer, "GNU AS %s", VERSION);
1489 len = strlen (producer) + 1;
1490 p = frag_more (len);
1491 memcpy (p, producer, len);
fac0d250 1492
220e750f
RH
1493 /* DW_AT_language. Yes, this is probably not really MIPS, but the
1494 dwarf2 draft has no standard code for assembler. */
1495 out_two (DW_LANG_Mips_Assembler);
1496
b7d6ed97 1497 symbol_set_value_now (info_end);
fac0d250
RH
1498}
1499
c6cb92c5
NS
1500/* Finish the dwarf2 debug sections. We emit .debug.line if there
1501 were any .file/.loc directives, or --gdwarf2 was given, or if the
1502 file has a non-empty .debug_info section. If we emit .debug_line,
1503 and the .debug_info section is empty, we also emit .debug_info,
1504 .debug_aranges and .debug_abbrev. ALL_SEGS will be non-null if
1505 there were any .file/.loc directives, or --gdwarf2 was given and
1506 there were any located instructions emitted. */
1507
fac0d250 1508void
a2e22468 1509dwarf2_finish (void)
fac0d250 1510{
220e750f
RH
1511 segT line_seg;
1512 struct line_seg *s;
c6cb92c5
NS
1513 segT info_seg;
1514 int emit_other_sections = 0;
1515
1516 info_seg = bfd_get_section_by_name (stdoutput, ".debug_info");
1517 emit_other_sections = info_seg == NULL || !seg_not_empty_p (info_seg);
fac0d250 1518
c6cb92c5
NS
1519 if (!all_segs && emit_other_sections)
1520 /* There is no line information and no non-empty .debug_info
1521 section. */
220e750f 1522 return;
fac0d250 1523
220e750f 1524 /* Calculate the size of an address for the target machine. */
9605f328 1525 sizeof_address = DWARF2_ADDR_SIZE (stdoutput);
fac0d250 1526
220e750f
RH
1527 /* Create and switch to the line number section. */
1528 line_seg = subseg_new (".debug_line", 0);
8a7140c3 1529 bfd_set_section_flags (stdoutput, line_seg, SEC_READONLY | SEC_DEBUGGING);
fac0d250 1530
220e750f 1531 /* For each subsection, chain the debug entries together. */
ee515fb7 1532 for (s = all_segs; s; s = s->next)
fac0d250 1533 {
220e750f
RH
1534 struct line_subseg *ss = s->head;
1535 struct line_entry **ptail = ss->ptail;
1536
1537 while ((ss = ss->next) != NULL)
1538 {
1539 *ptail = ss->head;
1540 ptail = ss->ptail;
1541 }
fac0d250 1542 }
85a39694 1543
220e750f 1544 out_debug_line (line_seg);
85a39694 1545
c6cb92c5
NS
1546 /* If this is assembler generated line info, and there is no
1547 debug_info already, we need .debug_info and .debug_abbrev
1548 sections as well. */
1549 if (emit_other_sections)
220e750f
RH
1550 {
1551 segT abbrev_seg;
220e750f 1552 segT aranges_seg;
4dc7ead9 1553
c6cb92c5
NS
1554 assert (all_segs);
1555
220e750f
RH
1556 info_seg = subseg_new (".debug_info", 0);
1557 abbrev_seg = subseg_new (".debug_abbrev", 0);
1558 aranges_seg = subseg_new (".debug_aranges", 0);
ef99799a 1559
8a7140c3
NC
1560 bfd_set_section_flags (stdoutput, info_seg,
1561 SEC_READONLY | SEC_DEBUGGING);
1562 bfd_set_section_flags (stdoutput, abbrev_seg,
1563 SEC_READONLY | SEC_DEBUGGING);
1564 bfd_set_section_flags (stdoutput, aranges_seg,
1565 SEC_READONLY | SEC_DEBUGGING);
ef99799a 1566
ee515fb7 1567 record_alignment (aranges_seg, ffs (2 * sizeof_address) - 1);
ef99799a 1568
220e750f
RH
1569 out_debug_aranges (aranges_seg, info_seg);
1570 out_debug_abbrev (abbrev_seg);
1571 out_debug_info (info_seg, abbrev_seg, line_seg);
1572 }
85a39694 1573}
This page took 0.369227 seconds and 4 git commands to generate.