1 /* dwarf2dbg.c - DWARF2 debug support
2 Copyright (C) 1999, 2000 Free Software Foundation, Inc.
3 Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
5 This file is part of GAS, the GNU Assembler.
7 GAS is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
12 GAS is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GAS; see the file COPYING. If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
22 /* Logical line numbers can be controlled by the compiler via the
23 following two directives:
26 .loc FILENO LINENO [COLUMN]
28 FILENO is the filenumber. */
33 #include "dwarf2dbg.h"
36 #include "elf/dwarf2.h"
38 /* Since we can't generate the prolog until the body is complete, we
39 use three different subsegments for .debug_line: one holding the
40 prolog, one for the directory and filename info, and one for the
41 body ("statement program"). */
46 /* First special line opcde - leave room for the standard opcodes.
47 Note: If you want to change this, you'll have to update the
48 "standard_opcode_lengths" table that is emitted below in
50 #define DWARF2_LINE_OPCODE_BASE 10
52 #ifndef DWARF2_LINE_BASE
53 /* Minimum line offset in a special line info. opcode. This value
54 was chosen to give a reasonable range of values. */
55 # define DWARF2_LINE_BASE -5
58 /* Range of line offsets in a special line info. opcode. */
59 #ifndef DWARF2_LINE_RANGE
60 # define DWARF2_LINE_RANGE 14
63 #ifndef DWARF2_LINE_MIN_INSN_LENGTH
64 /* Define the architecture-dependent minimum instruction length (in
65 bytes). This value should be rather too small than too big. */
66 # define DWARF2_LINE_MIN_INSN_LENGTH 1
69 /* Flag that indicates the initial value of the is_stmt_start flag.
70 In the present implementation, we do not mark any lines as
71 the beginning of a source statement, because that information
72 is not made available by the GCC front-end. */
73 #define DWARF2_LINE_DEFAULT_IS_STMT 1
75 /* Flag that indicates the initial value of the is_stmt_start flag.
76 In the present implementation, we do not mark any lines as
77 the beginning of a source statement, because that information
78 is not made available by the GCC front-end. */
79 #define DWARF2_LINE_DEFAULT_IS_STMT 1
81 /* Given a special op, return the line skip amount. */
82 #define SPECIAL_LINE(op) \
83 (((op) - DWARF2_LINE_OPCODE_BASE)%DWARF2_LINE_RANGE + DWARF2_LINE_BASE)
85 /* Given a special op, return the address skip amount (in units of
86 DWARF2_LINE_MIN_INSN_LENGTH. */
87 #define SPECIAL_ADDR(op) (((op) - DWARF2_LINE_OPCODE_BASE)/DWARF2_LINE_RANGE)
89 /* The maximum address skip amount that can be encoded with a special op. */
90 #define MAX_SPECIAL_ADDR_DELTA SPECIAL_ADDR(255)
92 #define INITIAL_STATE \
93 /* Initialize as per DWARF2.0 standard. */ \
98 DWARF2_LINE_DEFAULT_IS_STMT, /* is_stmt */ \
99 0, /* basic_block */ \
100 1 /* empty_sequence */
103 /* state machine state as per DWARF2 manual: */
106 unsigned int filenum
;
112 empty_sequence
: 1; /* current code sequence has no DWARF2 directives? */
116 any_dwarf2_directives
: 1; /* did we emit any DWARF2 line debug directives? */
118 fragS
* frag
; /* frag that "addr" is relative to */
119 segT text_seg
; /* text segment "addr" is relative to */
121 segT line_seg
; /* ".debug_line" segment */
122 int last_filename
; /* index of last filename that was used */
123 int num_filenames
; /* index of last filename in use */
124 int filename_len
; /* length of the filename array */
126 int dir
; /* valid after gen_dir_list() only */
127 char *name
; /* full path before gen_dir_list(), filename afterwards */
130 struct dwarf2_line_info current
; /* current source info */
132 /* counters for statistical purposes */
133 unsigned int num_line_entries
;
134 unsigned int opcode_hist
[256]; /* histogram of opcode frequencies */
148 { NULL
, 0, 0, 0, 0 },
151 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
152 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
153 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
154 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
155 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
156 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
157 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
158 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
159 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
160 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
161 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
162 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
163 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
164 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
165 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
166 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
170 /* Function prototypes. */
171 static void out_uleb128
PARAMS ((addressT
));
172 static void out_sleb128
PARAMS ((offsetT
));
173 static void gen_addr_line
PARAMS ((int, addressT
));
174 static void reset_state_machine
PARAMS ((void));
175 static void out_set_addr
PARAMS ((addressT
));
176 static void out_end_sequence
PARAMS ((void));
177 static int get_filenum
PARAMS ((int, char *));
178 static void gen_dir_list
PARAMS ((void));
179 static void gen_file_list
PARAMS ((void));
180 static void print_stats
PARAMS ((unsigned long));
181 static addressT now_subseg_size
PARAMS ((void));
183 #define out_byte(byte) FRAG_APPEND_1_CHAR(byte)
184 #define out_opcode(opc) (out_byte ((opc)), ++ls.opcode_hist[(opc) & 0xff])
186 /* Output an unsigned "little-endian base 128" number. */
192 unsigned char byte
, more
= 0x80;
200 out_byte (more
| byte
);
205 /* Output a signed "little-endian base 128" number. */
211 unsigned char byte
, more
= 0x80;
217 if (((value
== 0) && ((byte
& 0x40) == 0))
218 || ((value
== -1) && ((byte
& 0x40) != 0)))
220 out_byte (more
| byte
);
225 /* Encode a pair of line and address skips as efficiently as possible.
226 Note that the line skip is signed, whereas the address skip is
230 gen_addr_line (line_delta
, addr_delta
)
234 unsigned int tmp
, opcode
;
236 tmp
= line_delta
- DWARF2_LINE_BASE
;
238 if (tmp
>= DWARF2_LINE_RANGE
)
240 out_opcode (DW_LNS_advance_line
);
241 out_sleb128 (line_delta
);
242 tmp
= 0 - DWARF2_LINE_BASE
;
246 tmp
+= DWARF2_LINE_OPCODE_BASE
;
248 /* Try using a special opcode. */
249 opcode
= tmp
+ addr_delta
* DWARF2_LINE_RANGE
;
256 /* Try using DW_LNS_const_add_pc followed by special op. */
257 opcode
= tmp
+ (addr_delta
- MAX_SPECIAL_ADDR_DELTA
) * DWARF2_LINE_RANGE
;
260 out_opcode (DW_LNS_const_add_pc
);
265 out_opcode (DW_LNS_advance_pc
);
266 out_uleb128 (addr_delta
);
269 /* Output line-delta. */
272 /* Append new row with current info. */
273 out_opcode (DW_LNS_copy
);
277 reset_state_machine ()
279 static const struct dwarf2_sm initial_state
= { INITIAL_STATE
};
281 ls
.sm
= initial_state
;
284 /* Set an absolute address (may results in a relocation entry). */
290 subsegT saved_subseg
;
294 int bytes_per_address
;
297 saved_subseg
= now_subseg
;
299 subseg_set (ls
.text_seg
, ls
.text_subseg
);
300 sym
= symbol_new (".L0\001", now_seg
, addr
, frag_now
);
302 subseg_set (saved_seg
, saved_subseg
);
305 bytes_per_address
= bfd_arch_bits_per_address (stdoutput
) / 8;
308 bytes_per_address
= 4;
311 out_opcode (DW_LNS_extended_op
);
312 out_uleb128 (bytes_per_address
+ 1);
314 out_opcode (DW_LNE_set_address
);
315 expr
.X_op
= O_symbol
;
316 expr
.X_add_symbol
= sym
;
317 expr
.X_add_number
= 0;
318 emit_expr (&expr
, bytes_per_address
);
321 /* Emit DW_LNS_end_sequence and reset state machine. Does not
322 preserve the current segment/sub-segment! */
327 addressT addr
, delta
;
332 subseg_set (ls
.text_seg
, ls
.text_subseg
);
333 #ifdef md_current_text_addr
334 addr
= md_current_text_addr ();
336 addr
= frag_now_fix ();
338 text_frag
= frag_now
;
339 subseg_set (ls
.line_seg
, DL_BODY
);
340 if (text_frag
!= ls
.frag
)
348 delta
= (addr
- ls
.sm
.addr
) / DWARF2_LINE_MIN_INSN_LENGTH
;
351 /* Advance address without updating the line-debug
352 matrix---the end_sequence entry is used only to tell
353 the debugger the end of the sequence. */
354 out_opcode (DW_LNS_advance_pc
);
360 subseg_set (ls
.line_seg
, DL_BODY
);
362 out_opcode (DW_LNS_extended_op
);
364 out_byte (DW_LNE_end_sequence
);
366 reset_state_machine ();
369 /* Look up a filenumber either by filename or by filenumber. If both
370 a filenumber and a filename are specified, lookup by filename takes
371 precedence. If the filename cannot be found, it is added to the
372 filetable and the filenumber for the new entry is returned. */
375 get_filenum (filenum
, file
)
379 int i
, last
= filenum
- 1;
380 char char0
= file
[0];
382 /* If filenum is out of range of the filename table, then try using the
383 table entry returned from the previous call. */
384 if (last
>= ls
.num_filenames
|| last
< 0)
385 last
= ls
.last_filename
;
387 /* Do a quick check against the specified or previously used filenum. */
388 if (ls
.num_filenames
> 0 && ls
.file
[last
].name
[0] == char0
389 && strcmp (ls
.file
[last
].name
+ 1, file
+ 1) == 0)
392 /* No match, fall back to simple linear scan. */
393 for (i
= 0; i
< ls
.num_filenames
; ++i
)
395 if (ls
.file
[i
].name
[0] == char0
396 && strcmp (ls
.file
[i
].name
+ 1, file
+ 1) == 0)
398 ls
.last_filename
= i
;
403 /* No match, enter new filename. */
404 if (ls
.num_filenames
>= ls
.filename_len
)
406 ls
.filename_len
+= 13;
407 ls
.file
= xrealloc (ls
.file
, ls
.filename_len
* sizeof (ls
.file
[0]));
409 ls
.file
[ls
.num_filenames
].dir
= 0;
410 ls
.file
[ls
.num_filenames
].name
= file
;
411 ls
.last_filename
= ls
.num_filenames
;
412 return ++ls
.num_filenames
;
415 /* Emit an entry in the line number table if the address or line has changed.
416 ADDR is relative to the current frag in the text section. */
419 dwarf2_gen_line_info (addr
, l
)
421 struct dwarf2_line_info
*l
;
423 unsigned int filenum
= l
->filenum
;
424 unsigned int any_output
= 0;
425 subsegT saved_subseg
;
430 fprintf (stderr
, "line: addr %lx file `%s' line %u col %u flags %x\n",
431 (unsigned long) addr
, l
->filename
, l
->line
, l
->column
, l
->flags
);
433 if (filenum
> 0 && !l
->filename
)
435 if (filenum
>= (unsigned int) ls
.num_filenames
)
437 as_warn ("Encountered bad file number in line number debug info!");
441 else if (l
->filename
)
442 filenum
= get_filenum (filenum
, l
->filename
);
444 /* No filename, no filnum => no play. */
447 /* Early out for as-yet incomplete location information. */
451 /* Must save these before the subseg_new call, as that call will change
454 saved_subseg
= now_subseg
;
455 saved_frag
= frag_now
;
463 ls
.line_seg
= subseg_new (".debug_line", 0);
466 bfd_set_section_flags (stdoutput
, ls
.line_seg
, SEC_READONLY
);
468 /* We're going to need this symbol. */
469 secsym
= symbol_find (".debug_line");
471 symbol_set_bfdsym (secsym
, ls
.line_seg
->symbol
);
473 symbol_table_insert (section_symbol (ls
.line_seg
));
477 subseg_set (ls
.line_seg
, DL_BODY
);
479 if (ls
.text_seg
!= saved_seg
|| ls
.text_subseg
!= saved_subseg
)
481 if (!ls
.sm
.empty_sequence
)
483 /* Terminate previous sequence. */
485 ls
.sm
.empty_sequence
= 1;
488 ls
.text_seg
= saved_seg
;
489 ls
.text_subseg
= saved_subseg
;
492 ls
.frag
= saved_frag
;
495 if (ls
.sm
.filenum
!= filenum
)
498 out_opcode (DW_LNS_set_file
);
499 out_uleb128 (filenum
);
500 ls
.sm
.filenum
= filenum
;
503 if (ls
.sm
.column
!= l
->column
)
506 out_opcode (DW_LNS_set_column
);
507 out_uleb128 (l
->column
);
508 ls
.sm
.column
= l
->column
;
511 if (((l
->flags
& DWARF2_FLAG_BEGIN_STMT
) != 0) != ls
.sm
.is_stmt
)
514 out_opcode (DW_LNS_negate_stmt
);
517 if (l
->flags
& DWARF2_FLAG_BEGIN_BLOCK
)
520 out_opcode (DW_LNS_set_basic_block
);
523 if (ls
.sm
.line
!= l
->line
)
526 if (saved_frag
!= ls
.frag
)
528 /* If a new frag got allocated (for whatever reason), then
529 deal with it by generating a reference symbol. Note: no
530 end_sequence needs to be generated because the address did
531 not really decrease (only the reference point changed). */
534 ls
.frag
= saved_frag
;
536 gen_addr_line (l
->line
- ls
.sm
.line
,
537 (addr
- ls
.sm
.addr
) / DWARF2_LINE_MIN_INSN_LENGTH
);
538 ls
.sm
.basic_block
= 0;
539 ls
.sm
.line
= l
->line
;
543 subseg_set (saved_seg
, saved_subseg
);
545 ls
.num_line_entries
+= any_output
;
547 ls
.sm
.empty_sequence
= 0;
553 char *str
, *slash
, *dir_list
, *dp
, *cp
;
556 dir_list
= frag_more (0);
559 for (i
= 0; i
< ls
.num_filenames
; ++i
)
561 str
= ls
.file
[i
].name
;
562 slash
= strrchr (str
, '/');
566 for (j
= 0, dp
= dir_list
; j
< num_dirs
; ++j
)
568 if (strcmp (str
, dp
) == 0)
570 ls
.file
[i
].dir
= j
+ 1;
577 /* Didn't find this directory: append it to the list. */
578 size_t size
= strlen (str
) + 1;
579 cp
= frag_more (size
);
580 memcpy (cp
, str
, size
);
581 ls
.file
[i
].dir
= ++num_dirs
;
584 ls
.file
[i
].name
= slash
+ 1;
588 /* Terminate directory list. */
599 for (i
= 0; i
< ls
.num_filenames
; ++i
)
601 size
= strlen (ls
.file
[i
].name
) + 1;
602 cp
= frag_more (size
);
603 memcpy (cp
, ls
.file
[i
].name
, size
);
605 out_uleb128 (ls
.file
[i
].dir
); /* directory number */
606 out_uleb128 (0); /* last modification timestamp */
607 out_uleb128 (0); /* filesize */
610 /* Terminate filename list. */
615 print_stats (total_size
)
616 unsigned long total_size
;
618 static const char *opc_name
[] = {
619 "extended", "copy", "advance_pc", "advance_line", "set_file",
620 "set_column", "negate_stmt", "set_basic_block", "const_add_pc",
626 fprintf (stderr
, "Average size: %g bytes/line\n",
627 total_size
/ (double) ls
.num_line_entries
);
629 fprintf (stderr
, "\nStandard opcode histogram:\n");
631 for (i
= 0; i
< sizeof (opc_name
) / sizeof (opc_name
[0]); ++i
)
633 fprintf (stderr
, "%s", opc_name
[i
]);
634 for (j
= strlen (opc_name
[i
]); j
< 16; ++j
)
635 fprintf (stderr
, " ");
636 fprintf (stderr
, ": %u\n", ls
.opcode_hist
[i
]);
639 fprintf (stderr
, "\nSpecial opcodes:\naddr\t\t\t\tline skip\n");
641 fprintf (stderr
, "skip: ");
642 for (j
= DWARF2_LINE_BASE
; j
< DWARF2_LINE_BASE
+ DWARF2_LINE_RANGE
; ++j
)
643 fprintf (stderr
, "%3d", j
);
644 fprintf (stderr
, "\n-----");
648 j
= SPECIAL_LINE (i
);
649 if (j
== DWARF2_LINE_BASE
)
650 fprintf (stderr
, "\n%4u: ",
651 (unsigned int) (DWARF2_LINE_MIN_INSN_LENGTH
652 * SPECIAL_ADDR (i
)));
653 fprintf (stderr
, " %2u", ls
.opcode_hist
[i
]);
655 fprintf (stderr
, "\n");
658 /* Compute the size of the current subsegment, taking all fragments
659 into account. Note that we don't generate variant frags, so the
660 fixed portion is all we need to consider. */
668 for (f
= frchain_now
->frch_root
; f
; f
= f
->fr_next
)
671 return size
+ frag_now_fix_octets ();
677 addressT body_size
, total_size
, prolog_size
;
678 subsegT saved_subseg
;
683 /* No .debug_line segment, no work to do. */
687 saved_subseg
= now_subseg
;
689 if (!ls
.sm
.empty_sequence
)
691 subseg_set (ls
.line_seg
, DL_BODY
);
692 total_size
= body_size
= now_subseg_size ();
694 /* Now generate the directory and file lists. */
695 subseg_set (ls
.line_seg
, DL_FILES
);
698 total_size
+= now_subseg_size ();
700 /* And now the header ("statement program prolog", in DWARF2 lingo...). */
701 subseg_set (ls
.line_seg
, DL_PROLOG
);
703 cp
= frag_more (15 + DWARF2_LINE_OPCODE_BASE
- 1);
705 total_size
+= now_subseg_size ();
706 prolog_size
= total_size
- body_size
- 10;
708 #define STUFF(val,size) \
710 md_number_to_chars (cp, val, size); \
714 STUFF (total_size
- 4, 4); /* length */
715 STUFF (2, 2); /* version */
716 STUFF (prolog_size
, 4); /* prologue_length */
717 STUFF (DWARF2_LINE_MIN_INSN_LENGTH
, 1);
718 STUFF (DWARF2_LINE_DEFAULT_IS_STMT
, 1);
719 STUFF (DWARF2_LINE_BASE
, 1);
720 STUFF (DWARF2_LINE_RANGE
, 1);
721 STUFF (DWARF2_LINE_OPCODE_BASE
, 1);
723 /* standard_opcode_lengths: */
724 STUFF (0, 1); /* DW_LNS_copy */
725 STUFF (1, 1); /* DW_LNS_advance_pc */
726 STUFF (1, 1); /* DW_LNS_advance_line */
727 STUFF (1, 1); /* DW_LNS_set_file */
728 STUFF (1, 1); /* DW_LNS_set_column */
729 STUFF (0, 1); /* DW_LNS_negate_stmt */
730 STUFF (0, 1); /* DW_LNS_set_basic_block */
731 STUFF (0, 1); /* DW_LNS_const_add_pc */
732 STUFF (1, 1); /* DW_LNS_fixed_advance_pc */
736 /* If this is assembler generated line info, add a .debug_info
738 if (debug_type
== DEBUG_DWARF2
)
740 segT info_seg
= subseg_new (".debug_info", 0);
741 segT abbrev_seg
= subseg_new (".debug_abbrev", 0);
745 bfd_set_section_flags (stdoutput
, info_seg
, SEC_READONLY
);
746 bfd_set_section_flags (stdoutput
, abbrev_seg
, SEC_READONLY
);
749 subseg_set (info_seg
, 0);
752 #define STUFF(val, size) \
754 cp = frag_more (size); \
755 md_number_to_chars (cp, (val), (size)); \
758 STUFF (2, 2); /* Dwarf version */
759 STUFF (0, 4); /* Offset into (final!) .debug_abbrev. */
763 STUFF (bfd_arch_bits_per_address (stdoutput
) / 8, 1);
768 /* FIXME: Add a DW_TAG_compile_unit DIE. The line info cannot
769 even be seen without it. */
771 /* Set size of debug_info. */
772 md_number_to_chars (len
, now_subseg_size () - 4, 4);
775 subseg_set (saved_seg
, saved_subseg
);
778 print_stats (total_size
);
782 dwarf2_directive_file (dummy
)
783 int dummy ATTRIBUTE_UNUSED
;
787 /* Continue to accept a bare string and pass it off. */
789 if (*input_line_pointer
== '"')
795 ls
.any_dwarf2_directives
= 1;
797 ls
.current
.filenum
= get_absolute_expression ();
798 ls
.current
.filename
= demand_copy_C_string (&len
);
800 demand_empty_rest_of_line ();
804 dwarf2_directive_loc (dummy
)
805 int dummy ATTRIBUTE_UNUSED
;
807 ls
.any_dwarf2_directives
= 1;
809 ls
.current
.filenum
= get_absolute_expression ();
811 ls
.current
.line
= get_absolute_expression ();
813 ls
.current
.column
= get_absolute_expression ();
814 demand_empty_rest_of_line ();
816 ls
.current
.flags
= DWARF2_FLAG_BEGIN_STMT
;
820 listing_source_line (ls
.current
.line
);
826 struct dwarf2_line_info
*line
;
828 if (debug_type
== DEBUG_DWARF2
)
830 as_where (&line
->filename
, &line
->line
);
833 line
->flags
= DWARF2_FLAG_BEGIN_STMT
;
839 /* Called for each machine instruction, or relatively atomic group of
840 machine instructions (ie built-in macro). The instruction or group
841 is SIZE bytes in length. If dwarf2 line number generation is called
842 for, emit a line statement appropriately. */
845 dwarf2_emit_insn (size
)
849 struct dwarf2_line_info debug_line
;
851 if (debug_type
!= DEBUG_DWARF2
&& ! ls
.any_dwarf2_directives
)
854 /* Reset any_dwarf2_directives so that we won't waste time
855 determining that no information has changed between insns. */
856 ls
.any_dwarf2_directives
= 0;
858 /* First update the notion of the current source line. */
859 dwarf2_where (&debug_line
);
861 /* We want the offset of the start of this
862 instruction within the the current frag. */
863 addr
= frag_now_fix () - size
;
865 /* And record the information. */
866 dwarf2_gen_line_info (addr
, &debug_line
);