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 4
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 */
104 /* state machine state as per DWARF2 manual: */
108 unsigned int filenum
;
114 empty_sequence
: 1; /* current code sequence has no DWARF2 directives? */
119 any_dwarf2_directives
: 1; /* did we emit any DWARF2 line debug directives? */
121 fragS
* frag
; /* frag that "addr" is relative to */
122 segT text_seg
; /* text segment "addr" is relative to */
124 segT line_seg
; /* ".debug_line" segment */
125 int last_filename
; /* index of last filename that was used */
126 int num_filenames
; /* index of last filename in use */
127 int filename_len
; /* length of the filename array */
130 int dir
; /* valid after gen_dir_list() only */
131 char *name
; /* full path before gen_dir_list(), filename afterwards */
135 struct dwarf2_line_info current
; /* current source info */
137 /* counters for statistical purposes */
138 unsigned int num_line_entries
;
139 unsigned int opcode_hist
[256]; /* histogram of opcode frequencies */
155 { NULL
, 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,
167 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
168 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
169 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
170 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
171 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
172 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
173 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
177 /* Function prototypes. */
178 static void out_uleb128
PARAMS ((addressT
));
179 static void out_sleb128
PARAMS ((offsetT
));
180 static void gen_addr_line
PARAMS ((int, addressT
));
181 static void reset_state_machine
PARAMS ((void));
182 static void out_set_addr
PARAMS ((addressT
));
183 static void out_end_sequence
PARAMS ((void));
184 static int get_filenum
PARAMS ((int, char *));
185 static void gen_dir_list
PARAMS ((void));
186 static void gen_file_list
PARAMS ((void));
187 static void print_stats
PARAMS ((unsigned long));
189 #define out_byte(byte) FRAG_APPEND_1_CHAR(byte)
190 #define out_opcode(opc) (out_byte ((opc)), ++ls.opcode_hist[(opc) & 0xff])
192 /* Output an unsigned "little-endian base 128" number. */
198 unsigned char byte
, more
= 0x80;
206 out_byte (more
| byte
);
211 /* Output a signed "little-endian base 128" number. */
217 unsigned char byte
, more
= 0x80;
223 if (((value
== 0) && ((byte
& 0x40) == 0))
224 || ((value
== -1) && ((byte
& 0x40) != 0)))
226 out_byte (more
| byte
);
231 /* Encode a pair of line and address skips as efficiently as possible.
232 Note that the line skip is signed, whereas the address skip is
236 gen_addr_line (line_delta
, addr_delta
)
240 unsigned int tmp
, opcode
;
242 tmp
= line_delta
- DWARF2_LINE_BASE
;
244 if (tmp
>= DWARF2_LINE_RANGE
)
246 out_opcode (DW_LNS_advance_line
);
247 out_sleb128 (line_delta
);
248 tmp
= 0 - DWARF2_LINE_BASE
;
252 tmp
+= DWARF2_LINE_OPCODE_BASE
;
254 /* Try using a special opcode. */
255 opcode
= tmp
+ addr_delta
*DWARF2_LINE_RANGE
;
262 /* Try using DW_LNS_const_add_pc followed by special op. */
263 opcode
= tmp
+ (addr_delta
- MAX_SPECIAL_ADDR_DELTA
) * DWARF2_LINE_RANGE
;
266 out_opcode (DW_LNS_const_add_pc
);
271 out_opcode (DW_LNS_advance_pc
);
272 out_uleb128 (addr_delta
);
275 /* Output line-delta. */
278 /* Append new row with current info. */
279 out_opcode (DW_LNS_copy
);
283 reset_state_machine ()
285 static const struct dwarf2_sm initial_state
= { INITIAL_STATE
};
287 ls
.sm
= initial_state
;
290 /* Set an absolute address (may results in a relocation entry). */
296 subsegT saved_subseg
;
300 int bytes_per_address
;
303 saved_subseg
= now_subseg
;
305 subseg_set (ls
.text_seg
, ls
.text_subseg
);
306 sym
= symbol_new (".L0\001", now_seg
, addr
, frag_now
);
308 subseg_set (saved_seg
, saved_subseg
);
311 bytes_per_address
= bfd_arch_bits_per_address (stdoutput
) / 8;
314 bytes_per_address
= 4;
317 out_opcode (DW_LNS_extended_op
);
318 out_uleb128 (bytes_per_address
+ 1);
320 out_opcode (DW_LNE_set_address
);
321 expr
.X_op
= O_symbol
;
322 expr
.X_add_symbol
= sym
;
323 expr
.X_add_number
= 0;
324 emit_expr (&expr
, bytes_per_address
);
327 /* Emit DW_LNS_end_sequence and reset state machine. Does not
328 preserve the current segment/sub-segment! */
333 addressT addr
, delta
;
338 subseg_set (ls
.text_seg
, ls
.text_subseg
);
339 #ifdef md_current_text_addr
340 addr
= md_current_text_addr ();
342 addr
= frag_now_fix ();
344 text_frag
= frag_now
;
345 subseg_set (ls
.line_seg
, DL_BODY
);
346 if (text_frag
!= ls
.frag
)
354 delta
= (addr
- ls
.sm
.addr
) / DWARF2_LINE_MIN_INSN_LENGTH
;
357 /* Advance address without updating the line-debug
358 matrix---the end_sequence entry is used only to tell
359 the debugger the end of the sequence. */
360 out_opcode (DW_LNS_advance_pc
);
366 subseg_set (ls
.line_seg
, DL_BODY
);
368 out_opcode (DW_LNS_extended_op
);
370 out_byte (DW_LNE_end_sequence
);
372 reset_state_machine ();
375 /* Look up a filenumber either by filename or by filenumber. If both
376 a filenumber and a filename are specified, lookup by filename takes
377 precedence. If the filename cannot be found, it is added to the
378 filetable and the filenumber for the new entry is returned. */
381 get_filenum (filenum
, file
)
385 int i
, last
= filenum
- 1;
386 char char0
= file
[0];
388 /* If filenum is out of range of the filename table, then try using the
389 table entry returned from the previous call. */
390 if (last
>= ls
.num_filenames
|| last
< 0)
391 last
= ls
.last_filename
;
393 /* Do a quick check against the specified or previously used filenum. */
394 if (ls
.num_filenames
> 0 && ls
.file
[last
].name
[0] == char0
395 && strcmp (ls
.file
[last
].name
+ 1, file
+ 1) == 0)
398 /* No match, fall back to simple linear scan. */
399 for (i
= 0; i
< ls
.num_filenames
; ++i
)
401 if (ls
.file
[i
].name
[0] == char0
402 && strcmp (ls
.file
[i
].name
+ 1, file
+ 1) == 0)
404 ls
.last_filename
= i
;
409 /* No match, enter new filename. */
410 if (ls
.num_filenames
>= ls
.filename_len
)
412 ls
.filename_len
+= 13;
413 ls
.file
= xrealloc (ls
.file
, ls
.filename_len
* sizeof (ls
.file
[0]));
415 ls
.file
[ls
.num_filenames
].dir
= 0;
416 ls
.file
[ls
.num_filenames
].name
= file
;
417 ls
.last_filename
= ls
.num_filenames
;
418 return ++ls
.num_filenames
;
421 /* Emit an entry in the line number table if the address or line has changed.
422 ADDR is relative to the current frag in the text section. */
425 dwarf2_gen_line_info (addr
, l
)
427 struct dwarf2_line_info
*l
;
429 unsigned int filenum
= l
->filenum
;
430 unsigned int any_output
= 0;
431 subsegT saved_subseg
;
436 fprintf (stderr
, "line: addr %lx file `%s' line %u col %u flags %x\n",
437 (unsigned long) addr
, l
->filename
, l
->line
, l
->column
, l
->flags
);
439 if (filenum
> 0 && !l
->filename
)
441 if (filenum
>= (unsigned int) ls
.num_filenames
)
443 as_warn ("Encountered bad file number in line number debug info!");
447 else if (l
->filename
)
448 filenum
= get_filenum (filenum
, l
->filename
);
450 /* No filename, no filnum => no play. */
453 /* Must save these before the subseg_new call, as that call will change
456 saved_subseg
= now_subseg
;
457 saved_frag
= frag_now
;
465 ls
.line_seg
= subseg_new (".debug_line", 0);
468 bfd_set_section_flags (stdoutput
, ls
.line_seg
, SEC_READONLY
);
470 /* We're going to need this symbol. */
471 secsym
= symbol_find (".debug_line");
473 symbol_set_bfdsym (secsym
, ls
.line_seg
->symbol
);
475 symbol_table_insert (section_symbol (ls
.line_seg
));
479 subseg_set (ls
.line_seg
, DL_BODY
);
481 if (ls
.text_seg
!= saved_seg
|| ls
.text_subseg
!= saved_subseg
)
483 if (!ls
.sm
.empty_sequence
)
485 /* Terminate previous sequence. */
487 ls
.sm
.empty_sequence
= 1;
490 ls
.text_seg
= saved_seg
;
491 ls
.text_subseg
= saved_subseg
;
494 ls
.frag
= saved_frag
;
497 if (ls
.sm
.filenum
!= filenum
)
500 out_opcode (DW_LNS_set_file
);
501 out_uleb128 (filenum
);
502 ls
.sm
.filenum
= filenum
;
505 if (ls
.sm
.column
!= l
->column
)
508 out_opcode (DW_LNS_set_column
);
509 out_uleb128 (l
->column
);
510 ls
.sm
.column
= l
->column
;
513 if (((l
->flags
& DWARF2_FLAG_BEGIN_STMT
) != 0) != ls
.sm
.is_stmt
)
516 out_opcode (DW_LNS_negate_stmt
);
519 if (l
->flags
& DWARF2_FLAG_BEGIN_BLOCK
)
522 out_opcode (DW_LNS_set_basic_block
);
525 if (ls
.sm
.line
!= l
->line
)
528 if (saved_frag
!= ls
.frag
)
530 /* If a new frag got allocated (for whatever reason), then
531 deal with it by generating a reference symbol. Note: no
532 end_sequence needs to be generated because the address did
533 not really decrease (only the reference point changed). */
536 ls
.frag
= saved_frag
;
538 gen_addr_line (l
->line
- ls
.sm
.line
,
539 (addr
- ls
.sm
.addr
) / DWARF2_LINE_MIN_INSN_LENGTH
);
540 ls
.sm
.basic_block
= 0;
541 ls
.sm
.line
= l
->line
;
545 subseg_set (saved_seg
, saved_subseg
);
547 ls
.num_line_entries
+= any_output
;
549 ls
.sm
.empty_sequence
= 0;
555 char *str
, *slash
, *dir_list
, *dp
, *cp
;
558 dir_list
= frag_more (0);
561 for (i
= 0; i
< ls
.num_filenames
; ++i
)
563 str
= ls
.file
[i
].name
;
564 slash
= strrchr (str
, '/');
568 for (j
= 0, dp
= dir_list
; j
< num_dirs
; ++j
)
570 if (strcmp (str
, dp
) == 0)
572 ls
.file
[i
].dir
= j
+ 1;
579 /* Didn't find this directory: append it to the list. */
580 size_t size
= strlen (str
) + 1;
581 cp
= frag_more (size
);
582 memcpy (cp
, str
, size
);
583 ls
.file
[i
].dir
= ++num_dirs
;
586 ls
.file
[i
].name
= slash
+ 1;
590 /* Terminate directory list. */
601 for (i
= 0; i
< ls
.num_filenames
; ++i
)
603 size
= strlen (ls
.file
[i
].name
) + 1;
604 cp
= frag_more (size
);
605 memcpy (cp
, ls
.file
[i
].name
, size
);
607 out_uleb128 (ls
.file
[i
].dir
); /* directory number */
608 out_uleb128 (0); /* last modification timestamp */
609 out_uleb128 (0); /* filesize */
612 /* Terminate filename list. */
617 print_stats (total_size
)
618 unsigned long total_size
;
620 static const char *opc_name
[] =
622 "extended", "copy", "advance_pc", "advance_line", "set_file",
623 "set_column", "negate_stmt", "set_basic_block", "const_add_pc",
629 fprintf (stderr
, "Average size: %g bytes/line\n",
630 total_size
/ (double) ls
.num_line_entries
);
632 fprintf (stderr
, "\nStandard opcode histogram:\n");
634 for (i
= 0; i
< sizeof (opc_name
) / sizeof (opc_name
[0]); ++i
)
636 fprintf (stderr
, "%s", opc_name
[i
]);
637 for (j
= strlen (opc_name
[i
]); j
< 16; ++j
)
638 fprintf (stderr
, " ");
639 fprintf (stderr
, ": %u\n", ls
.opcode_hist
[i
]);
642 fprintf (stderr
, "\nSpecial opcodes:\naddr\t\t\t\tline skip\n");
644 fprintf (stderr
, "skip: ");
645 for (j
= DWARF2_LINE_BASE
; j
< DWARF2_LINE_BASE
+ DWARF2_LINE_RANGE
; ++j
)
646 fprintf (stderr
, "%3d", j
);
647 fprintf (stderr
, "\n-----");
651 j
= SPECIAL_LINE (i
);
652 if (j
== DWARF2_LINE_BASE
)
653 fprintf (stderr
, "\n%4u: ",
655 DWARF2_LINE_MIN_INSN_LENGTH
* SPECIAL_ADDR (i
)));
656 fprintf (stderr
, " %2u", ls
.opcode_hist
[i
]);
658 fprintf (stderr
, "\n");
664 addressT body_size
, total_size
, prolog_size
;
665 subsegT saved_subseg
;
670 /* No .debug_line segment, no work to do. */
674 saved_subseg
= now_subseg
;
676 if (!ls
.sm
.empty_sequence
)
678 total_size
= body_size
= frag_now_fix ();
680 /* Now generate the directory and file lists. */
681 subseg_set (ls
.line_seg
, DL_FILES
);
684 total_size
+= frag_now_fix ();
686 /* And now the header ("statement program prolog", in DWARF2 lingo...). */
687 subseg_set (ls
.line_seg
, DL_PROLOG
);
689 cp
= frag_more (15 + DWARF2_LINE_OPCODE_BASE
- 1);
691 total_size
+= frag_now_fix ();
692 prolog_size
= total_size
- body_size
- 10;
694 # define STUFF(val,size) md_number_to_chars (cp, val, size); cp += size;
695 STUFF (total_size
- 4, 4); /* length */
696 STUFF (2, 2); /* version */
697 STUFF (prolog_size
, 4); /* prologue_length */
698 STUFF (DWARF2_LINE_MIN_INSN_LENGTH
, 1);
699 STUFF (DWARF2_LINE_DEFAULT_IS_STMT
, 1);
700 STUFF (DWARF2_LINE_BASE
, 1);
701 STUFF (DWARF2_LINE_RANGE
, 1);
702 STUFF (DWARF2_LINE_OPCODE_BASE
, 1);
704 /* standard_opcode_lengths: */
705 STUFF (0, 1); /* DW_LNS_copy */
706 STUFF (1, 1); /* DW_LNS_advance_pc */
707 STUFF (1, 1); /* DW_LNS_advance_line */
708 STUFF (1, 1); /* DW_LNS_set_file */
709 STUFF (1, 1); /* DW_LNS_set_column */
710 STUFF (0, 1); /* DW_LNS_negate_stmt */
711 STUFF (0, 1); /* DW_LNS_set_basic_block */
712 STUFF (0, 1); /* DW_LNS_const_add_pc */
713 STUFF (1, 1); /* DW_LNS_fixed_advance_pc */
715 subseg_set (saved_seg
, saved_subseg
);
718 print_stats (total_size
);
722 dwarf2_directive_file (dummy
)
723 int dummy ATTRIBUTE_UNUSED
;
727 /* Continue to accept a bare string and pass it off. */
729 if (*input_line_pointer
== '"')
735 ls
.any_dwarf2_directives
= 1;
737 if (debug_type
== DEBUG_NONE
)
738 /* Automatically turn on DWARF2 debug info unless something else
739 has been selected. */
740 debug_type
= DEBUG_DWARF2
;
742 ls
.current
.filenum
= get_absolute_expression ();
743 ls
.current
.filename
= demand_copy_C_string (&len
);
745 demand_empty_rest_of_line ();
749 dwarf2_directive_loc (dummy
)
750 int dummy ATTRIBUTE_UNUSED
;
752 ls
.any_dwarf2_directives
= 1;
754 ls
.current
.filenum
= get_absolute_expression ();
756 ls
.current
.line
= get_absolute_expression ();
758 ls
.current
.column
= get_absolute_expression ();
759 demand_empty_rest_of_line ();
761 ls
.current
.flags
= DWARF2_FLAG_BEGIN_STMT
;
765 listing_source_line (ls
.current
.line
);
771 struct dwarf2_line_info
*line
;
773 if (ls
.any_dwarf2_directives
)
777 as_where (&line
->filename
, &line
->line
);
780 line
->flags
= DWARF2_FLAG_BEGIN_STMT
;