1 /* dwarf2dbg.c - DWARF2 debug support
2 Copyright (C) 1999 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 amont 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 segT text_seg
; /* text segment "addr" is relative to */
123 segT line_seg
; /* ".debug_line" segment */
124 int last_filename
; /* index of last filename that was used */
125 int num_filenames
; /* index of last filename in use */
126 int filename_len
; /* length of the filename array */
129 int dir
; /* valid after gen_dir_list() only */
130 char *name
; /* full path before gen_dir_list(), filename afterwards */
134 struct dwarf2_line_info current
; /* current source info: */
136 /* counters for statistical purposes: */
137 unsigned int num_line_entries
;
138 unsigned int opcode_hist
[256]; /* histogram of opcode frequencies */
153 { NULL
, 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,
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
176 /* Function prototypes: */
177 static void out_uleb128
PARAMS ((addressT
));
178 static void out_sleb128
PARAMS ((offsetT
));
179 static void gen_addr_line
PARAMS ((int, addressT
));
180 static void reset_state_machine
PARAMS ((void));
181 static void out_set_addr
PARAMS ((addressT
));
182 static void out_end_sequence
PARAMS ((void));
183 static int get_filenum
PARAMS ((int, char *));
184 static void gen_dir_list
PARAMS ((void));
185 static void gen_file_list
PARAMS ((void));
186 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. */
197 unsigned char byte
, more
= 0x80;
205 out_byte (more
| byte
);
210 /* Output a signed "little-endian base 128" number. */
215 unsigned char byte
, more
= 0x80;
221 if (((value
== 0) && ((byte
& 0x40) == 0))
222 || ((value
== -1) && ((byte
& 0x40) != 0)))
224 out_byte (more
| byte
);
229 /* Encode a pair of line and address skips as efficiently as possible.
230 Note that the line skip is signed, whereas the address skip is
233 gen_addr_line (line_delta
, addr_delta
)
237 unsigned int tmp
, opcode
;
239 tmp
= line_delta
- DWARF2_LINE_BASE
;
241 if (tmp
>= DWARF2_LINE_RANGE
)
243 out_opcode (DW_LNS_advance_line
);
244 out_sleb128 (line_delta
);
245 tmp
= 0 - DWARF2_LINE_BASE
;
249 tmp
+= DWARF2_LINE_OPCODE_BASE
;
251 /* try using a special opcode: */
252 opcode
= tmp
+ addr_delta
*DWARF2_LINE_RANGE
;
259 /* try using DW_LNS_const_add_pc followed by special op: */
260 opcode
= tmp
+ (addr_delta
- MAX_SPECIAL_ADDR_DELTA
)*DWARF2_LINE_RANGE
;
263 out_opcode (DW_LNS_const_add_pc
);
268 out_opcode (DW_LNS_advance_pc
);
269 out_uleb128 (addr_delta
);
272 out_opcode (tmp
); /* output line-delta */
274 out_opcode (DW_LNS_copy
); /* append new row with current info */
278 reset_state_machine ()
280 static const struct dwarf2_sm initial_state
= { INITIAL_STATE
};
282 ls
.sm
= initial_state
;
285 /* 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! */
326 addressT addr
, delta
;
330 subseg_set (ls
.text_seg
, ls
.text_subseg
);
331 #ifdef md_current_text_addr
332 addr
= md_current_text_addr ();
334 addr
= frag_now_fix ();
336 subseg_set (ls
.line_seg
, DL_BODY
);
337 if (addr
< ls
.sm
.addr
)
344 delta
= (addr
- ls
.sm
.addr
) / DWARF2_LINE_MIN_INSN_LENGTH
;
347 /* Advance address without updating the line-debug
348 matrix---the end_sequence entry is used only to tell
349 the debugger the end of the sequence.*/
350 out_opcode (DW_LNS_advance_pc
);
356 subseg_set (ls
.line_seg
, DL_BODY
);
358 out_opcode (DW_LNS_extended_op
);
360 out_byte (DW_LNE_end_sequence
);
362 reset_state_machine ();
365 /* Look up a filenumber either by filename or by filenumber. If both
366 a filenumber and a filename are specified, lookup by filename takes
367 precedence. If the filename cannot be found, it is added to the
368 filetable and the filenumber for the new entry is returned. */
370 get_filenum (filenum
, file
)
374 int i
, last
= filenum
- 1;
375 char char0
= file
[0];
377 /* If filenum is out of range of the filename table, then try using the
378 table entry returned from the previous call. */
379 if (last
>= ls
.num_filenames
|| last
< 0)
380 last
= ls
.last_filename
;
382 /* Do a quick check against the specified or previously used filenum. */
383 if (ls
.num_filenames
> 0 && ls
.file
[last
].name
[0] == char0
384 && strcmp (ls
.file
[last
].name
+ 1, file
+ 1) == 0)
387 /* no match, fall back to simple linear scan: */
388 for (i
= 0; i
< ls
.num_filenames
; ++i
)
390 if (ls
.file
[i
].name
[0] == char0
391 && strcmp (ls
.file
[i
].name
+ 1, file
+ 1) == 0)
393 ls
.last_filename
= i
;
398 /* no match: enter new filename */
399 if (ls
.num_filenames
>= ls
.filename_len
)
401 ls
.filename_len
+= 13;
402 ls
.file
= xrealloc (ls
.file
, ls
.filename_len
* sizeof (ls
.file
[0]));
404 ls
.file
[ls
.num_filenames
].dir
= 0;
405 ls
.file
[ls
.num_filenames
].name
= file
;
406 ls
.last_filename
= ls
.num_filenames
;
407 return ++ls
.num_filenames
;
411 dwarf2_gen_line_info (addr
, l
)
413 struct dwarf2_line_info
*l
;
415 unsigned int filenum
= l
->filenum
;
416 unsigned int any_output
= 0;
417 subsegT saved_subseg
;
421 fprintf (stderr
, "line: addr %lx file `%s' line %u col %u flags %x\n",
422 (unsigned long) addr
, l
->filename
, l
->line
, l
->column
, l
->flags
);
424 if (filenum
> 0 && !l
->filename
)
426 if (filenum
>= (unsigned int) ls
.num_filenames
)
428 as_warn ("Encountered bad file number in line number debug info!");
432 else if (l
->filename
)
433 filenum
= get_filenum (filenum
, l
->filename
);
435 return; /* no filename, no filnum => no play */
437 /* Must save these before the subseg_new call, as that call will change
440 saved_subseg
= now_subseg
;
448 ls
.line_seg
= subseg_new (".debug_line", 0);
451 bfd_set_section_flags (stdoutput
, ls
.line_seg
, SEC_READONLY
);
453 /* We're going to need this symbol. */
454 secsym
= symbol_find (".debug_line");
456 symbol_set_bfdsym (secsym
, ls
.line_seg
->symbol
);
458 symbol_table_insert (section_symbol (ls
.line_seg
));
462 subseg_set (ls
.line_seg
, DL_BODY
);
464 if (ls
.text_seg
!= saved_seg
|| ls
.text_subseg
!= saved_subseg
)
466 if (!ls
.sm
.empty_sequence
)
468 out_end_sequence (); /* terminate previous sequence */
469 ls
.sm
.empty_sequence
= 1;
472 ls
.text_seg
= saved_seg
;
473 ls
.text_subseg
= saved_subseg
;
478 if (ls
.sm
.filenum
!= filenum
)
481 out_opcode (DW_LNS_set_file
);
482 out_uleb128 (filenum
);
483 ls
.sm
.filenum
= filenum
;
486 if (ls
.sm
.column
!= l
->column
)
489 out_opcode (DW_LNS_set_column
);
490 out_uleb128 (l
->column
);
491 ls
.sm
.column
= l
->column
;
494 if (((l
->flags
& DWARF2_FLAG_BEGIN_STMT
) != 0) != ls
.sm
.is_stmt
)
497 out_opcode (DW_LNS_negate_stmt
);
500 if (l
->flags
& DWARF2_FLAG_BEGIN_BLOCK
)
503 out_opcode (DW_LNS_set_basic_block
);
506 if (ls
.sm
.line
!= l
->line
)
509 if (addr
< ls
.sm
.addr
)
511 /* This happens when a new frag got allocated (for whatever
512 reason). Deal with it by generating a reference symbol.
513 Note: no end_sequence needs to be generated because the
514 address did not really decrease (only the reference point
517 ??? Perhaps we should directly check for a change of
522 gen_addr_line (l
->line
- ls
.sm
.line
,
523 (addr
- ls
.sm
.addr
) / DWARF2_LINE_MIN_INSN_LENGTH
);
524 ls
.sm
.basic_block
= 0;
525 ls
.sm
.line
= l
->line
;
529 subseg_set (saved_seg
, saved_subseg
);
531 ls
.num_line_entries
+= any_output
;
533 ls
.sm
.empty_sequence
= 0;
539 char *str
, *slash
, *dir_list
, *dp
, *cp
;
542 dir_list
= frag_more (0);
545 for (i
= 0; i
< ls
.num_filenames
; ++i
)
547 str
= ls
.file
[i
].name
;
548 slash
= strrchr (str
, '/');
552 for (j
= 0, dp
= dir_list
; j
< num_dirs
; ++j
)
554 if (strcmp (str
, dp
) == 0)
556 ls
.file
[i
].dir
= j
+ 1;
563 /* didn't find this directory: append it to the list */
564 size_t size
= strlen (str
) + 1;
565 cp
= frag_more (size
);
566 memcpy (cp
, str
, size
);
567 ls
.file
[i
].dir
= ++num_dirs
;
570 ls
.file
[i
].name
= slash
+ 1;
573 out_byte ('\0'); /* terminate directory list */
583 for (i
= 0; i
< ls
.num_filenames
; ++i
)
585 size
= strlen (ls
.file
[i
].name
) + 1;
586 cp
= frag_more (size
);
587 memcpy (cp
, ls
.file
[i
].name
, size
);
589 out_uleb128 (ls
.file
[i
].dir
); /* directory number */
590 out_uleb128 (0); /* last modification timestamp */
591 out_uleb128 (0); /* filesize */
593 out_byte (0); /* terminate filename list */
597 print_stats (total_size
)
598 unsigned long total_size
;
600 static const char *opc_name
[] =
602 "extended", "copy", "advance_pc", "advance_line", "set_file",
603 "set_column", "negate_stmt", "set_basic_block", "const_add_pc",
609 fprintf (stderr
, "Average size: %g bytes/line\n",
610 total_size
/ (double) ls
.num_line_entries
);
612 fprintf (stderr
, "\nStandard opcode histogram:\n");
614 for (i
= 0; i
< sizeof (opc_name
)/sizeof (opc_name
[0]); ++i
)
616 fprintf (stderr
, "%s", opc_name
[i
]);
617 for (j
= strlen (opc_name
[i
]); j
< 16; ++j
)
618 fprintf (stderr
, " ");
619 fprintf (stderr
, ": %u\n", ls
.opcode_hist
[i
]);
622 fprintf (stderr
, "\nSpecial opcodes:\naddr\t\t\t\tline skip\n");
624 fprintf (stderr
, "skip: ");
625 for (j
= DWARF2_LINE_BASE
; j
< DWARF2_LINE_BASE
+ DWARF2_LINE_RANGE
; ++j
)
626 fprintf (stderr
, "%3d", j
);
627 fprintf (stderr
, "\n-----");
631 j
= SPECIAL_LINE (i
);
632 if (j
== DWARF2_LINE_BASE
)
633 fprintf (stderr
, "\n%4u: ",
634 DWARF2_LINE_MIN_INSN_LENGTH
*SPECIAL_ADDR (i
));
635 fprintf (stderr
, " %2u", ls
.opcode_hist
[i
]);
637 fprintf (stderr
, "\n");
643 addressT body_size
, total_size
, prolog_size
;
644 subsegT saved_subseg
;
649 /* no .debug_line segment, no work to do... */
653 saved_subseg
= now_subseg
;
655 if (!ls
.sm
.empty_sequence
)
657 total_size
= body_size
= frag_now_fix ();
659 /* now generate the directory and file lists: */
660 subseg_set (ls
.line_seg
, DL_FILES
);
663 total_size
+= frag_now_fix ();
665 /* and now the header ("statement program prolog", in DWARF2 lingo...) */
666 subseg_set (ls
.line_seg
, DL_PROLOG
);
668 cp
= frag_more (15 + DWARF2_LINE_OPCODE_BASE
- 1);
670 total_size
+= frag_now_fix ();
671 prolog_size
= total_size
- body_size
- 10;
673 # define STUFF(val,size) md_number_to_chars (cp, val, size); cp += size;
674 STUFF (total_size
- 4, 4); /* length */
675 STUFF (2, 2); /* version */
676 STUFF (prolog_size
, 4); /* prologue_length */
677 STUFF (DWARF2_LINE_MIN_INSN_LENGTH
, 1);
678 STUFF (DWARF2_LINE_DEFAULT_IS_STMT
, 1);
679 STUFF (DWARF2_LINE_BASE
, 1);
680 STUFF (DWARF2_LINE_RANGE
, 1);
681 STUFF (DWARF2_LINE_OPCODE_BASE
, 1);
683 /* standard_opcode_lengths: */
684 STUFF (0, 1); /* DW_LNS_copy */
685 STUFF (1, 1); /* DW_LNS_advance_pc */
686 STUFF (1, 1); /* DW_LNS_advance_line */
687 STUFF (1, 1); /* DW_LNS_set_file */
688 STUFF (1, 1); /* DW_LNS_set_column */
689 STUFF (0, 1); /* DW_LNS_negate_stmt */
690 STUFF (0, 1); /* DW_LNS_set_basic_block */
691 STUFF (0, 1); /* DW_LNS_const_add_pc */
692 STUFF (1, 1); /* DW_LNS_fixed_advance_pc */
694 subseg_set (saved_seg
, saved_subseg
);
697 print_stats (total_size
);
701 dwarf2_directive_file (dummy
)
702 int dummy ATTRIBUTE_UNUSED
;
706 /* Continue to accept a bare string and pass it off. */
708 if (*input_line_pointer
== '"')
714 ls
.any_dwarf2_directives
= 1;
716 if (debug_type
== DEBUG_NONE
)
717 /* Automatically turn on DWARF2 debug info unless something else
718 has been selected. */
719 debug_type
= DEBUG_DWARF2
;
721 ls
.current
.filenum
= get_absolute_expression ();
722 ls
.current
.filename
= demand_copy_C_string (&len
);
724 demand_empty_rest_of_line ();
728 dwarf2_directive_loc (dummy
)
729 int dummy ATTRIBUTE_UNUSED
;
731 ls
.any_dwarf2_directives
= 1;
733 ls
.current
.filenum
= get_absolute_expression ();
735 ls
.current
.line
= get_absolute_expression ();
737 ls
.current
.column
= get_absolute_expression ();
738 demand_empty_rest_of_line ();
740 ls
.current
.flags
= DWARF2_FLAG_BEGIN_STMT
;
744 listing_source_line (ls
.current
.line
);
750 struct dwarf2_line_info
*line
;
752 if (ls
.any_dwarf2_directives
)
756 as_where (&line
->filename
, &line
->line
);
759 line
->flags
= DWARF2_FLAG_BEGIN_STMT
;