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 */
148 /* Function prototypes: */
149 static void out_uleb128
PARAMS ((addressT
));
150 static void out_sleb128
PARAMS ((offsetT
));
151 static void gen_addr_line
PARAMS ((int, addressT
));
152 static void reset_state_machine
PARAMS ((void));
153 static void out_set_addr
PARAMS ((addressT
));
154 static void out_end_sequence
PARAMS ((void));
155 static int get_filenum
PARAMS ((int, char *));
156 static void gen_dir_list
PARAMS ((void));
157 static void gen_file_list
PARAMS ((void));
158 static void print_stats
PARAMS ((unsigned long));
161 #define out_byte(byte) FRAG_APPEND_1_CHAR(byte)
162 #define out_opcode(opc) (out_byte ((opc)), ++ls.opcode_hist[(opc) & 0xff])
164 /* Output an unsigned "little-endian base 128" number. */
169 unsigned char byte
, more
= 0x80;
177 out_byte (more
| byte
);
182 /* Output a signed "little-endian base 128" number. */
187 unsigned char byte
, more
= 0x80;
193 if (((value
== 0) && ((byte
& 0x40) == 0))
194 || ((value
== -1) && ((byte
& 0x40) != 0)))
196 out_byte (more
| byte
);
201 /* Encode a pair of line and address skips as efficiently as possible.
202 Note that the line skip is signed, whereas the address skip is
205 gen_addr_line (line_delta
, addr_delta
)
209 unsigned int tmp
, opcode
;
211 tmp
= line_delta
- DWARF2_LINE_BASE
;
213 if (tmp
>= DWARF2_LINE_RANGE
)
215 out_opcode (DW_LNS_advance_line
);
216 out_sleb128 (line_delta
);
217 tmp
= 0 - DWARF2_LINE_BASE
;
221 tmp
+= DWARF2_LINE_OPCODE_BASE
;
223 /* try using a special opcode: */
224 opcode
= tmp
+ addr_delta
*DWARF2_LINE_RANGE
;
231 /* try using DW_LNS_const_add_pc followed by special op: */
232 opcode
= tmp
+ (addr_delta
- MAX_SPECIAL_ADDR_DELTA
)*DWARF2_LINE_RANGE
;
235 out_opcode (DW_LNS_const_add_pc
);
240 out_opcode (DW_LNS_advance_pc
);
241 out_uleb128 (addr_delta
);
244 out_opcode (tmp
); /* output line-delta */
246 out_opcode (DW_LNS_copy
); /* append new row with current info */
250 reset_state_machine ()
252 static const struct dwarf2_sm initial_state
= { INITIAL_STATE
};
254 ls
.sm
= initial_state
;
257 /* Set an absolute address (may results in a relocation entry): */
262 subsegT saved_subseg
;
266 int bytes_per_address
;
269 saved_subseg
= now_subseg
;
271 subseg_set (ls
.text_seg
, ls
.text_subseg
);
272 sym
= symbol_new (".L0\001", now_seg
, addr
, frag_now
);
274 subseg_set (saved_seg
, saved_subseg
);
277 bytes_per_address
= bfd_arch_bits_per_address (stdoutput
) / 8;
280 bytes_per_address
= 4;
283 out_opcode (DW_LNS_extended_op
);
284 out_uleb128 (bytes_per_address
+ 1);
286 out_opcode (DW_LNE_set_address
);
287 expr
.X_op
= O_symbol
;
288 expr
.X_add_symbol
= sym
;
289 expr
.X_add_number
= 0;
290 emit_expr (&expr
, bytes_per_address
);
293 /* Emit DW_LNS_end_sequence and reset state machine. Does not
294 preserve the current segment/sub-segment! */
298 addressT addr
, delta
;
302 subseg_set (ls
.text_seg
, ls
.text_subseg
);
303 #ifdef md_current_text_addr
304 addr
= md_current_text_addr ();
306 addr
= frag_now_fix ();
308 subseg_set (ls
.line_seg
, DL_BODY
);
309 if (addr
< ls
.sm
.addr
)
316 delta
= addr
- ls
.sm
.addr
;
318 gen_addr_line (0, delta
/ DWARF2_LINE_MIN_INSN_LENGTH
);
322 subseg_set (ls
.line_seg
, DL_BODY
);
324 out_opcode (DW_LNS_extended_op
);
326 out_byte (DW_LNE_end_sequence
);
328 reset_state_machine ();
331 /* Look up a filenumber either by filename or by filenumber. If both
332 a filenumber and a filename are specified, lookup by filename takes
333 precedence. If the filename cannot be found, it is added to the
334 filetable the filenumber for the new entry is returned. */
336 get_filenum (filenum
, file
)
340 int i
, last
= filenum
- 1;
341 char char0
= file
[0];
343 if ((unsigned) last
>= ls
.num_filenames
)
344 last
= ls
.last_filename
;
346 /* do a quick check against the previously used filename: */
347 if (ls
.num_filenames
> 0 && ls
.file
[last
].name
[0] == char0
348 && strcmp (ls
.file
[last
].name
+ 1, file
+ 1) == 0)
351 /* no match, fall back to simple linear scan: */
352 for (i
= 0; i
< ls
.num_filenames
; ++i
)
354 if (ls
.file
[i
].name
[0] == char0
355 && strcmp (ls
.file
[i
].name
+ 1, file
+ 1) == 0)
357 ls
.last_filename
= i
;
362 /* no match: enter new filename */
363 if (ls
.num_filenames
>= ls
.filename_len
)
365 ls
.filename_len
+= 13;
366 ls
.file
= xrealloc (ls
.file
, ls
.filename_len
* sizeof (ls
.file
[0]));
368 ls
.file
[ls
.num_filenames
].dir
= 0;
369 ls
.file
[ls
.num_filenames
].name
= file
;
370 return ++ls
.num_filenames
;
374 dwarf2_gen_line_info (addr
, l
)
376 struct dwarf2_line_info
*l
;
378 unsigned int filenum
= l
->filenum
;
379 unsigned int any_output
= 0;
380 subsegT saved_subseg
;
384 fprintf (stderr
, "line: addr %llx file `%s' line %u col %u flags %x\n",
385 (long long) addr
, l
->filename
, l
->line
, l
->column
, l
->flags
);
387 if (filenum
> 0 && !l
->filename
)
389 if (filenum
>= ls
.num_filenames
)
391 as_warn ("Encountered bad file number in line number debug info!");
395 else if (l
->filename
)
396 filenum
= get_filenum (filenum
, l
->filename
);
398 return; /* no filename, no filnum => no play */
406 ls
.line_seg
= subseg_new (".debug_line", 0);
409 bfd_set_section_flags (stdoutput
, ls
.line_seg
, SEC_READONLY
);
411 /* We're going to need this symbol. */
412 secsym
= symbol_find (".debug_line");
414 symbol_set_bfdsym (secsym
, ls
.line_seg
->symbol
);
416 symbol_table_insert (section_symbol (ls
.line_seg
));
421 saved_subseg
= now_subseg
;
422 subseg_set (ls
.line_seg
, DL_BODY
);
424 if (ls
.text_seg
!= saved_seg
|| ls
.text_subseg
!= saved_subseg
)
426 if (!ls
.sm
.empty_sequence
)
428 out_end_sequence (); /* terminate previous sequence */
429 ls
.sm
.empty_sequence
= 1;
432 ls
.text_seg
= saved_seg
;
433 ls
.text_subseg
= saved_subseg
;
438 if (ls
.sm
.filenum
!= filenum
)
441 out_opcode (DW_LNS_set_file
);
442 out_uleb128 (filenum
);
443 ls
.sm
.filenum
= filenum
;
446 if (ls
.sm
.column
!= l
->column
)
449 out_opcode (DW_LNS_set_column
);
450 out_uleb128 (l
->column
);
451 ls
.sm
.column
= l
->column
;
454 if (((l
->flags
& DWARF2_FLAG_BEGIN_STMT
) != 0) != ls
.sm
.is_stmt
)
457 out_opcode (DW_LNS_negate_stmt
);
460 if (l
->flags
& DWARF2_FLAG_BEGIN_BLOCK
)
463 out_opcode (DW_LNS_set_basic_block
);
466 if (ls
.sm
.line
!= l
->line
)
469 if (addr
< ls
.sm
.addr
)
471 if (!ls
.sm
.empty_sequence
)
474 ls
.sm
.empty_sequence
= 1;
479 gen_addr_line (l
->line
- ls
.sm
.line
,
480 (addr
- ls
.sm
.addr
) / DWARF2_LINE_MIN_INSN_LENGTH
);
481 ls
.sm
.basic_block
= 0;
482 ls
.sm
.line
= l
->line
;
486 subseg_set (saved_seg
, saved_subseg
);
488 ls
.num_line_entries
+= any_output
;
490 ls
.sm
.empty_sequence
= 0;
496 char *str
, *slash
, *dir_list
, *dp
, *cp
;
499 dir_list
= frag_more (0);
502 for (i
= 0; i
< ls
.num_filenames
; ++i
)
504 str
= ls
.file
[i
].name
;
505 slash
= strrchr (str
, '/');
509 for (j
= 0, dp
= dir_list
; j
< num_dirs
; ++j
)
511 if (strcmp (str
, dp
) == 0)
520 /* didn't find this directory: append it to the list */
521 size_t size
= strlen (str
) + 1;
522 cp
= frag_more (size
);
523 memcpy (cp
, str
, size
);
524 ls
.file
[i
].dir
= ++num_dirs
;
527 ls
.file
[i
].name
= slash
+ 1;
530 out_byte ('\0'); /* terminate directory list */
540 for (i
= 0; i
< ls
.num_filenames
; ++i
)
542 size
= strlen (ls
.file
[i
].name
) + 1;
543 cp
= frag_more (size
);
544 memcpy (cp
, ls
.file
[i
].name
, size
);
546 out_uleb128 (ls
.file
[i
].dir
); /* directory number */
547 out_uleb128 (0); /* last modification timestamp */
548 out_uleb128 (0); /* filesize */
550 out_byte (0); /* terminate filename list */
554 print_stats (total_size
)
555 unsigned long total_size
;
557 static const char *opc_name
[] =
559 "extended", "copy", "advance_pc", "advance_line", "set_file",
560 "set_column", "negate_stmt", "set_basic_block", "const_add_pc",
565 fprintf (stderr
, "Average size: %g bytes/line\n",
566 total_size
/ (double) ls
.num_line_entries
);
568 fprintf (stderr
, "\nStandard opcode histogram:\n");
570 for (i
= 0; i
< sizeof (opc_name
)/sizeof (opc_name
[0]); ++i
)
572 fprintf (stderr
, "%s", opc_name
[i
]);
573 for (j
= strlen (opc_name
[i
]); j
< 16; ++j
)
574 fprintf (stderr
, " ");
575 fprintf (stderr
, ": %u\n", ls
.opcode_hist
[i
]);
578 fprintf (stderr
, "\nSpecial opcodes:\naddr\t\t\t\tline skip\n");
580 fprintf (stderr
, "skip: ");
581 for (j
= DWARF2_LINE_BASE
; j
< DWARF2_LINE_BASE
+ DWARF2_LINE_RANGE
; ++j
)
582 fprintf (stderr
, "%3d", j
);
583 fprintf (stderr
, "\n-----");
587 j
= SPECIAL_LINE (i
);
588 if (j
== DWARF2_LINE_BASE
)
589 fprintf (stderr
, "\n%4u: ",
590 DWARF2_LINE_MIN_INSN_LENGTH
*SPECIAL_ADDR (i
));
591 fprintf (stderr
, " %2u", ls
.opcode_hist
[i
]);
593 fprintf (stderr
, "\n");
599 addressT body_size
, total_size
, prolog_size
;
600 subsegT saved_subseg
;
605 /* no .debug_line segment, no work to do... */
609 saved_subseg
= now_subseg
;
611 if (!ls
.sm
.empty_sequence
)
613 total_size
= body_size
= frag_now_fix ();
615 /* now generate the directory and file lists: */
616 subseg_set (ls
.line_seg
, DL_FILES
);
619 total_size
+= frag_now_fix ();
621 /* and now the header ("statement program prolog", in DWARF2 lingo...) */
622 subseg_set (ls
.line_seg
, DL_PROLOG
);
624 cp
= frag_more (15 + DWARF2_LINE_OPCODE_BASE
- 1);
626 total_size
+= frag_now_fix ();
627 prolog_size
= total_size
- body_size
- 10;
629 # define STUFF(val,size) md_number_to_chars (cp, val, size); cp += size;
630 STUFF (total_size
- 4, 4); /* length */
631 STUFF (2, 2); /* version */
632 STUFF (prolog_size
, 4); /* prologue_length */
633 STUFF (DWARF2_LINE_MIN_INSN_LENGTH
, 1);
634 STUFF (DWARF2_LINE_DEFAULT_IS_STMT
, 1);
635 STUFF (DWARF2_LINE_BASE
, 1);
636 STUFF (DWARF2_LINE_RANGE
, 1);
637 STUFF (DWARF2_LINE_OPCODE_BASE
, 1);
639 /* standard_opcode_lengths: */
640 STUFF (0, 1); /* DW_LNS_copy */
641 STUFF (1, 1); /* DW_LNS_advance_pc */
642 STUFF (1, 1); /* DW_LNS_advance_line */
643 STUFF (1, 1); /* DW_LNS_set_file */
644 STUFF (1, 1); /* DW_LNS_set_column */
645 STUFF (0, 1); /* DW_LNS_negate_stmt */
646 STUFF (0, 1); /* DW_LNS_set_basic_block */
647 STUFF (0, 1); /* DW_LNS_const_add_pc */
648 STUFF (1, 1); /* DW_LNS_fixed_advance_pc */
650 subseg_set (saved_seg
, saved_subseg
);
653 print_stats (total_size
);
657 dwarf2_directive_file (dummy
)
662 /* Continue to accept a bare string and pass it off. */
664 if (*input_line_pointer
== '"')
670 ls
.any_dwarf2_directives
= 1;
672 if (debug_type
== DEBUG_NONE
)
673 /* Automatically turn on DWARF2 debug info unless something else
674 has been selected. */
675 debug_type
= DEBUG_DWARF2
;
677 ls
.current
.filenum
= get_absolute_expression ();
678 ls
.current
.filename
= demand_copy_C_string (&len
);
680 demand_empty_rest_of_line ();
684 dwarf2_directive_loc (dummy
)
687 ls
.any_dwarf2_directives
= 1;
689 ls
.current
.filenum
= get_absolute_expression ();
691 ls
.current
.line
= get_absolute_expression ();
693 ls
.current
.column
= get_absolute_expression ();
694 demand_empty_rest_of_line ();
696 ls
.current
.flags
= DWARF2_FLAG_BEGIN_STMT
;
700 listing_source_line (ls
.current
.line
);
706 struct dwarf2_line_info
*line
;
708 if (ls
.any_dwarf2_directives
)
712 as_where (&line
->filename
, &line
->line
);
715 line
->flags
= DWARF2_FLAG_BEGIN_STMT
;