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},
/* These are used for dwarf2. */
{ "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 },
{ "lloc", dwarf2_directive_loc, 1 },
{ "subprog", dwarf2_directive_subprog, 0 },
/* We need to trap the section changing calls to handle .previous. */
{"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 flags;
unsigned int discriminator;
unsigned int logical;
};
/* Implements the .file FILENO "FILENAME" directive. FILENO can be 0
@@ -42,13 +43,29 @@ struct dwarf2_line_info {
number must be >0. */
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
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 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. */
extern void dwarf2_directive_loc_mark_labels (int dummy);