/* dwarf2dbg.c - DWARF2 debug support
- Copyright (C) 1999-2019 Free Software Foundation, Inc.
+ Copyright (C) 1999-2020 Free Software Foundation, Inc.
Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
This file is part of GAS, the GNU Assembler.
/* Set an absolute address (may result in a relocation entry). */
-static void
-out_inc_line_addr (int line_delta, addressT addr_delta);
-
static void
out_set_addr (symbolS *sym)
{
expressionS exp;
- addressT expr_addr, expr_addr_aligned;
memset (&exp, 0, sizeof exp);
+ out_opcode (DW_LNS_extended_op);
+ out_uleb128 (sizeof_address + 1);
- /* The expression at the bottom must be aligned to OCTETS_PER_BYTE. The
- statements after the for loop will contribute 3 more octets. */
- expr_addr = frag_now_fix_octets () + 3;
- expr_addr_aligned = (expr_addr + OCTETS_PER_BYTE - 1) & -OCTETS_PER_BYTE;
- for ( ; expr_addr != expr_addr_aligned; expr_addr++)
- out_inc_line_addr (0, 0); /* NOP */
-
- out_opcode (DW_LNS_extended_op); /* 1 octet */
- out_uleb128 (sizeof_address + 1); /* 1 octet */
-
- out_opcode (DW_LNE_set_address); /* 1 octet */
+ out_opcode (DW_LNE_set_address);
exp.X_op = O_symbol;
exp.X_add_symbol = sym;
exp.X_add_number = 0;
symbolS *line_end;
struct line_seg *s;
int sizeof_offset;
- addressT section_end, section_end_aligned;
memset (&exp, 0, sizeof exp);
sizeof_offset = out_header (line_seg, &exp);
exp.X_op_symbol = prologue_start;
exp.X_add_number = 0;
emit_expr (&exp, sizeof_offset);
- symbol_set_value_now_octets (prologue_start);
+ symbol_set_value_now (prologue_start);
/* Parameters of the state machine. */
out_byte (DWARF2_LINE_MIN_INSN_LENGTH);
out_file_list ();
- symbol_set_value_now_octets (prologue_end);
+ symbol_set_value_now (prologue_end);
/* For each section, emit a statement program. */
for (s = all_segs; s; s = s->next)
in the DWARF Line Number header. */
subseg_set (subseg_get (".debug_line_end", FALSE), 0);
- /* Pad size of .debug_line section to a multiple of OCTETS_PER_BYTE.
- Simply sizing the section in md_section_align() is not sufficient,
- also the size field in the .debug_line header must be a multiple
- of OCTETS_PER_BYTE. Not doing so will introduce gaps within the
- .debug_line sections after linking. */
- section_end = frag_now_fix_octets ();
- section_end_aligned = (section_end + OCTETS_PER_BYTE - 1) & -OCTETS_PER_BYTE;
- for ( ; section_end != section_end_aligned; section_end++)
- out_inc_line_addr (0, 0); /* NOP */
-
- symbol_set_value_now_octets (line_end);
+ symbol_set_value_now (line_end);
}
static void
md_number_to_chars (p, 0, addr_size);
md_number_to_chars (p + addr_size, 0, addr_size);
- symbol_set_value_now_octets (aranges_end);
+ symbol_set_value_now (aranges_end);
}
/* Emit data for .debug_abbrev. Note that this must be kept in
dwarf2 draft has no standard code for assembler. */
out_two (DW_LANG_Mips_Assembler);
- symbol_set_value_now_octets (info_end);
+ symbol_set_value_now (info_end);
}
/* Emit the three debug strings needed in .debug_str and setup symbols
dwarf2_init (void)
{
last_seg_ptr = &all_segs;
+
+ /* Select the default CIE version to produce here. The global
+ starts with a value of -1 and will be modified to a valid value
+ either by the user providing a command line option, or some
+ targets will select their own default in md_after_parse_args. If
+ we get here and the global still contains -1 then it is up to us
+ to pick a sane default. The default we choose is 1, this is the
+ CIE version gas has produced for a long time, and there seems no
+ reason to change it yet. */
+ if (flag_dwarf_cie_version == -1)
+ flag_dwarf_cie_version = 1;
}
/* Create and switch to the line number section. */
line_seg = subseg_new (".debug_line", 0);
- bfd_set_section_flags (line_seg, SEC_READONLY | SEC_DEBUGGING);
+ bfd_set_section_flags (line_seg, SEC_READONLY | SEC_DEBUGGING | SEC_OCTETS);
/* For each subsection, chain the debug entries together. */
for (s = all_segs; s; s = s->next)
aranges_seg = subseg_new (".debug_aranges", 0);
str_seg = subseg_new (".debug_str", 0);
- bfd_set_section_flags (info_seg, SEC_READONLY | SEC_DEBUGGING);
- bfd_set_section_flags (abbrev_seg, SEC_READONLY | SEC_DEBUGGING);
- bfd_set_section_flags (aranges_seg, SEC_READONLY | SEC_DEBUGGING);
- bfd_set_section_flags (str_seg, (SEC_READONLY | SEC_DEBUGGING
- | SEC_MERGE | SEC_STRINGS));
+ bfd_set_section_flags (info_seg,
+ SEC_READONLY | SEC_DEBUGGING | SEC_OCTETS);
+ bfd_set_section_flags (abbrev_seg,
+ SEC_READONLY | SEC_DEBUGGING | SEC_OCTETS);
+ bfd_set_section_flags (aranges_seg,
+ SEC_READONLY | SEC_DEBUGGING | SEC_OCTETS);
+ bfd_set_section_flags (str_seg,
+ SEC_READONLY | SEC_DEBUGGING | SEC_OCTETS
+ | SEC_MERGE | SEC_STRINGS);
str_seg->entsize = 1;
record_alignment (aranges_seg, ffs (2 * sizeof_address) - 1);
else
{
ranges_seg = subseg_new (".debug_ranges", 0);
- bfd_set_section_flags (ranges_seg, SEC_READONLY | SEC_DEBUGGING);
+ bfd_set_section_flags (ranges_seg,
+ SEC_READONLY | SEC_DEBUGGING | SEC_OCTETS);
record_alignment (ranges_seg, ffs (2 * sizeof_address) - 1);
out_debug_ranges (ranges_seg);
}