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
178 /* Function prototypes: */
179 static void out_uleb128
PARAMS ((addressT
));
180 static void out_sleb128
PARAMS ((offsetT
));
181 static void gen_addr_line
PARAMS ((int, addressT
));
182 static void reset_state_machine
PARAMS ((void));
183 static void out_set_addr
PARAMS ((addressT
));
184 static void out_end_sequence
PARAMS ((void));
185 static int get_filenum
PARAMS ((int, char *));
186 static void gen_dir_list
PARAMS ((void));
187 static void gen_file_list
PARAMS ((void));
188 static void print_stats
PARAMS ((unsigned long));
191 #define out_byte(byte) FRAG_APPEND_1_CHAR(byte)
192 #define out_opcode(opc) (out_byte ((opc)), ++ls.opcode_hist[(opc) & 0xff])
194 /* Output an unsigned "little-endian base 128" number. */
199 unsigned char byte
, more
= 0x80;
207 out_byte (more
| byte
);
212 /* 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
235 gen_addr_line (line_delta
, addr_delta
)
239 unsigned int tmp
, opcode
;
241 tmp
= line_delta
- DWARF2_LINE_BASE
;
243 if (tmp
>= DWARF2_LINE_RANGE
)
245 out_opcode (DW_LNS_advance_line
);
246 out_sleb128 (line_delta
);
247 tmp
= 0 - DWARF2_LINE_BASE
;
251 tmp
+= DWARF2_LINE_OPCODE_BASE
;
253 /* try using a special opcode: */
254 opcode
= tmp
+ addr_delta
*DWARF2_LINE_RANGE
;
261 /* try using DW_LNS_const_add_pc followed by special op: */
262 opcode
= tmp
+ (addr_delta
- MAX_SPECIAL_ADDR_DELTA
)*DWARF2_LINE_RANGE
;
265 out_opcode (DW_LNS_const_add_pc
);
270 out_opcode (DW_LNS_advance_pc
);
271 out_uleb128 (addr_delta
);
274 out_opcode (tmp
); /* output line-delta */
276 out_opcode (DW_LNS_copy
); /* append new row with current info */
280 reset_state_machine ()
282 static const struct dwarf2_sm initial_state
= { INITIAL_STATE
};
284 ls
.sm
= initial_state
;
287 /* Set an absolute address (may results in a relocation entry): */
292 subsegT saved_subseg
;
296 int bytes_per_address
;
299 saved_subseg
= now_subseg
;
301 subseg_set (ls
.text_seg
, ls
.text_subseg
);
302 sym
= symbol_new (".L0\001", now_seg
, addr
, frag_now
);
304 subseg_set (saved_seg
, saved_subseg
);
307 bytes_per_address
= bfd_arch_bits_per_address (stdoutput
) / 8;
310 bytes_per_address
= 4;
313 out_opcode (DW_LNS_extended_op
);
314 out_uleb128 (bytes_per_address
+ 1);
316 out_opcode (DW_LNE_set_address
);
317 expr
.X_op
= O_symbol
;
318 expr
.X_add_symbol
= sym
;
319 expr
.X_add_number
= 0;
320 emit_expr (&expr
, bytes_per_address
);
323 /* Emit DW_LNS_end_sequence and reset state machine. Does not
324 preserve the current segment/sub-segment! */
328 addressT addr
, delta
;
333 subseg_set (ls
.text_seg
, ls
.text_subseg
);
334 #ifdef md_current_text_addr
335 addr
= md_current_text_addr ();
337 addr
= frag_now_fix ();
339 text_frag
= frag_now
;
340 subseg_set (ls
.line_seg
, DL_BODY
);
341 if (text_frag
!= ls
.frag
)
349 delta
= (addr
- ls
.sm
.addr
) / DWARF2_LINE_MIN_INSN_LENGTH
;
352 /* Advance address without updating the line-debug
353 matrix---the end_sequence entry is used only to tell
354 the debugger the end of the sequence.*/
355 out_opcode (DW_LNS_advance_pc
);
361 subseg_set (ls
.line_seg
, DL_BODY
);
363 out_opcode (DW_LNS_extended_op
);
365 out_byte (DW_LNE_end_sequence
);
367 reset_state_machine ();
370 /* Look up a filenumber either by filename or by filenumber. If both
371 a filenumber and a filename are specified, lookup by filename takes
372 precedence. If the filename cannot be found, it is added to the
373 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 return; /* no filename, no filnum => no play */
446 /* Must save these before the subseg_new call, as that call will change
449 saved_subseg
= now_subseg
;
450 saved_frag
= frag_now
;
458 ls
.line_seg
= subseg_new (".debug_line", 0);
461 bfd_set_section_flags (stdoutput
, ls
.line_seg
, SEC_READONLY
);
463 /* We're going to need this symbol. */
464 secsym
= symbol_find (".debug_line");
466 symbol_set_bfdsym (secsym
, ls
.line_seg
->symbol
);
468 symbol_table_insert (section_symbol (ls
.line_seg
));
472 subseg_set (ls
.line_seg
, DL_BODY
);
474 if (ls
.text_seg
!= saved_seg
|| ls
.text_subseg
!= saved_subseg
)
476 if (!ls
.sm
.empty_sequence
)
478 out_end_sequence (); /* terminate previous sequence */
479 ls
.sm
.empty_sequence
= 1;
482 ls
.text_seg
= saved_seg
;
483 ls
.text_subseg
= saved_subseg
;
486 ls
.frag
= saved_frag
;
489 if (ls
.sm
.filenum
!= filenum
)
492 out_opcode (DW_LNS_set_file
);
493 out_uleb128 (filenum
);
494 ls
.sm
.filenum
= filenum
;
497 if (ls
.sm
.column
!= l
->column
)
500 out_opcode (DW_LNS_set_column
);
501 out_uleb128 (l
->column
);
502 ls
.sm
.column
= l
->column
;
505 if (((l
->flags
& DWARF2_FLAG_BEGIN_STMT
) != 0) != ls
.sm
.is_stmt
)
508 out_opcode (DW_LNS_negate_stmt
);
511 if (l
->flags
& DWARF2_FLAG_BEGIN_BLOCK
)
514 out_opcode (DW_LNS_set_basic_block
);
517 if (ls
.sm
.line
!= l
->line
)
520 if (saved_frag
!= ls
.frag
)
522 /* If a new frag got allocated (for whatever reason), then
523 deal with it by generating a reference symbol. Note: no
524 end_sequence needs to be generated because the address did
525 not really decrease (only the reference point changed). */
528 ls
.frag
= saved_frag
;
530 gen_addr_line (l
->line
- ls
.sm
.line
,
531 (addr
- ls
.sm
.addr
) / DWARF2_LINE_MIN_INSN_LENGTH
);
532 ls
.sm
.basic_block
= 0;
533 ls
.sm
.line
= l
->line
;
537 subseg_set (saved_seg
, saved_subseg
);
539 ls
.num_line_entries
+= any_output
;
541 ls
.sm
.empty_sequence
= 0;
547 char *str
, *slash
, *dir_list
, *dp
, *cp
;
550 dir_list
= frag_more (0);
553 for (i
= 0; i
< ls
.num_filenames
; ++i
)
555 str
= ls
.file
[i
].name
;
556 slash
= strrchr (str
, '/');
560 for (j
= 0, dp
= dir_list
; j
< num_dirs
; ++j
)
562 if (strcmp (str
, dp
) == 0)
564 ls
.file
[i
].dir
= j
+ 1;
571 /* didn't find this directory: append it to the list */
572 size_t size
= strlen (str
) + 1;
573 cp
= frag_more (size
);
574 memcpy (cp
, str
, size
);
575 ls
.file
[i
].dir
= ++num_dirs
;
578 ls
.file
[i
].name
= slash
+ 1;
581 out_byte ('\0'); /* terminate directory list */
591 for (i
= 0; i
< ls
.num_filenames
; ++i
)
593 size
= strlen (ls
.file
[i
].name
) + 1;
594 cp
= frag_more (size
);
595 memcpy (cp
, ls
.file
[i
].name
, size
);
597 out_uleb128 (ls
.file
[i
].dir
); /* directory number */
598 out_uleb128 (0); /* last modification timestamp */
599 out_uleb128 (0); /* filesize */
601 out_byte (0); /* terminate filename list */
605 print_stats (total_size
)
606 unsigned long total_size
;
608 static const char *opc_name
[] =
610 "extended", "copy", "advance_pc", "advance_line", "set_file",
611 "set_column", "negate_stmt", "set_basic_block", "const_add_pc",
617 fprintf (stderr
, "Average size: %g bytes/line\n",
618 total_size
/ (double) ls
.num_line_entries
);
620 fprintf (stderr
, "\nStandard opcode histogram:\n");
622 for (i
= 0; i
< sizeof (opc_name
)/sizeof (opc_name
[0]); ++i
)
624 fprintf (stderr
, "%s", opc_name
[i
]);
625 for (j
= strlen (opc_name
[i
]); j
< 16; ++j
)
626 fprintf (stderr
, " ");
627 fprintf (stderr
, ": %u\n", ls
.opcode_hist
[i
]);
630 fprintf (stderr
, "\nSpecial opcodes:\naddr\t\t\t\tline skip\n");
632 fprintf (stderr
, "skip: ");
633 for (j
= DWARF2_LINE_BASE
; j
< DWARF2_LINE_BASE
+ DWARF2_LINE_RANGE
; ++j
)
634 fprintf (stderr
, "%3d", j
);
635 fprintf (stderr
, "\n-----");
639 j
= SPECIAL_LINE (i
);
640 if (j
== DWARF2_LINE_BASE
)
641 fprintf (stderr
, "\n%4u: ",
643 DWARF2_LINE_MIN_INSN_LENGTH
* SPECIAL_ADDR (i
)));
644 fprintf (stderr
, " %2u", ls
.opcode_hist
[i
]);
646 fprintf (stderr
, "\n");
652 addressT body_size
, total_size
, prolog_size
;
653 subsegT saved_subseg
;
658 /* no .debug_line segment, no work to do... */
662 saved_subseg
= now_subseg
;
664 if (!ls
.sm
.empty_sequence
)
666 total_size
= body_size
= frag_now_fix ();
668 /* now generate the directory and file lists: */
669 subseg_set (ls
.line_seg
, DL_FILES
);
672 total_size
+= frag_now_fix ();
674 /* and now the header ("statement program prolog", in DWARF2 lingo...) */
675 subseg_set (ls
.line_seg
, DL_PROLOG
);
677 cp
= frag_more (15 + DWARF2_LINE_OPCODE_BASE
- 1);
679 total_size
+= frag_now_fix ();
680 prolog_size
= total_size
- body_size
- 10;
682 # define STUFF(val,size) md_number_to_chars (cp, val, size); cp += size;
683 STUFF (total_size
- 4, 4); /* length */
684 STUFF (2, 2); /* version */
685 STUFF (prolog_size
, 4); /* prologue_length */
686 STUFF (DWARF2_LINE_MIN_INSN_LENGTH
, 1);
687 STUFF (DWARF2_LINE_DEFAULT_IS_STMT
, 1);
688 STUFF (DWARF2_LINE_BASE
, 1);
689 STUFF (DWARF2_LINE_RANGE
, 1);
690 STUFF (DWARF2_LINE_OPCODE_BASE
, 1);
692 /* standard_opcode_lengths: */
693 STUFF (0, 1); /* DW_LNS_copy */
694 STUFF (1, 1); /* DW_LNS_advance_pc */
695 STUFF (1, 1); /* DW_LNS_advance_line */
696 STUFF (1, 1); /* DW_LNS_set_file */
697 STUFF (1, 1); /* DW_LNS_set_column */
698 STUFF (0, 1); /* DW_LNS_negate_stmt */
699 STUFF (0, 1); /* DW_LNS_set_basic_block */
700 STUFF (0, 1); /* DW_LNS_const_add_pc */
701 STUFF (1, 1); /* DW_LNS_fixed_advance_pc */
703 subseg_set (saved_seg
, saved_subseg
);
706 print_stats (total_size
);
710 dwarf2_directive_file (dummy
)
711 int dummy ATTRIBUTE_UNUSED
;
715 /* Continue to accept a bare string and pass it off. */
717 if (*input_line_pointer
== '"')
723 ls
.any_dwarf2_directives
= 1;
725 if (debug_type
== DEBUG_NONE
)
726 /* Automatically turn on DWARF2 debug info unless something else
727 has been selected. */
728 debug_type
= DEBUG_DWARF2
;
730 ls
.current
.filenum
= get_absolute_expression ();
731 ls
.current
.filename
= demand_copy_C_string (&len
);
733 demand_empty_rest_of_line ();
737 dwarf2_directive_loc (dummy
)
738 int dummy ATTRIBUTE_UNUSED
;
740 ls
.any_dwarf2_directives
= 1;
742 ls
.current
.filenum
= get_absolute_expression ();
744 ls
.current
.line
= get_absolute_expression ();
746 ls
.current
.column
= get_absolute_expression ();
747 demand_empty_rest_of_line ();
749 ls
.current
.flags
= DWARF2_FLAG_BEGIN_STMT
;
753 listing_source_line (ls
.current
.line
);
759 struct dwarf2_line_info
*line
;
761 if (ls
.any_dwarf2_directives
)
765 as_where (&line
->filename
, &line
->line
);
768 line
->flags
= DWARF2_FLAG_BEGIN_STMT
;