Add support for DWARF-5 and experimental two-level line number tables.

2014-12-23  Cary Coutant  <ccoutant@google.com>

gas/
	* config/obj-elf.c (elf_pseudo_table): Add .lloc and .subprog
	directives.
	* dwarf2dbg.h (struct dwarf2_line_info): Add logical field.
	(dwarf2_directive_subprog): New function.
	(dwarf2_directive_loc): Add is_lloc parameter.
	* dwarf2dbg.c: Include "hash.h".
	(line_base): New variable.
	(line_range): New variable.
	(DWARF2_EXPERIMENTAL_LINE_OPCODE_BASE): Rename.
	(DWARF2_LINE_BASE): Restore to original value.
	(DWARF2_LINE_RANGE): Likewise.
	(DWARF5_EXPERIMENTAL_LINE_BASE): New macro.
	(DWARF5_EXPERIMENTAL_LINE_RANGE): New macro.
	(SPECIAL_LINE): Use line_base, line_range.
	(DWARF2_LINE_EXPERIMENTAL_VERSION): New macro.
	(DWARF2_EXPERIMENTAL_LINE_OPCODE_BASE): New macro.
	(opcode_base): New static variable.
	(DWARF2_LINE_BASE, DWARF2_LINE_RANGE): Adjust parameters.
	(DWARF2_LINE_MAX_OPS_PER_INSN): New macro.
	(SPECIAL_LINE, SPECIAL_ADDR): Use opcode_base.
	(struct subprog_entry): New struct.
	(subprogs, subprogs_in_use, subprogs_allocated): New variables.
	(struct logicals_entry): New struct.
	(logicals, logicals_in_use, logicals_allocated, logicals_with_labels):
	New variables.
	(struct string_table): New struct.
	(debug_line_str_table): New variable.
	(current): Add logical field.
	(dwarf2_gen_line_info): Fill in symbol and segment for recent logicals.
	(dwarf2_where): Add logical field.
	(make_subprog_entry): New function.
	(make_logical): New function.
	(dwarf2_directive_subprog): New function.
	(dwarf2_directive_loc): Add is_lloc parameter; add support for .lloc
	directive.
	(out_set_addr_from_logical): New function.
	(size_inc_line_addr): Fix signed/unsigned warnings. Use opcode_base,
	line_base, line_range.
	(emit_inc_line_addr): Likewise.
	(emit_logicals): New function.
	(process_entries): Add support for two-level line tables.
	(add_to_string_table): New function.
	(out_string_table): New function.
	(out_dwarf5_file_list): New function.
	(out_subprog_list): New function.
	(out_debug_line): Add support for DWARF-5 line tables and for
	experimental two-level line number tables.
	(dwarf2_finish): Likewise.
This commit is contained in:
Cary Coutant
2014-12-23 15:01:40 -08:00
parent 13a142ce09
commit a7c7bcafd2
3 changed files with 758 additions and 81 deletions

View File

@@ -125,8 +125,10 @@ static const pseudo_typeS elf_pseudo_table[] =
{"8byte", cons, 8}, {"8byte", cons, 8},
/* These are used for dwarf2. */ /* These are used for dwarf2. */
{ "file", (void (*) (int)) dwarf2_directive_file, 0 }, { "file", (void (*) (int)) dwarf2_directive_file, 0 },
{ "loc", dwarf2_directive_loc, 0 }, { "loc", dwarf2_directive_loc, 0 },
{ "loc_mark_labels", dwarf2_directive_loc_mark_labels, 0 }, { "loc_mark_labels", dwarf2_directive_loc_mark_labels, 0 },
{ "lloc", dwarf2_directive_loc, 1 },
{ "subprog", dwarf2_directive_subprog, 0 },
/* We need to trap the section changing calls to handle .previous. */ /* We need to trap the section changing calls to handle .previous. */
{"data", obj_elf_data, 0}, {"data", obj_elf_data, 0},

File diff suppressed because it is too large Load Diff

View File

@@ -35,6 +35,7 @@ struct dwarf2_line_info {
unsigned int isa; unsigned int isa;
unsigned int flags; unsigned int flags;
unsigned int discriminator; unsigned int discriminator;
unsigned int logical;
}; };
/* Implements the .file FILENO "FILENAME" directive. FILENO can be 0 /* Implements the .file FILENO "FILENAME" directive. FILENO can be 0
@@ -42,13 +43,29 @@ struct dwarf2_line_info {
number must be >0. */ number must be >0. */
extern char *dwarf2_directive_file (int dummy); extern char *dwarf2_directive_file (int dummy);
/* Experimental DWARF-5 extension:
Implements the .subprog SUBPNO ["SUBPROG" [FILENO LINENO]] directive.
FILENO is the file number, LINENO the line number and the
(optional) COLUMN the column of the source code that the following
instruction corresponds to. FILENO can be 0 to indicate that the
filename specified by the textually most recent .file directive
should be used. */
extern void dwarf2_directive_subprog (int dummy);
/* Implements the .loc FILENO LINENO [COLUMN] directive. FILENO is /* Implements the .loc FILENO LINENO [COLUMN] directive. FILENO is
the file number, LINENO the line number and the (optional) COLUMN the file number, LINENO the line number and the (optional) COLUMN
the column of the source code that the following instruction the column of the source code that the following instruction
corresponds to. FILENO can be 0 to indicate that the filename corresponds to. FILENO can be 0 to indicate that the filename
specified by the textually most recent .file directive should be specified by the textually most recent .file directive should be
used. */ used. */
extern void dwarf2_directive_loc (int dummy); /* Experimental DWARF-5 extension:
If IS_LLOC is true, implements the .lloc LOGICAL [FILENO LINENO [COLUMN]]
directive. FILENO is the file number, LINENO the line number and the
(optional) COLUMN the column of the source code that the following
instruction corresponds to. FILENO can be 0 to indicate that the
filename specified by the textually most recent .file directive
should be used. */
extern void dwarf2_directive_loc (int is_lloc);
/* Implements the .loc_mark_labels {0,1} directive. */ /* Implements the .loc_mark_labels {0,1} directive. */
extern void dwarf2_directive_loc_mark_labels (int dummy); extern void dwarf2_directive_loc_mark_labels (int dummy);