1 /* dwarf2dbg.c - DWARF2 debug support
2 Copyright (C) 1999 Hewlett-Packard Co
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 #define BYTES_PER_ADDRESS (BFD_ARCH_SIZE / 8)
40 /* Since we can't generate the prolog until the body is complete, we
41 use three different subsegments for .debug_line: one holding the
42 prolog, one for the directory and filename info, and one for the
43 body ("statement program"). */
48 /* First special line opcde - leave room for the standard opcodes.
49 Note: If you want to change this, you'll have to update the
50 "standard_opcode_lengths" table that is emitted below in
52 #define DWARF2_LINE_OPCODE_BASE 10
54 #ifndef DWARF2_LINE_BASE
55 /* Minimum line offset in a special line info. opcode. This value
56 was chosen to give a reasonable range of values. */
57 # define DWARF2_LINE_BASE -5
60 /* Range of line offsets in a special line info. opcode. */
61 #ifndef DWARF2_LINE_RANGE
62 # define DWARF2_LINE_RANGE 14
65 #ifndef DWARF2_LINE_MIN_INSN_LENGTH
66 /* Define the architecture-dependent minimum instruction length (in
67 bytes). This value should be rather too small than too big. */
68 # define DWARF2_LINE_MIN_INSN_LENGTH 4
71 /* Flag that indicates the initial value of the is_stmt_start flag.
72 In the present implementation, we do not mark any lines as
73 the beginning of a source statement, because that information
74 is not made available by the GCC front-end. */
75 #define DWARF2_LINE_DEFAULT_IS_STMT 1
77 /* Flag that indicates the initial value of the is_stmt_start flag.
78 In the present implementation, we do not mark any lines as
79 the beginning of a source statement, because that information
80 is not made available by the GCC front-end. */
81 #define DWARF2_LINE_DEFAULT_IS_STMT 1
83 /* Given a special op, return the line skip amount: */
84 #define SPECIAL_LINE(op) \
85 (((op) - DWARF2_LINE_OPCODE_BASE)%DWARF2_LINE_RANGE + DWARF2_LINE_BASE)
87 /* Given a special op, return the address skip amount (in units of
88 DWARF2_LINE_MIN_INSN_LENGTH. */
89 #define SPECIAL_ADDR(op) (((op) - DWARF2_LINE_OPCODE_BASE)/DWARF2_LINE_RANGE)
91 /* The maximum address skip amont that can be encoded with a special op: */
92 #define MAX_SPECIAL_ADDR_DELTA SPECIAL_ADDR(255)
94 #define INITIAL_STATE \
95 /* initialize as per DWARF2.0 standard: */ \
100 DWARF2_LINE_DEFAULT_IS_STMT, /* is_stmt */ \
101 0, /* basic_block */ \
102 1 /* empty_sequence */
106 /* state machine state as per DWARF2 manual: */
110 unsigned int filenum
;
116 empty_sequence
: 1; /* current code sequence has no DWARF2 directives? */
121 any_dwarf2_directives
: 1; /* did we emit any DWARF2 line debug directives? */
123 segT text_seg
; /* text segment "addr" is relative to */
125 segT line_seg
; /* ".debug_line" segment */
126 int last_filename
; /* index of last filename that was used */
127 int num_filenames
; /* index of last filename in use */
128 int filename_len
; /* length of the filename array */
131 int dir
; /* valid after gen_dir_list() only */
132 char *name
; /* full path before gen_dir_list(), filename afterwards */
136 struct dwarf2_line_info current
; /* current source info: */
138 /* counters for statistical purposes: */
139 unsigned int num_line_entries
;
140 unsigned int opcode_hist
[256]; /* histogram of opcode frequencies */
150 /* Function prototypes: */
151 static void out_uleb128
PARAMS ((bfd_vma
));
152 static void out_sleb128
PARAMS ((bfd_signed_vma
));
153 static void gen_addr_line
PARAMS ((int, bfd_vma
));
154 static void reset_state_machine
PARAMS ((void));
155 static void out_set_addr
PARAMS ((bfd_vma
));
156 static void out_end_sequence
PARAMS ((void));
157 static int get_filenum
PARAMS ((int, char *));
158 static void gen_dir_list
PARAMS ((void));
159 static void gen_file_list
PARAMS ((void));
160 static void print_stats
PARAMS ((unsigned long));
163 #define out_byte(byte) FRAG_APPEND_1_CHAR(byte)
164 #define out_opcode(opc) (out_byte ((opc)), ++ls.opcode_hist[(opc) & 0xff])
166 /* Output an unsigned "little-endian base 128" number. */
171 unsigned char byte
, more
= 0x80;
179 out_byte (more
| byte
);
184 /* Output a signed "little-endian base 128" number. */
187 bfd_signed_vma value
;
189 unsigned char byte
, more
= 0x80;
195 if (((value
== 0) && ((byte
& 0x40) == 0))
196 || ((value
== -1) && ((byte
& 0x40) != 0)))
198 out_byte (more
| byte
);
203 /* Encode a pair of line and address skips as efficiently as possible.
204 Note that the line skip is signed, whereas the address skip is
207 gen_addr_line (line_delta
, addr_delta
)
211 unsigned int tmp
, opcode
;
213 tmp
= line_delta
- DWARF2_LINE_BASE
;
215 if (tmp
>= DWARF2_LINE_RANGE
)
217 out_opcode (DW_LNS_advance_line
);
218 out_sleb128 (line_delta
);
219 tmp
= 0 - DWARF2_LINE_BASE
;
223 tmp
+= DWARF2_LINE_OPCODE_BASE
;
225 /* try using a special opcode: */
226 opcode
= tmp
+ addr_delta
*DWARF2_LINE_RANGE
;
233 /* try using DW_LNS_const_add_pc followed by special op: */
234 opcode
= tmp
+ (addr_delta
- MAX_SPECIAL_ADDR_DELTA
)*DWARF2_LINE_RANGE
;
237 out_opcode (DW_LNS_const_add_pc
);
242 out_opcode (DW_LNS_advance_pc
);
243 out_uleb128 (addr_delta
);
246 out_opcode (tmp
); /* output line-delta */
248 out_opcode (DW_LNS_copy
); /* append new row with current info */
252 reset_state_machine ()
254 static const struct dwarf2_sm initial_state
= { INITIAL_STATE
};
256 ls
.sm
= initial_state
;
259 /* Set an absolute address (may results in a relocation entry): */
264 subsegT saved_subseg
;
270 saved_subseg
= now_subseg
;
272 subseg_set (ls
.text_seg
, ls
.text_subseg
);
273 sym
= symbol_new (".L0\001", now_seg
, addr
, frag_now
);
275 subseg_set (saved_seg
, saved_subseg
);
277 out_opcode (DW_LNS_extended_op
);
278 out_uleb128 (BYTES_PER_ADDRESS
+ 1);
280 out_opcode (DW_LNE_set_address
);
281 expr
.X_op
= O_symbol
;
282 expr
.X_add_symbol
= sym
;
283 expr
.X_add_number
= 0;
284 emit_expr (&expr
, BYTES_PER_ADDRESS
);
287 /* Emit DW_LNS_end_sequence and reset state machine. Does not
288 preserve the current segment/sub-segment! */
296 subseg_set (ls
.text_seg
, ls
.text_subseg
);
297 #ifdef md_current_text_addr
298 addr
= md_current_text_addr ();
300 addr
= frag_now_fix ();
302 subseg_set (ls
.line_seg
, DL_BODY
);
303 if (addr
< ls
.sm
.addr
)
310 delta
= addr
- ls
.sm
.addr
;
312 gen_addr_line (0, delta
/ DWARF2_LINE_MIN_INSN_LENGTH
);
316 subseg_set (ls
.line_seg
, DL_BODY
);
318 out_opcode (DW_LNS_extended_op
);
320 out_byte (DW_LNE_end_sequence
);
322 reset_state_machine ();
325 /* Look up a filenumber either by filename or by filenumber. If both
326 a filenumber and a filename are specified, lookup by filename takes
327 precedence. If the filename cannot be found, it is added to the
328 filetable the filenumber for the new entry is returned. */
330 get_filenum (filenum
, file
)
334 int i
, last
= filenum
- 1;
335 char char0
= file
[0];
337 if ((unsigned) last
>= ls
.num_filenames
)
338 last
= ls
.last_filename
;
340 /* do a quick check against the previously used filename: */
341 if (ls
.num_filenames
> 0 && ls
.file
[last
].name
[0] == char0
342 && strcmp (ls
.file
[last
].name
+ 1, file
+ 1) == 0)
345 /* no match, fall back to simple linear scan: */
346 for (i
= 0; i
< ls
.num_filenames
; ++i
)
348 if (ls
.file
[i
].name
[0] == char0
349 && strcmp (ls
.file
[i
].name
+ 1, file
+ 1) == 0)
351 ls
.last_filename
= i
;
356 /* no match: enter new filename */
357 if (ls
.num_filenames
>= ls
.filename_len
)
359 ls
.filename_len
+= 13;
360 ls
.file
= xrealloc (ls
.file
, ls
.filename_len
* sizeof (ls
.file
[0]));
362 ls
.file
[ls
.num_filenames
].dir
= 0;
363 ls
.file
[ls
.num_filenames
].name
= file
;
364 return ++ls
.num_filenames
;
368 dwarf2_gen_line_info (addr
, l
)
370 struct dwarf2_line_info
*l
;
372 unsigned int filenum
= l
->filenum
;
373 unsigned int any_output
= 0;
374 subsegT saved_subseg
;
378 fprintf (stderr
, "line: addr %llx file `%s' line %u col %u flags %x\n",
379 (long long) addr
, l
->filename
, l
->line
, l
->column
, l
->flags
);
381 if (filenum
> 0 && !l
->filename
)
383 if (filenum
>= ls
.num_filenames
)
385 as_warn ("Encountered bad file number in line number debug info!");
389 else if (l
->filename
)
390 filenum
= get_filenum (filenum
, l
->filename
);
392 return; /* no filename, no filnum => no play */
396 ls
.line_seg
= subseg_new (".debug_line", 0);
397 bfd_set_section_flags (stdoutput
, ls
.line_seg
, SEC_READONLY
);
399 /* We're going to need this symbol. */
400 (void) section_symbol (ls
.line_seg
);
404 saved_subseg
= now_subseg
;
405 subseg_set (ls
.line_seg
, DL_BODY
);
407 if (ls
.text_seg
!= saved_seg
|| ls
.text_subseg
!= saved_subseg
)
409 if (!ls
.sm
.empty_sequence
)
411 out_end_sequence (); /* terminate previous sequence */
412 ls
.sm
.empty_sequence
= 1;
415 ls
.text_seg
= saved_seg
;
416 ls
.text_subseg
= saved_subseg
;
421 if (ls
.sm
.filenum
!= filenum
)
424 out_opcode (DW_LNS_set_file
);
425 out_uleb128 (filenum
);
426 ls
.sm
.filenum
= filenum
;
429 if (ls
.sm
.column
!= l
->column
)
432 out_opcode (DW_LNS_set_column
);
433 out_uleb128 (l
->column
);
434 ls
.sm
.column
= l
->column
;
437 if (((l
->flags
& DWARF2_FLAG_BEGIN_STMT
) != 0) != ls
.sm
.is_stmt
)
440 out_opcode (DW_LNS_negate_stmt
);
443 if (l
->flags
& DWARF2_FLAG_BEGIN_BLOCK
)
446 out_opcode (DW_LNS_set_basic_block
);
449 if (ls
.sm
.line
!= l
->line
)
452 if (addr
< ls
.sm
.addr
)
454 if (!ls
.sm
.empty_sequence
)
457 ls
.sm
.empty_sequence
= 1;
462 gen_addr_line (l
->line
- ls
.sm
.line
,
463 (addr
- ls
.sm
.addr
) / DWARF2_LINE_MIN_INSN_LENGTH
);
464 ls
.sm
.basic_block
= 0;
465 ls
.sm
.line
= l
->line
;
469 subseg_set (saved_seg
, saved_subseg
);
471 ls
.num_line_entries
+= any_output
;
473 ls
.sm
.empty_sequence
= 0;
479 char *str
, *slash
, *dir_list
, *dp
, *cp
;
482 dir_list
= frag_more (0);
485 for (i
= 0; i
< ls
.num_filenames
; ++i
)
487 str
= ls
.file
[i
].name
;
488 slash
= strrchr (str
, '/');
492 for (j
= 0, dp
= dir_list
; j
< num_dirs
; ++j
)
494 if (strcmp (str
, dp
) == 0)
503 /* didn't find this directory: append it to the list */
504 size_t size
= strlen (str
) + 1;
505 cp
= frag_more (size
);
506 memcpy (cp
, str
, size
);
507 ls
.file
[i
].dir
= ++num_dirs
;
510 ls
.file
[i
].name
= slash
+ 1;
513 out_byte ('\0'); /* terminate directory list */
523 for (i
= 0; i
< ls
.num_filenames
; ++i
)
525 size
= strlen (ls
.file
[i
].name
) + 1;
526 cp
= frag_more (size
);
527 memcpy (cp
, ls
.file
[i
].name
, size
);
529 out_uleb128 (ls
.file
[i
].dir
); /* directory number */
530 out_uleb128 (0); /* last modification timestamp */
531 out_uleb128 (0); /* filesize */
533 out_byte (0); /* terminate filename list */
537 print_stats (total_size
)
538 unsigned long total_size
;
540 static const char *opc_name
[] =
542 "extended", "copy", "advance_pc", "advance_line", "set_file",
543 "set_column", "negate_stmt", "set_basic_block", "const_add_pc",
548 fprintf (stderr
, "Average size: %g bytes/line\n",
549 total_size
/ (double) ls
.num_line_entries
);
551 fprintf (stderr
, "\nStandard opcode histogram:\n");
553 for (i
= 0; i
< sizeof (opc_name
)/sizeof (opc_name
[0]); ++i
)
555 fprintf (stderr
, "%s", opc_name
[i
]);
556 for (j
= strlen (opc_name
[i
]); j
< 16; ++j
)
557 fprintf (stderr
, " ");
558 fprintf (stderr
, ": %u\n", ls
.opcode_hist
[i
]);
561 fprintf (stderr
, "\nSpecial opcodes:\naddr\t\t\t\tline skip\n");
563 fprintf (stderr
, "skip: ");
564 for (j
= DWARF2_LINE_BASE
; j
< DWARF2_LINE_BASE
+ DWARF2_LINE_RANGE
; ++j
)
565 fprintf (stderr
, "%3d", j
);
566 fprintf (stderr
, "\n-----");
570 j
= SPECIAL_LINE (i
);
571 if (j
== DWARF2_LINE_BASE
)
572 fprintf (stderr
, "\n%4u: ",
573 DWARF2_LINE_MIN_INSN_LENGTH
*SPECIAL_ADDR (i
));
574 fprintf (stderr
, " %2u", ls
.opcode_hist
[i
]);
576 fprintf (stderr
, "\n");
582 bfd_vma body_size
, total_size
, prolog_size
;
583 subsegT saved_subseg
;
588 /* no .debug_line segment, no work to do... */
592 saved_subseg
= now_subseg
;
594 if (!ls
.sm
.empty_sequence
)
596 total_size
= body_size
= frag_now_fix ();
598 /* now generate the directory and file lists: */
599 subseg_set (ls
.line_seg
, DL_FILES
);
602 total_size
+= frag_now_fix ();
604 /* and now the header ("statement program prolog", in DWARF2 lingo...) */
605 subseg_set (ls
.line_seg
, DL_PROLOG
);
607 cp
= frag_more (15 + DWARF2_LINE_OPCODE_BASE
- 1);
609 total_size
+= frag_now_fix ();
610 prolog_size
= total_size
- body_size
- 10;
612 # define STUFF(val,size) md_number_to_chars (cp, val, size); cp += size;
613 STUFF (total_size
- 4, 4); /* length */
614 STUFF (2, 2); /* version */
615 STUFF (prolog_size
, 4); /* prologue_length */
616 STUFF (DWARF2_LINE_MIN_INSN_LENGTH
, 1);
617 STUFF (DWARF2_LINE_DEFAULT_IS_STMT
, 1);
618 STUFF (DWARF2_LINE_BASE
, 1);
619 STUFF (DWARF2_LINE_RANGE
, 1);
620 STUFF (DWARF2_LINE_OPCODE_BASE
, 1);
622 /* standard_opcode_lengths: */
623 STUFF (0, 1); /* DW_LNS_copy */
624 STUFF (1, 1); /* DW_LNS_advance_pc */
625 STUFF (1, 1); /* DW_LNS_advance_line */
626 STUFF (1, 1); /* DW_LNS_set_file */
627 STUFF (1, 1); /* DW_LNS_set_column */
628 STUFF (0, 1); /* DW_LNS_negate_stmt */
629 STUFF (0, 1); /* DW_LNS_set_basic_block */
630 STUFF (0, 1); /* DW_LNS_const_add_pc */
631 STUFF (1, 1); /* DW_LNS_fixed_advance_pc */
633 subseg_set (saved_seg
, saved_subseg
);
636 print_stats (total_size
);
640 dwarf2_directive_file (dummy
)
645 /* Continue to accept a bare string and pass it off. */
647 if (*input_line_pointer
== '"')
653 ls
.any_dwarf2_directives
= 1;
655 if (debug_type
== DEBUG_NONE
)
656 /* Automatically turn on DWARF2 debug info unless something else
657 has been selected. */
658 debug_type
= DEBUG_DWARF2
;
660 ls
.current
.filenum
= get_absolute_expression ();
661 ls
.current
.filename
= demand_copy_C_string (&len
);
663 demand_empty_rest_of_line ();
667 dwarf2_directive_loc (dummy
)
670 ls
.any_dwarf2_directives
= 1;
672 ls
.current
.filenum
= get_absolute_expression ();
674 ls
.current
.line
= get_absolute_expression ();
676 ls
.current
.column
= get_absolute_expression ();
677 demand_empty_rest_of_line ();
679 ls
.current
.flags
= DWARF2_FLAG_BEGIN_STMT
;
683 listing_source_line (ls
.current
.line
);
689 struct dwarf2_line_info
*line
;
691 if (ls
.any_dwarf2_directives
)
695 as_where (&line
->filename
, &line
->line
);
698 line
->flags
= DWARF2_FLAG_BEGIN_STMT
;