binutils* dwarf.c (struct State_Machine_Registers): Add view field.
(reset_state_machine): Reset view.
(process_extended_line_op): Reset view when appropriate.
(display_debug_lines_raw): Increment or reset view when appropriate.
Print nonzero views. Support print view resets, disabled by default.
(display_debug_lines_decoded): Likewise. Disambiguate op_code tests,
enabling printing of end_sequence.
* testsuite/binutils-all/dw2-1.W: Add nonzero views.
* testsuite/binutils-all/dw2-3.W: Likewise.
* testsuite/binutils-all/dw2-3gabi.W: Likewise.
* testsuite/binutils-all/dw5.W: Add end sequence lines.
* testsuite/binutils-all/i386/compressed-1a.d: Add nonzero views.
* testsuite/binutils-all/libdw2-compressedgabi.out: Likewise.
* testsuite/binutils-all/objdump.W: Likewise.
* testsuite/binutils-all/objdump.WL: Add end sequence lines.
* testsuite/binutils-all/x86-64/compressed-1a.d: Add nonzero views.
gas * doc/as.texinfo (.loc): Document view support.
* dwarf2dbg.c (unused): Check offset of next in struct line_entry.
(current): Initialize view.
(force_reset_view, view_assert_failed): New variables.
(reverse_line_entry_list): New function.
(set_or_check_view): Likewise.
(dwarf2_gen_line_info_1): Call it.
(dwarf2_where): Set view to NULL.
(dwarf2_emit_insn): Return early when called before first file.
(dwarf2_directive_loc): Add view support. Emit insn
immediately when view option is given.
(process_entries): Avoid set_address to reset view when a known
address change already implies the view reset.
(dwarf2dbg_final_check): New function.
* dwarf2dbg.h (struct dwarf2_line_info): Add view.
(dwarf2dbg_final_check): Declare.
* read.c (s_leb128): Parse expression as deferred.
* testsuite/gas/all/gas.exp: Run sleb128-9.
* testsuite/gas/all/sleb128-9.d: New.
* testsuite/gas/all/sleb128-9.l: New.
* testsuite/gas/all/sleb128-9.s: New.
* testsuite/gas/elf/dwarf2-1.d: Add nonzero views.
* testsuite/gas/elf/dwarf2-2.d: Likewise.
* testsuite/gas/elf/dwarf2-5.d: New.
* testsuite/gas/elf/dwarf2-5.s: New.
* testsuite/gas/elf/dwarf2-6.d: New.
* testsuite/gas/elf/dwarf2-6.s: New.
* testsuite/gas/elf/dwarf2-7.d: New.
* testsuite/gas/elf/dwarf2-7.s: New.
* testsuite/gas/elf/dwarf2-8.d: New.
* testsuite/gas/elf/dwarf2-8.l: New.
* testsuite/gas/elf/dwarf2-8.s: New.
* testsuite/gas/elf/dwarf2-9.d: New.
* testsuite/gas/elf/dwarf2-9.l: New.
* testsuite/gas/elf/dwarf2-9.s: New.
* testsuite/gas/elf/dwarf2-10.d: New.
* testsuite/gas/elf/dwarf2-10.l: New.
* testsuite/gas/elf/dwarf2-10.s: New.
* testsuite/gas/elf/dwarf2-11.d: New.
* testsuite/gas/elf/dwarf2-11.s: New.
* testsuite/gas/elf/dwarf2-12.d: New.
* testsuite/gas/elf/dwarf2-12.s: New.
* testsuite/gas/elf/dwarf2-13.d: New.
* testsuite/gas/elf/dwarf2-13.s: New.
* testsuite/gas/elf/dwarf2-14.d: New.
* testsuite/gas/elf/dwarf2-14.s: New.
* testsuite/gas/elf/dwarf2-15.d: New.
* testsuite/gas/elf/dwarf2-15.s: New.
* testsuite/gas/elf/dwarf2-16.d: New.
* testsuite/gas/elf/dwarf2-16.s: New.
* testsuite/gas/elf/dwarf2-17.d: New.
* testsuite/gas/elf/dwarf2-17.s: New.
* testsuite/gas/elf/dwarf2-18.d: New.
* testsuite/gas/elf/dwarf2-18.s: New.
* testsuite/gas/elf/elf.exp: Run dwarf2-5..18 tests.
* testsuite/gas/i386/dw2-compress-1.d: Add nonzero views.
* testsuite/gas/i386/dw2-compressed-1.d: Likewise.
* testsuite/gas/i386/ilp32/lns/lns-duplicate.d: Likewise.
* testsuite/gas/lns/lns-big-delta.d: Likewise.
* testsuite/gas/lns/lns-duplicate.d: Likewise.
* testsuite/gas/mips/loc-swap-2.d: Likewise.
* testsuite/gas/mips/loc-swap-3.d: Likewise.
* testsuite/gas/mips/loc-swap.d: Likewise.
* testsuite/gas/mips/micromips@loc-swap-2.d: Likewise.
* testsuite/gas/mips/micromips@loc-swap.d: Likewise.
* testsuite/gas/mips/mips16@loc-swap-2.d: Likewise.
* testsuite/gas/mips/mips16@loc-swap.d: Likewise.
* testsuite/gas/mips/mips16e@loc-swap.d: Likewise.
* write.c (write_object_file): Check pending view asserts.
(cvt_frag_to_fill): Complain about undefined leb128 operand.
+2017-07-21 Alexandre Oliva <aoliva@redhat.com>
+
+ * dwarf.c (struct State_Machine_Registers): Add view field.
+ (reset_state_machine): Reset view.
+ (process_extended_line_op): Reset view when appropriate.
+ (display_debug_lines_raw): Increment or reset view when appropriate.
+ Print nonzero views. Support print view resets, disabled by default.
+ (display_debug_lines_decoded): Likewise. Disambiguate op_code tests,
+ enabling printing of end_sequence.
+ * testsuite/binutils-all/dw2-1.W: Add nonzero views.
+ * testsuite/binutils-all/dw2-3.W: Likewise.
+ * testsuite/binutils-all/dw2-3gabi.W: Likewise.
+ * testsuite/binutils-all/dw5.W: Add end sequence lines.
+ * testsuite/binutils-all/i386/compressed-1a.d: Add nonzero views.
+ * testsuite/binutils-all/libdw2-compressedgabi.out: Likewise.
+ * testsuite/binutils-all/objdump.W: Likewise.
+ * testsuite/binutils-all/objdump.WL: Add end sequence lines.
+ * testsuite/binutils-all/x86-64/compressed-1a.d: Add nonzero views.
+
2017-07-19 Tristan Gingold <gingold@adacore.com>
* nm.c (show_stats): Remove variable.
typedef struct State_Machine_Registers
{
dwarf_vma address;
+ unsigned int view;
unsigned int file;
unsigned int line;
unsigned int column;
int basic_block;
unsigned char op_index;
unsigned char end_sequence;
-/* This variable hold the number of the last entry seen
- in the File Table. */
+ /* This variable hold the number of the last entry seen
+ in the File Table. */
unsigned int last_file_entry;
} SMR;
reset_state_machine (int is_stmt)
{
state_machine_regs.address = 0;
+ state_machine_regs.view = 0;
state_machine_regs.op_index = 0;
state_machine_regs.file = 1;
state_machine_regs.line = 1;
SAFE_BYTE_GET (adr, data, len - bytes_read - 1, end);
printf (_("set Address to 0x%s\n"), dwarf_vmatoa ("x", adr));
state_machine_regs.address = adr;
+ state_machine_regs.view = 0;
state_machine_regs.op_index = 0;
break;
unsigned char *end, void *file)
{
unsigned char *start = section->start;
+ int verbose_view = 0;
printf (_("Raw dump of debug contents of section %s:\n\n"),
section->name);
{
uladv *= linfo.li_min_insn_length;
state_machine_regs.address += uladv;
+ if (uladv)
+ state_machine_regs.view = 0;
printf (_(" Special opcode %d: "
- "advance Address by %s to 0x%s"),
+ "advance Address by %s to 0x%s%s"),
op_code, dwarf_vmatoa ("u", uladv),
- dwarf_vmatoa ("x", state_machine_regs.address));
+ dwarf_vmatoa ("x", state_machine_regs.address),
+ verbose_view && uladv
+ ? _(" (reset view)") : "");
}
else
{
- state_machine_regs.address
- += ((state_machine_regs.op_index + uladv)
+ unsigned addrdelta
+ = ((state_machine_regs.op_index + uladv)
/ linfo.li_max_ops_per_insn)
* linfo.li_min_insn_length;
+
+ state_machine_regs.address += addrdelta;
state_machine_regs.op_index
= (state_machine_regs.op_index + uladv)
% linfo.li_max_ops_per_insn;
+ if (addrdelta)
+ state_machine_regs.view = 0;
printf (_(" Special opcode %d: "
- "advance Address by %s to 0x%s[%d]"),
+ "advance Address by %s to 0x%s[%d]%s"),
op_code, dwarf_vmatoa ("u", uladv),
dwarf_vmatoa ("x", state_machine_regs.address),
- state_machine_regs.op_index);
+ state_machine_regs.op_index,
+ verbose_view && addrdelta
+ ? _(" (reset view)") : "");
}
adv = (op_code % linfo.li_line_range) + linfo.li_line_base;
state_machine_regs.line += adv;
- printf (_(" and Line by %s to %d\n"),
+ printf (_(" and Line by %s to %d"),
dwarf_vmatoa ("d", adv), state_machine_regs.line);
+ if (verbose_view || state_machine_regs.view)
+ printf (_(" (view %u)\n"), state_machine_regs.view);
+ else
+ putchar ('\n');
+ state_machine_regs.view++;
}
else switch (op_code)
{
break;
case DW_LNS_copy:
- printf (_(" Copy\n"));
+ printf (_(" Copy"));
+ if (verbose_view || state_machine_regs.view)
+ printf (_(" (view %u)\n"), state_machine_regs.view);
+ else
+ putchar ('\n');
+ state_machine_regs.view++;
break;
case DW_LNS_advance_pc:
{
uladv *= linfo.li_min_insn_length;
state_machine_regs.address += uladv;
- printf (_(" Advance PC by %s to 0x%s\n"),
+ if (uladv)
+ state_machine_regs.view = 0;
+ printf (_(" Advance PC by %s to 0x%s%s\n"),
dwarf_vmatoa ("u", uladv),
- dwarf_vmatoa ("x", state_machine_regs.address));
+ dwarf_vmatoa ("x", state_machine_regs.address),
+ verbose_view && uladv
+ ? _(" (reset view)") : "");
}
else
{
- state_machine_regs.address
- += ((state_machine_regs.op_index + uladv)
- / linfo.li_max_ops_per_insn)
+ unsigned addrdelta
+ = ((state_machine_regs.op_index + uladv)
+ / linfo.li_max_ops_per_insn)
* linfo.li_min_insn_length;
+ state_machine_regs.address
+ += addrdelta;
state_machine_regs.op_index
= (state_machine_regs.op_index + uladv)
% linfo.li_max_ops_per_insn;
- printf (_(" Advance PC by %s to 0x%s[%d]\n"),
+ if (addrdelta)
+ state_machine_regs.view = 0;
+ printf (_(" Advance PC by %s to 0x%s[%d]%s\n"),
dwarf_vmatoa ("u", uladv),
dwarf_vmatoa ("x", state_machine_regs.address),
- state_machine_regs.op_index);
+ state_machine_regs.op_index,
+ verbose_view && addrdelta
+ ? _(" (reset view)") : "");
}
break;
{
uladv *= linfo.li_min_insn_length;
state_machine_regs.address += uladv;
- printf (_(" Advance PC by constant %s to 0x%s\n"),
+ if (uladv)
+ state_machine_regs.view = 0;
+ printf (_(" Advance PC by constant %s to 0x%s%s\n"),
dwarf_vmatoa ("u", uladv),
- dwarf_vmatoa ("x", state_machine_regs.address));
+ dwarf_vmatoa ("x", state_machine_regs.address),
+ verbose_view && uladv
+ ? _(" (reset view)") : "");
}
else
{
- state_machine_regs.address
- += ((state_machine_regs.op_index + uladv)
- / linfo.li_max_ops_per_insn)
+ unsigned addrdelta
+ = ((state_machine_regs.op_index + uladv)
+ / linfo.li_max_ops_per_insn)
* linfo.li_min_insn_length;
+ state_machine_regs.address
+ += addrdelta;
state_machine_regs.op_index
= (state_machine_regs.op_index + uladv)
% linfo.li_max_ops_per_insn;
- printf (_(" Advance PC by constant %s to 0x%s[%d]\n"),
+ if (addrdelta)
+ state_machine_regs.view = 0;
+ printf (_(" Advance PC by constant %s to 0x%s[%d]%s\n"),
dwarf_vmatoa ("u", uladv),
dwarf_vmatoa ("x", state_machine_regs.address),
- state_machine_regs.op_index);
+ state_machine_regs.op_index,
+ verbose_view && addrdelta
+ ? _(" (reset view)") : "");
}
break;
printf (_(" Advance PC by fixed size amount %s to 0x%s\n"),
dwarf_vmatoa ("u", uladv),
dwarf_vmatoa ("x", state_machine_regs.address));
+ /* Do NOT reset view. */
break;
case DW_LNS_set_prologue_end:
printf ("%s:\n", file_table[0].name);
}
- printf (_("File name Line number Starting address\n"));
+ printf (_("File name Line number Starting address View\n"));
saved_linfo = linfo;
}
while (data < end_of_sequence)
{
unsigned char op_code;
+ int xop;
int adv;
unsigned long int uladv;
unsigned int bytes_read;
int is_special_opcode = 0;
op_code = *data++;
+ xop = op_code;
if (op_code >= linfo.li_opcode_base)
{
{
uladv *= linfo.li_min_insn_length;
state_machine_regs.address += uladv;
+ if (uladv)
+ state_machine_regs.view = 0;
}
else
{
- state_machine_regs.address
- += ((state_machine_regs.op_index + uladv)
- / linfo.li_max_ops_per_insn)
+ unsigned addrdelta
+ = ((state_machine_regs.op_index + uladv)
+ / linfo.li_max_ops_per_insn)
* linfo.li_min_insn_length;
+ state_machine_regs.address
+ += addrdelta;
state_machine_regs.op_index
= (state_machine_regs.op_index + uladv)
% linfo.li_max_ops_per_insn;
+ if (addrdelta)
+ state_machine_regs.view = 0;
}
adv = (op_code % linfo.li_line_range) + linfo.li_line_base;
state_machine_regs.line += adv;
is_special_opcode = 1;
+ /* Increment view after printing this row. */
}
else switch (op_code)
{
}
ext_op_code_len += bytes_read;
ext_op_code = *op_code_data++;
+ xop = ext_op_code;
+ xop = -xop;
switch (ext_op_code)
{
case DW_LNE_end_sequence:
- reset_state_machine (linfo.li_default_is_stmt);
+ /* Reset stuff after printing this row. */
break;
case DW_LNE_set_address:
SAFE_BYTE_GET_AND_INC (state_machine_regs.address,
ext_op_code_len - bytes_read - 1,
end);
state_machine_regs.op_index = 0;
+ state_machine_regs.view = 0;
break;
case DW_LNE_define_file:
{
break;
}
case DW_LNS_copy:
+ /* Increment view after printing this row. */
break;
case DW_LNS_advance_pc:
{
uladv *= linfo.li_min_insn_length;
state_machine_regs.address += uladv;
+ if (uladv)
+ state_machine_regs.view = 0;
}
else
{
- state_machine_regs.address
- += ((state_machine_regs.op_index + uladv)
- / linfo.li_max_ops_per_insn)
+ unsigned addrdelta
+ = ((state_machine_regs.op_index + uladv)
+ / linfo.li_max_ops_per_insn)
* linfo.li_min_insn_length;
+ state_machine_regs.address
+ += addrdelta;
state_machine_regs.op_index
= (state_machine_regs.op_index + uladv)
% linfo.li_max_ops_per_insn;
+ if (addrdelta)
+ state_machine_regs.view = 0;
}
break;
{
uladv *= linfo.li_min_insn_length;
state_machine_regs.address += uladv;
+ if (uladv)
+ state_machine_regs.view = 0;
}
else
{
- state_machine_regs.address
- += ((state_machine_regs.op_index + uladv)
- / linfo.li_max_ops_per_insn)
+ unsigned addrdelta
+ = ((state_machine_regs.op_index + uladv)
+ / linfo.li_max_ops_per_insn)
* linfo.li_min_insn_length;
+ state_machine_regs.address
+ += addrdelta;
state_machine_regs.op_index
= (state_machine_regs.op_index + uladv)
% linfo.li_max_ops_per_insn;
+ if (addrdelta)
+ state_machine_regs.view = 0;
}
break;
SAFE_BYTE_GET_AND_INC (uladv, data, 2, end);
state_machine_regs.address += uladv;
state_machine_regs.op_index = 0;
+ /* Do NOT reset view. */
break;
case DW_LNS_set_prologue_end:
/* Only Special opcodes, DW_LNS_copy and DW_LNE_end_sequence adds a row
to the DWARF address/line matrix. */
- if ((is_special_opcode) || (op_code == DW_LNE_end_sequence)
- || (op_code == DW_LNS_copy))
+ if ((is_special_opcode) || (xop == -DW_LNE_end_sequence)
+ || (xop == DW_LNS_copy))
{
const unsigned int MAX_FILENAME_LENGTH = 35;
char *fileName;
if (!do_wide || (fileNameLength <= MAX_FILENAME_LENGTH))
{
if (linfo.li_max_ops_per_insn == 1)
- printf ("%-35s %11d %#18" DWARF_VMA_FMT "x\n",
+ printf ("%-35s %11d %#18" DWARF_VMA_FMT "x",
newFileName, state_machine_regs.line,
state_machine_regs.address);
else
- printf ("%-35s %11d %#18" DWARF_VMA_FMT "x[%d]\n",
+ printf ("%-35s %11d %#18" DWARF_VMA_FMT "x[%d]",
newFileName, state_machine_regs.line,
state_machine_regs.address,
state_machine_regs.op_index);
else
{
if (linfo.li_max_ops_per_insn == 1)
- printf ("%s %11d %#18" DWARF_VMA_FMT "x\n",
+ printf ("%s %11d %#18" DWARF_VMA_FMT "x",
newFileName, state_machine_regs.line,
state_machine_regs.address);
else
- printf ("%s %11d %#18" DWARF_VMA_FMT "x[%d]\n",
+ printf ("%s %11d %#18" DWARF_VMA_FMT "x[%d]",
newFileName, state_machine_regs.line,
state_machine_regs.address,
state_machine_regs.op_index);
}
- if (op_code == DW_LNE_end_sequence)
- printf ("\n");
+ if (state_machine_regs.view)
+ printf (" %6u\n", state_machine_regs.view);
+ else
+ putchar ('\n');
+ state_machine_regs.view++;
+
+ if (xop == -DW_LNE_end_sequence)
+ {
+ reset_state_machine (linfo.li_default_is_stmt);
+ putchar ('\n');
+ }
free (newFileName);
}
\[0x.*\] Extended opcode 2: set Address to 0x4
\[0x.*\] Advance Line by 3 to 4
\[0x.*\] Copy
- \[0x.*\] Copy
+ \[0x.*\] Copy \(view 1\)
\[0x.*\] Extended opcode 2: set Address to 0x8
\[0x.*\] Extended opcode 1: End of Sequence
\[0x0000002d\] Extended opcode 2: set Address to 0x0
\[0x00000034\] Advance Line by 3 to 4
\[0x00000036\] Copy
- \[0x00000037\] Copy
+ \[0x00000037\] Copy \(view 1\)
\[0x00000038\] Extended opcode 2: set Address to 0x4
\[0x0000003f\] Extended opcode 1: End of Sequence
\[0x0000002d\] Extended opcode 2: set Address to 0x0
\[0x00000034\] Advance Line by 3 to 4
\[0x00000036\] Copy
- \[0x00000037\] Copy
+ \[0x00000037\] Copy \(view 1\)
\[0x00000038\] Extended opcode 2: set Address to 0x4
\[0x0000003f\] Extended opcode 1: End of Sequence
Decoded dump of debug contents of section .debug_line:
CU: ./main.c:
-File name Line number Starting address
+File name Line number Starting address View
main.c 6 0x1234
main.c 6 0x12346
+main.c 6 0x1234
main.c 5 0x1234
main.c 5 0x1234
+main.c 5 0x1234
\[0x.*\] Extended opcode 2: set Address to 0x0
\[0x.*\] Advance Line by 10 to 11
\[0x.*\] Copy
- \[0x.*\] Special opcode 6: advance Address by 0 to 0x0 and Line by 1 to 12
+ \[0x.*\] Special opcode 6: advance Address by 0 to 0x0 and Line by 1 to 12 \(view 1\)
\[0x.*\] Advance Line by -7 to 5
\[0x.*\] Special opcode 229: advance Address by 16 to 0x10 and Line by 0 to 5
\[0x.*\] Special opcode 49: advance Address by 3 to 0x13 and Line by 2 to 7
\[0x.*\] Extended opcode 2: set Address to 0x4
\[0x.*\] Advance Line by 3 to 4
\[0x.*\] Copy
- \[0x.*\] Copy
+ \[0x.*\] Copy \(view 1\)
\[0x.*\] Extended opcode 2: set Address to 0x8
\[0x.*\] Extended opcode 1: End of Sequence
\[0x0000002d\] Extended opcode 2: set Address to 0x0
\[0x00000034\] Advance Line by 3 to 4
\[0x00000036\] Copy
- \[0x00000037\] Copy
+ \[0x00000037\] Copy \(view 1\)
\[0x00000038\] Extended opcode 2: set Address to 0x4
\[0x0000003f\] Extended opcode 1: End of Sequence
\[0x0000002d\] Extended opcode 2: set Address to 0x0
\[0x00000034\] Advance Line by 3 to 4
\[0x00000036\] Copy
- \[0x00000037\] Copy
+ \[0x00000037\] Copy \(view 1\)
\[0x00000038\] Extended opcode 2: set Address to 0x4
\[0x0000003f\] Extended opcode 1: End of Sequence
\[0x.*\] Extended opcode 2: set Address to .*
\[0x.*\] Advance Line by 3 to 4
\[0x.*\] Copy
- \[0x.*\] Copy
+ \[0x.*\] Copy \(view 1\)
\[0x.*\] Extended opcode 2: set Address to .*
\[0x.*\] Extended opcode 1: End of Sequence
Decoded dump of debug contents of section \.debug_line:
CU: \./dw2-decodedline\.c:
-File name Line number Starting address
+File name Line number Starting address View
directory/file1\.c:
file1\.c 1 .*
\./dw2-decodedline\.c:\[\+\+\]
dw2-decodedline\.c 2 .*
+dw2-decodedline\.c 2 .*
\[0x.*\] Extended opcode 2: set Address to 0x0
\[0x.*\] Advance Line by 10 to 11
\[0x.*\] Copy
- \[0x.*\] Special opcode 6: advance Address by 0 to 0x0 and Line by 1 to 12
+ \[0x.*\] Special opcode 6: advance Address by 0 to 0x0 and Line by 1 to 12 \(view 1\)
\[0x.*\] Advance Line by -7 to 5
\[0x.*\] Special opcode 229: advance Address by 16 to 0x10 and Line by 0 to 5
- \[0x.*\] Special opcode 6: advance Address by 0 to 0x10 and Line by 1 to 6
+ \[0x.*\] Special opcode 6: advance Address by 0 to 0x10 and Line by 1 to 6 \(view 1\)
\[0x.*\] Advance PC by 5 to 0x15
\[0x.*\] Extended opcode 1: End of Sequence
* doc/as.texinfo: Add z14 to CPU string list.
* doc/c-s390.texi: Likewise.
+2017-07-21 Alexandre Oliva <aoliva@redhat.com>
+
+ * dwarf2dbg.c (unused): Check offset of next in struct line_entry.
+ (current): Initialize view.
+ (force_reset_view, view_assert_failed): New variables.
+ (reverse_line_entry_list): New function.
+ (set_or_check_view): Likewise.
+ (dwarf2_gen_line_info_1): Call it.
+ (dwarf2_where): Set view to NULL.
+ (dwarf2_emit_insn): Return early when called before first file.
+ (dwarf2_directive_loc): Add view support. Emit insn
+ immediately when view option is given.
+ (process_entries): Avoid set_address to reset view when a known
+ address change already implies the view reset.
+ (dwarf2dbg_final_check): New function.
+ * dwarf2dbg.h (struct dwarf2_line_info): Add view.
+ (dwarf2dbg_final_check): Declare.
+ * read.c (s_leb128): Parse expression as deferred.
+ * write.c (write_object_file): Check pending view asserts.
+ (cvt_frag_to_fill): Complain about undefined leb128 operand.
+ * doc/as.texinfo (.loc): Document view support.
+ * NEWS: Mention the new feature.
+ * testsuite/gas/all/gas.exp: Run sleb128-9.
+ * testsuite/gas/all/sleb128-9.d: New.
+ * testsuite/gas/all/sleb128-9.l: New.
+ * testsuite/gas/all/sleb128-9.s: New.
+ * testsuite/gas/elf/dwarf2-1.d: Add nonzero views.
+ * testsuite/gas/elf/dwarf2-2.d: Likewise.
+ * testsuite/gas/elf/dwarf2-5.d: New.
+ * testsuite/gas/elf/dwarf2-5.s: New.
+ * testsuite/gas/elf/dwarf2-6.d: New.
+ * testsuite/gas/elf/dwarf2-6.s: New.
+ * testsuite/gas/elf/dwarf2-7.d: New.
+ * testsuite/gas/elf/dwarf2-7.s: New.
+ * testsuite/gas/elf/dwarf2-8.d: New.
+ * testsuite/gas/elf/dwarf2-8.l: New.
+ * testsuite/gas/elf/dwarf2-8.s: New.
+ * testsuite/gas/elf/dwarf2-9.d: New.
+ * testsuite/gas/elf/dwarf2-9.l: New.
+ * testsuite/gas/elf/dwarf2-9.s: New.
+ * testsuite/gas/elf/dwarf2-10.d: New.
+ * testsuite/gas/elf/dwarf2-10.l: New.
+ * testsuite/gas/elf/dwarf2-10.s: New.
+ * testsuite/gas/elf/dwarf2-11.d: New.
+ * testsuite/gas/elf/dwarf2-11.s: New.
+ * testsuite/gas/elf/dwarf2-12.d: New.
+ * testsuite/gas/elf/dwarf2-12.s: New.
+ * testsuite/gas/elf/dwarf2-13.d: New.
+ * testsuite/gas/elf/dwarf2-13.s: New.
+ * testsuite/gas/elf/dwarf2-14.d: New.
+ * testsuite/gas/elf/dwarf2-14.s: New.
+ * testsuite/gas/elf/dwarf2-15.d: New.
+ * testsuite/gas/elf/dwarf2-15.s: New.
+ * testsuite/gas/elf/dwarf2-16.d: New.
+ * testsuite/gas/elf/dwarf2-16.s: New.
+ * testsuite/gas/elf/dwarf2-17.d: New.
+ * testsuite/gas/elf/dwarf2-17.s: New.
+ * testsuite/gas/elf/dwarf2-18.d: New.
+ * testsuite/gas/elf/dwarf2-18.s: New.
+ * testsuite/gas/elf/elf.exp: Run dwarf2-5..18 tests.
+ * testsuite/gas/i386/dw2-compress-1.d: Add nonzero views.
+ * testsuite/gas/i386/dw2-compressed-1.d: Likewise.
+ * testsuite/gas/i386/ilp32/lns/lns-duplicate.d: Likewise.
+ * testsuite/gas/lns/lns-big-delta.d: Likewise.
+ * testsuite/gas/lns/lns-duplicate.d: Likewise.
+ * testsuite/gas/mips/loc-swap-2.d: Likewise.
+ * testsuite/gas/mips/loc-swap-3.d: Likewise.
+ * testsuite/gas/mips/loc-swap.d: Likewise.
+ * testsuite/gas/mips/micromips@loc-swap-2.d: Likewise.
+ * testsuite/gas/mips/micromips@loc-swap.d: Likewise.
+ * testsuite/gas/mips/mips16@loc-swap-2.d: Likewise.
+ * testsuite/gas/mips/mips16@loc-swap.d: Likewise.
+ * testsuite/gas/mips/mips16e@loc-swap.d: Likewise.
+
2017-07-19 Claudiu Zissulescu <claziss@synopsys.com>
* testsuite/gas/arc/jli-1.d: New file.
-*- text -*-
+* Add support for loaction views in DWARF debug line information.
+
Changes in 2.29:
* Add support for ELF SHF_GNU_MBIND.
This directive will set the @code{discriminator} register in the @code{.debug_line}
state machine to @var{value}, which must be an unsigned integer.
+@item view @var{value}
+This option causes a row to be added to @code{.debug_line} in reference to the
+current address (which might not be the same as that of the following assembly
+instruction), and to associate @var{value} with the @code{view} register in the
+@code{.debug_line} state machine. If @var{value} is a label, both the
+@code{view} register and the label are set to the number of prior @code{.loc}
+directives at the same program location. If @var{value} is the literal
+@code{0}, the @code{view} register is set to zero, and the assembler asserts
+that there aren't any prior @code{.loc} directives at the same program
+location. If @var{value} is the literal @code{-0}, the assembler arrange for
+the @code{view} register to be reset in this row, even if there are prior
+@code{.loc} directives at the same program location.
+
@end table
@node Loc_mark_labels
#define TC_PARSE_CONS_RETURN_NONE BFD_RELOC_NONE
#endif
-struct line_entry {
+struct line_entry
+{
struct line_entry *next;
symbolS *label;
struct dwarf2_line_info loc;
};
-struct line_subseg {
+/* Don't change the offset of next in line_entry. set_or_check_view
+ calls in dwarf2_gen_line_info_1 depend on it. */
+static char unused[offsetof(struct line_entry, next) ? -1 : 1]
+ATTRIBUTE_UNUSED;
+
+struct line_subseg
+{
struct line_subseg *next;
subsegT subseg;
struct line_entry *head;
struct line_entry **pmove_tail;
};
-struct line_seg {
+struct line_seg
+{
struct line_seg *next;
segT seg;
struct line_subseg *head;
static struct line_seg *all_segs;
static struct line_seg **last_seg_ptr;
-struct file_entry {
+struct file_entry
+{
const char *filename;
unsigned int dir;
};
bfd_boolean dwarf2_loc_mark_labels;
/* Current location as indicated by the most recent .loc directive. */
-static struct dwarf2_line_info current = {
+static struct dwarf2_line_info current =
+{
1, 1, 0, 0,
DWARF2_LINE_DEFAULT_IS_STMT ? DWARF2_FLAG_IS_STMT : 0,
- 0
+ 0, NULL
};
+/* This symbol is used to recognize view number forced resets in loc
+ lists. */
+static symbolS *force_reset_view;
+
+/* This symbol evaluates to an expression that, if nonzero, indicates
+ some view assert check failed. */
+static symbolS *view_assert_failed;
+
/* The size of an address on the target. */
static unsigned int sizeof_address;
\f
return lss;
}
+/* (Un)reverse the line_entry list starting from H. */
+
+static struct line_entry *
+reverse_line_entry_list (struct line_entry *h)
+{
+ struct line_entry *p = NULL, *e, *n;
+
+ for (e = h; e; e = n)
+ {
+ n = e->next;
+ e->next = p;
+ p = e;
+ }
+ return p;
+}
+
+/* Compute the view for E based on the previous entry P. If we
+ introduce an (undefined) view symbol for P, and H is given (P must
+ be the tail in this case), introduce view symbols for earlier list
+ entries as well, until one of them is constant. */
+
+static void
+set_or_check_view (struct line_entry *e, struct line_entry *p,
+ struct line_entry *h)
+{
+ expressionS viewx;
+
+ memset (&viewx, 0, sizeof (viewx));
+ viewx.X_unsigned = 1;
+
+ /* First, compute !(E->label > P->label), to tell whether or not
+ we're to reset the view number. If we can't resolve it to a
+ constant, keep it symbolic. */
+ if (!p || (e->loc.view == force_reset_view && force_reset_view))
+ {
+ viewx.X_op = O_constant;
+ viewx.X_add_number = 0;
+ viewx.X_add_symbol = NULL;
+ viewx.X_op_symbol = NULL;
+ }
+ else
+ {
+ viewx.X_op = O_gt;
+ viewx.X_add_number = 0;
+ viewx.X_add_symbol = e->label;
+ viewx.X_op_symbol = p->label;
+ resolve_expression (&viewx);
+ if (viewx.X_op == O_constant)
+ viewx.X_add_number = !viewx.X_add_number;
+ else
+ {
+ viewx.X_add_symbol = make_expr_symbol (&viewx);
+ viewx.X_add_number = 0;
+ viewx.X_op_symbol = NULL;
+ viewx.X_op = O_logical_not;
+ }
+ }
+
+ if (S_IS_DEFINED (e->loc.view) && symbol_constant_p (e->loc.view))
+ {
+ expressionS *value = symbol_get_value_expression (e->loc.view);
+ /* We can't compare the view numbers at this point, because in
+ VIEWX we've only determined whether we're to reset it so
+ far. */
+ if (viewx.X_op == O_constant)
+ {
+ if (!value->X_add_number != !viewx.X_add_number)
+ as_bad (_("view number mismatch"));
+ }
+ /* Record the expression to check it later. It is the result of
+ a logical not, thus 0 or 1. We just add up all such deferred
+ expressions, and resolve it at the end. */
+ else if (!value->X_add_number)
+ {
+ symbolS *deferred = make_expr_symbol (&viewx);
+ if (view_assert_failed)
+ {
+ expressionS chk;
+ memset (&chk, 0, sizeof (chk));
+ chk.X_unsigned = 1;
+ chk.X_op = O_add;
+ chk.X_add_number = 0;
+ chk.X_add_symbol = view_assert_failed;
+ chk.X_op_symbol = deferred;
+ deferred = make_expr_symbol (&chk);
+ }
+ view_assert_failed = deferred;
+ }
+ }
+
+ if (viewx.X_op != O_constant || viewx.X_add_number)
+ {
+ expressionS incv;
+
+ if (!p->loc.view)
+ {
+ p->loc.view = symbol_temp_make ();
+ gas_assert (!S_IS_DEFINED (p->loc.view));
+ }
+
+ memset (&incv, 0, sizeof (incv));
+ incv.X_unsigned = 1;
+ incv.X_op = O_symbol;
+ incv.X_add_symbol = p->loc.view;
+ incv.X_add_number = 1;
+
+ if (viewx.X_op == O_constant)
+ {
+ gas_assert (viewx.X_add_number == 1);
+ viewx = incv;
+ }
+ else
+ {
+ viewx.X_add_symbol = make_expr_symbol (&viewx);
+ viewx.X_add_number = 0;
+ viewx.X_op_symbol = make_expr_symbol (&incv);
+ viewx.X_op = O_multiply;
+ }
+ }
+
+ if (!S_IS_DEFINED (e->loc.view))
+ {
+ symbol_set_value_expression (e->loc.view, &viewx);
+ S_SET_SEGMENT (e->loc.view, absolute_section);
+ symbol_set_frag (e->loc.view, &zero_address_frag);
+ }
+
+ /* Define and attempt to simplify any earlier views needed to
+ compute E's. */
+ if (h && p && p->loc.view && !S_IS_DEFINED (p->loc.view))
+ {
+ struct line_entry *h2;
+ /* Reverse the list to avoid quadratic behavior going backwards
+ in a single-linked list. */
+ struct line_entry *r = reverse_line_entry_list (h);
+
+ gas_assert (r == p);
+ /* Set or check views until we find a defined or absent view. */
+ do
+ set_or_check_view (r, r->next, NULL);
+ while (r->next && r->next->loc.view && !S_IS_DEFINED (r->next->loc.view)
+ && (r = r->next));
+
+ /* Unreverse the list, so that we can go forward again. */
+ h2 = reverse_line_entry_list (p);
+ gas_assert (h2 == h);
+
+ /* Starting from the last view we just defined, attempt to
+ simplify the view expressions, until we do so to P. */
+ do
+ {
+ gas_assert (S_IS_DEFINED (r->loc.view));
+ resolve_expression (symbol_get_value_expression (r->loc.view));
+ }
+ while (r != p && (r = r->next));
+
+ /* Now that we've defined and computed all earlier views that might
+ be needed to compute E's, attempt to simplify it. */
+ resolve_expression (symbol_get_value_expression (e->loc.view));
+ }
+}
+
/* Record an entry for LOC occurring at LABEL. */
static void
e->loc = *loc;
lss = get_line_subseg (now_seg, now_subseg, TRUE);
+
+ if (loc->view)
+ set_or_check_view (e,
+ !lss->head ? NULL : (struct line_entry *)lss->ptail,
+ lss->head);
+
*lss->ptail = e;
lss->ptail = &e->next;
}
{
if (debug_type == DEBUG_DWARF2)
{
- const char *filename = as_where (&line->line);
+ const char *filename;
+
+ memset (line, 0, sizeof (*line));
+ filename = as_where (&line->line);
line->filenum = get_filenum (filename, 0);
line->column = 0;
line->flags = DWARF2_FLAG_IS_STMT;
line->isa = current.isa;
line->discriminator = current.discriminator;
+ line->view = NULL;
}
else
*line = current;
{
struct dwarf2_line_info loc;
- if (!dwarf2_loc_directive_seen && debug_type != DEBUG_DWARF2)
+ if (debug_type != DEBUG_DWARF2
+ ? !dwarf2_loc_directive_seen
+ : !seen_at_least_1_file ())
return;
dwarf2_where (&loc);
return;
}
}
+ else if (strcmp (p, "view") == 0)
+ {
+ symbolS *sym;
+
+ (void) restore_line_pointer (c);
+ SKIP_WHITESPACE ();
+
+ if (ISDIGIT (*input_line_pointer)
+ || *input_line_pointer == '-')
+ {
+ bfd_boolean force_reset = *input_line_pointer == '-';
+
+ value = get_absolute_expression ();
+ if (value != 0)
+ {
+ as_bad (_("numeric view can only be asserted to zero"));
+ return;
+ }
+ if (force_reset && force_reset_view)
+ sym = force_reset_view;
+ else
+ {
+ sym = symbol_temp_new (absolute_section, value,
+ &zero_address_frag);
+ if (force_reset)
+ force_reset_view = sym;
+ }
+ }
+ else
+ {
+ char *name = read_symbol_name ();
+
+ if (!name)
+ return;
+ sym = symbol_find_or_make (name);
+ if (S_IS_DEFINED (sym))
+ {
+ if (!S_CAN_BE_REDEFINED (sym))
+ as_bad (_("symbol `%s' is already defined"), name);
+ else
+ sym = symbol_clone (sym, 1);
+ S_SET_SEGMENT (sym, undefined_section);
+ S_SET_VALUE (sym, 0);
+ symbol_set_frag (sym, &zero_address_frag);
+ }
+ }
+ current.view = sym;
+ }
else
{
as_bad (_("unknown .loc sub-directive `%s'"), p);
demand_empty_rest_of_line ();
dwarf2_loc_directive_seen = TRUE;
debug_type = DEBUG_NONE;
+
+ /* If we were given a view id, emit the row right away. */
+ if (current.view)
+ dwarf2_emit_insn (0);
}
void
frag = symbol_get_frag (lab);
frag_ofs = S_GET_VALUE (lab);
- if (last_frag == NULL)
+ if (last_frag == NULL
+ || (e->loc.view == force_reset_view && force_reset_view
+ /* If we're going to reset the view, but we know we're
+ advancing the PC, we don't have to force with
+ set_address. We know we do when we're at the same
+ address of the same frag, and we know we might when
+ we're in the beginning of a frag, and we were at the
+ end of the previous frag. */
+ && (frag == last_frag
+ ? (last_frag_ofs == frag_ofs)
+ : (frag_ofs == 0
+ && ((offsetT)last_frag_ofs
+ >= get_frag_fix (last_frag, seg))))))
{
out_set_addr (lab);
out_inc_line_addr (line_delta, 0);
name_sym, comp_dir_sym, producer_sym);
}
}
+
+/* Perform any deferred checks pertaining to debug information. */
+
+void
+dwarf2dbg_final_check (void)
+{
+ /* Perform reset-view checks. Don't evaluate view_assert_failed
+ recursively: it could be very deep. It's a chain of adds, with
+ each chain element pointing to the next in X_add_symbol, and
+ holding the check value in X_op_symbol. */
+ while (view_assert_failed)
+ {
+ expressionS *expr;
+ symbolS *sym;
+ offsetT failed;
+
+ gas_assert (!symbol_resolved_p (view_assert_failed));
+
+ expr = symbol_get_value_expression (view_assert_failed);
+ sym = view_assert_failed;
+
+ /* If view_assert_failed looks like a compound check in the
+ chain, break it up. */
+ if (expr->X_op == O_add && expr->X_add_number == 0 && expr->X_unsigned)
+ {
+ view_assert_failed = expr->X_add_symbol;
+ sym = expr->X_op_symbol;
+ }
+ else
+ view_assert_failed = NULL;
+
+ failed = resolve_symbol_value (sym);
+ if (!symbol_resolved_p (sym) || failed)
+ {
+ as_bad (_("view number mismatch"));
+ break;
+ }
+ }
+}
#define DWARF2_FLAG_PROLOGUE_END (1 << 2)
#define DWARF2_FLAG_EPILOGUE_BEGIN (1 << 3)
-struct dwarf2_line_info {
+struct dwarf2_line_info
+{
unsigned int filenum;
unsigned int line;
unsigned int column;
unsigned int isa;
unsigned int flags;
unsigned int discriminator;
+ symbolS *view;
};
/* Implements the .file FILENO "FILENAME" directive. FILENO can be 0
to indicate that no file number has been assigned. All real file
number must be >0. */
-extern char *dwarf2_directive_file (int dummy);
+extern char *dwarf2_directive_file (int);
/* Implements the .loc FILENO LINENO [COLUMN] directive. FILENO is
the file number, LINENO the line number and the (optional) COLUMN
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);
+extern void dwarf2_directive_loc (int);
/* 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);
/* Returns the current source information. If .file directives have
been encountered, the info for the corresponding source file is
returned. Otherwise, the info for the assembly source file is
returned. */
-extern void dwarf2_where (struct dwarf2_line_info *l);
+extern void dwarf2_where (struct dwarf2_line_info *);
/* A hook to allow the target backend to inform the line number state
machine of isa changes when assembler debug info is enabled. */
-extern void dwarf2_set_isa (unsigned int isa);
+extern void dwarf2_set_isa (unsigned int);
/* This function generates .debug_line info based on the address and
source information passed in the arguments. ADDR should be the
frag-relative offset of the instruction the information is for and
L is the source information that should be associated with that
address. */
-extern void dwarf2_gen_line_info (addressT addr, struct dwarf2_line_info *l);
+extern void dwarf2_gen_line_info (addressT, struct dwarf2_line_info *);
/* Must be called for each generated instruction. */
extern void dwarf2_emit_insn (int);
extern int dwarf2dbg_relax_frag (fragS *);
extern void dwarf2dbg_convert_frag (fragS *);
+extern void dwarf2dbg_final_check (void);
+
/* An enumeration which describes the sizes of offsets (to DWARF sections)
and the mechanism by which the size is indicated. */
-enum dwarf2_format {
+enum dwarf2_format
+{
/* 32-bit format: the initial length field is 4 bytes long. */
dwarf2_format_32bit,
/* DWARF3 64-bit format: the representation of the initial length
do
{
- expression (&exp);
+ deferred_expression (&exp);
emit_leb128_expr (&exp, sign);
}
while (*input_line_pointer++ == ',');
run_dump_test sleb128-7
run_dump_test sleb128-8
}
+run_dump_test sleb128-9
# .byte is 32 bits on tic4x, and .p2align isn't supported on tic54x
# .space is different on hppa*-hpux.
--- /dev/null
+#name: undefined symbols in sleb128 directive
+#source: sleb128-9.s
+#error-output: sleb128-9.l
+#not-target: riscv*-*
+
--- /dev/null
+[^:]*: Assembler messages:
+[^:]*:2: Error: leb128 operand is an undefined symbol: \.Lundef
+[^:]*:3: Error: leb128 operand is an undefined symbol: undef
--- /dev/null
+ .data
+ .sleb128 .Lundef
+ .sleb128 undef
Decoded dump of debug contents of section \.debug_line:
CU: large-debug-line-table\.c:
-File name Line number Starting address
+File name Line number Starting address.*
large-debug-line-table\.c 1 0
#...
\[0x.*\] Extended opcode 2: set Address to .*
\[0x.*\] Advance Line by 3 to 4
\[0x.*\] Copy
- \[0x.*\] Copy
+ \[0x.*\] Copy \(view 1\)
\[0x.*\] Extended opcode 2: set Address to .*
\[0x.*\] Extended opcode 1: End of Sequence
--- /dev/null
+#as:
+#name: DWARF2 10
+#error-output: dwarf2-10.l
+# The mep target tries to relay code sections which breaks symbolic view computations.
+# The tile targets require 8-byte instructions, but the test only simulates 4-byte instructions.
+#not-target: mep-* tile*-*
--- /dev/null
+[^:]*: Assembler messages:
+[^:]*: Error: view number mismatch
--- /dev/null
+/* Test view numbering zero-assert checking with zero-sized align.
+
+ Copyright (C) 2017 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+ .file "dwarf2-10.c"
+ .text
+ .balign 4
+ .globl _start
+_start:
+ .file 1 "dwarf2-10.c"
+ .loc 1 1 view 0
+ .balign 4 /* No skip needed here... */
+ .loc 1 2 view 0 /* so this zero-view check fails. */
+ .int 0
+ .loc 1 3 view 0
+ .balign 8 /* Skip 4 more bytes after .int... */
+ .loc 1 4 view 0 /* so this is a zero view indeed. */
+ .int 0
+ .size _start, .-_start
--- /dev/null
+#as:
+#readelf: -wL
+#name: DWARF2 11
+# The am3 avr cr16 crx mn10 msp430 nds32 pru rl78 and xtensa targets do not evaluate the subtraction of symbols at assembly time
+# The riscv targets do not support the subtraction of symbols.
+# The tile targets require 8-byte instructions, but the test only simulates 4-byte instructions.
+#not-target: am3-* avr-* cr16-* crx-* m32c-* mn10*-* msp430-* nds32*-* pru-* riscv*-* rl78-* tile*-* xtensa-*
+
+Decoded dump of debug contents of section \.debug_line:
+
+CU: dwarf2-11\.c:
+File name *Line number *Starting address *View
+dwarf2-11\.c *1 *0x4
+dwarf2-11\.c *2 *0x8
+dwarf2-11\.c *2 *0x8 *1
--- /dev/null
+/* Test view numbering zero-assert checking with nonzero-sized align.
+
+ Copyright (C) 2017 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+ .file "dwarf2-11.c"
+ .text
+ .balign 8
+ .globl _start
+_start:
+ .file 1 "dwarf2-11.c"
+ .dc.l 0
+ .loc 1 1 view 0
+ .balign 8
+ .loc 1 2 view 0
+ .size _start, .-_start
--- /dev/null
+#as:
+#readelf: -x.rodata -wL
+#name: DWARF2 12
+# The am3 avr cr16 crx mn10 msp430 nds32 pru rl78 and xtensa targets do not evaluate the subtraction of symbols at assembly time
+# The riscv targets do not support the subtraction of symbols.
+# The tile targets require 8-byte instructions, but the test only simulates 4-byte instructions.
+#not-target: am3-* avr-* cr16-* crx-* mn10*-* msp430-* nds32*-* pru-* riscv*-* rl78-* tile*-* xtensa-*
+
+
+Hex dump of section '\.rodata':
+ 0x00000000 01 *.*
+
+Decoded dump of debug contents of section \.debug_line:
+
+CU: dwarf2-12\.c:
+File name *Line number *Starting address *View
+dwarf2-12\.c *1 *0
+dwarf2-12\.c *2 *0
+dwarf2-12\.c *3 *0 *1
+dwarf2-12\.c *3 *0x4
--- /dev/null
+/* Test view numbering forced reset in a single frag.
+
+ Copyright (C) 2017 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+ .file "dwarf2-12.c"
+ .text
+ .balign 4
+ .globl _start
+_start:
+ .file 1 "dwarf2-12.c"
+ .loc 1 1 view 0
+ .loc 1 2 view -0
+ .loc 1 3 view .L1
+ .dc.l 0
+ .size _start, .-_start
+
+ .section .rodata
+ .uleb128 .L1
--- /dev/null
+#as:
+#readelf: -x.rodata -wL
+#name: DWARF2 13
+# The am3 avr cr16 crx mn10 msp430 nds32 pru rl78 and xtensa targets do not evaluate the subtraction of symbols at assembly time
+# The riscv targets do not support the subtraction of symbols.
+# The tile targets require 8-byte instructions, but the test only simulates 4-byte instructions.
+#not-target: am3-* avr-* cr16-* crx-* mn10*-* msp430-* nds32*-* pru-* riscv*-* rl78-* tile*-* xtensa-*
+
+Hex dump of section '\.rodata':
+ 0x00000000 01 *.*
+
+Decoded dump of debug contents of section \.debug_line:
+
+CU: dwarf2-13\.c:
+File name *Line number *Starting address *View
+dwarf2-13\.c *1 *0x4
+dwarf2-13\.c *2 *0x8
+dwarf2-13\.c *3 *0x8 *1
+dwarf2-13\.c *3 *0xc
--- /dev/null
+/* Test view numbering forced reset after a nonzero-sized align.
+
+ Copyright (C) 2017 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+ .file "dwarf2-13.c"
+ .text
+ .balign 8
+ .globl _start
+_start:
+ .file 1 "dwarf2-13.c"
+ .dc.l 0
+ .loc 1 1 view 0
+ .balign 8
+ .loc 1 2 view -0
+ .loc 1 3 view .L1
+ .dc.l 0
+ .size _start, .-_start
+
+ .section .rodata
+ .uleb128 .L1
--- /dev/null
+#as:
+#readelf: -x.rodata -wL
+#name: DWARF2 14
+# The am3 avr cr16 crx mn10 msp430 nds32 pru rl78 and xtensa targets do not evaluate the subtraction of symbols at assembly time
+# The riscv targets do not support the subtraction of symbols.
+# The tile targets require 8-byte instructions, but the test only simulates 4-byte instructions.
+#not-target: am3-* avr-* cr16-* crx-* mn10*-* msp430-* nds32*-* pru-* riscv*-* rl78-* tile*-* xtensa-*
+
+Hex dump of section '\.rodata':
+ 0x00000000 01 *.*
+
+Decoded dump of debug contents of section \.debug_line:
+
+CU: dwarf2-14\.c:
+File name *Line number *Starting address *View
+dwarf2-14\.c *1 *0
+dwarf2-14\.c *2 *0
+dwarf2-14\.c *3 *0 *1
+dwarf2-14\.c *3 *0x4
--- /dev/null
+/* Test view numbering forced reset after a zero-sized align.
+
+ Copyright (C) 2017 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+ .file "dwarf2-14.c"
+ .text
+ .balign 4
+ .globl _start
+_start:
+ .file 1 "dwarf2-14.c"
+ .loc 1 1 view 0
+ .balign 4
+ .loc 1 2 view -0
+ .loc 1 3 view .L1
+ .dc.l 0
+ .size _start, .-_start
+
+ .section .rodata
+ .uleb128 .L1
--- /dev/null
+#as:
+#readelf: -x.rodata -wL
+#name: DWARF2 15
+# The am3 avr cr16 crx mn10 msp430 nds32 pru rl78 and xtensa targets do not evaluate the subtraction of symbols at assembly time
+# The riscv targets do not support the subtraction of symbols.
+# The tile targets require 8-byte instructions, but the test only simulates 4-byte instructions.
+#not-target: am3-* avr-* cr16-* crx-* mn10*-* msp430-* nds32*-* pru-* riscv*-* rl78-* tile*-* xtensa-*
+
+Hex dump of section '\.rodata':
+ 0x00000000 01 *.*
+
+Decoded dump of debug contents of section \.debug_line:
+
+CU: dwarf2-15\.c:
+File name *Line number *Starting address *View
+dwarf2-15\.c *1 *0
+dwarf2-15\.c *2 *0x4
+dwarf2-15\.c *3 *0x4 *1
+dwarf2-15\.c *3 *0x8
--- /dev/null
+/* Test view numbering forced reset in a single frag.
+
+ Copyright (C) 2017 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+ .file "dwarf2-15.c"
+ .text
+ .balign 8
+ .globl _start
+_start:
+ .file 1 "dwarf2-15.c"
+ .loc 1 1 view 0
+ .dc.l 0
+ .loc 1 2 view -0
+ .loc 1 3 view .L1
+ .dc.l 0
+ .size _start, .-_start
+
+ .section .rodata
+ .uleb128 .L1
--- /dev/null
+#as:
+#readelf: -x.rodata -wL
+#name: DWARF2 16
+# The am3 avr cr16 crx mn10 msp430 nds32 pru rl78 and xtensa targets do not evaluate the subtraction of symbols at assembly time
+# The mep target tries to relay code sections which breaks symbolic view computations.
+# The riscv targets do not support the subtraction of symbols.
+# The tile targets require 8-byte instructions, but the test only simulates 4-byte instructions.
+#not-target: am3-* avr-* cr16-* crx-* mep-* mn10*-* msp430-* nds32*-* pru-* riscv*-* rl78-* tile*-* xtensa-*
+
+Hex dump of section '\.rodata':
+ 0x00000000 01 *.*
+
+Decoded dump of debug contents of section \.debug_line:
+
+CU: dwarf2-16\.c:
+File name *Line number *Starting address *View
+dwarf2-16\.c *1 *0
+dwarf2-16\.c *2 *0x4
+dwarf2-16\.c *3 *0x4 *1
+dwarf2-16\.c *3 *0x8
--- /dev/null
+/* Test view numbering after a zero-sized align.
+
+ Copyright (C) 2017 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+ .file "dwarf2-16.c"
+ .text
+ .balign 8
+ .globl _start
+_start:
+ .file 1 "dwarf2-16.c"
+ .loc 1 1 view 0
+ .dc.l 0
+ .loc 1 2 view 0
+ .balign 4
+ .loc 1 3 view .L1
+ .dc.l 0
+ .size _start, .-_start
+
+ .section .rodata
+ .uleb128 .L1
--- /dev/null
+#as:
+#readelf: -x.rodata -wL
+#name: DWARF2 17
+# The am3 avr cr16 crx mn10 msp430 nds32 pru rl78 and xtensa targets do not evaluate the subtraction of symbols at assembly time
+# The mep target tries to relay code sections which breaks symbolic view computations.
+# The riscv targets do not support the subtraction of symbols.
+# The tile targets require 8-byte instructions, but the test only simulates 4-byte instructions.
+#not-target: am3-* avr-* cr16-* crx-* mep-* mn10*-* msp430-* nds32*-* pru-* riscv*-* rl78-* tile*-* xtensa-*
+
+Hex dump of section '\.rodata':
+ 0x00000000 00 *.*
+
+Decoded dump of debug contents of section \.debug_line:
+
+CU: dwarf2-17\.c:
+File name *Line number *Starting address *View
+dwarf2-17\.c *1 *0
+dwarf2-17\.c *2 *0x4
+dwarf2-17\.c *3 *0x8
+dwarf2-17\.c *3 *0xc
--- /dev/null
+/* Test view numbering after a nonzero-sized align.
+
+ Copyright (C) 2017 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+ .file "dwarf2-17.c"
+ .text
+ .balign 8
+ .globl _start
+_start:
+ .file 1 "dwarf2-17.c"
+ .loc 1 1 view 0
+ .dc.l 0
+ .loc 1 2 view 0
+ .balign 8
+ .loc 1 3 view .L1
+ .dc.l 0
+ .size _start, .-_start
+
+ .section .rodata
+ .uleb128 .L1
--- /dev/null
+#as:
+#readelf: -x.rodata -wL
+#name: DWARF2 18
+# The am3 avr cr16 crx mn10 msp430 nds32 pru rl78 and xtensa targets do not evaluate the subtraction of symbols at assembly time
+# The riscv targets do not support the subtraction of symbols.
+# The tile targets require 8-byte instructions, but the test only simulates 4-byte instructions.
+#not-target: am3-* avr-* cr16-* crx-* mn10*-* msp430-* nds32*-* pru-* riscv*-* rl78-* tile*-* xtensa-*
+
+Hex dump of section '\.rodata':
+ 0x00000000 0100 *.*
+
+Decoded dump of debug contents of section \.debug_line:
+
+CU: dwarf2-18\.c:
+File name *Line number *Starting address *View
+dwarf2-18\.c *1 *0
+dwarf2-18\.c *2 *0 *1
+dwarf2-18\.c *3 *0x4
+dwarf2-18\.c *3 *0x8
--- /dev/null
+/* Test view numbering after view-less .loc.
+
+ Copyright (C) 2017 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+ .file "dwarf2-18.c"
+ .text
+ .balign 8
+ .globl _start
+_start:
+ .file 1 "dwarf2-18.c"
+ .loc 1 1
+ .loc 1 2 view .L1
+ .dc.l 0
+ .loc 1 3 view .L2
+ .dc.l 0
+ .size _start, .-_start
+
+ .section .rodata
+ .uleb128 .L1
+ .uleb128 .L2
\[0x.*\] Extended opcode 2: set Address to .*
\[0x.*\] Advance Line by 3 to 4
\[0x.*\] Copy
- \[0x.*\] Copy
+ \[0x.*\] Copy \(view 1\)
\[0x.*\] Extended opcode 2: set Address to .*
\[0x.*\] Extended opcode 1: End of Sequence
--- /dev/null
+#as:
+#readelf: -x.rodata -wlL
+#name: DWARF2 5
+# The am3 avr cr16 crx mn10 msp430 nds32 pru rl78 rx and xtensa targets do not evaluate the subtraction of symbols at assembly time
+# The mep target tries to relay code sections which breaks symbolic view computations.
+# The riscv targets do not support the subtraction of symbols.
+# The tile targets require 8-byte instructions, but the test only simulates 4-byte instructions.
+#not-target: am3-* avr-* cr16-* crx-* mep-* mn10*-* msp430-* nds32*-* pru-* riscv*-* rl78-* rx-* tile*-* xtensa-*
+
+Hex dump of section '\.rodata':
+ 0x00000000 01010201 010203 *.*
+
+Raw dump of debug contents of section \.debug_line:
+
+ Offset: 0x0
+ Length: [0-9]*
+ DWARF Version: 2
+ Prologue Length: [0-9]*
+ Minimum Instruction Length: [0-9]*
+ Initial value of 'is_stmt': 1
+ Line Base: [-0-9]*
+ Line Range: [0-9]*
+ Opcode Base: [0-9]*
+
+ Opcodes:
+ Opcode 1 has 0 args
+ Opcode 2 has 1 args
+ Opcode 3 has 1 args
+ Opcode 4 has 1 args
+ Opcode 5 has 1 args
+ Opcode 6 has 0 args
+ Opcode 7 has 0 args
+ Opcode 8 has 0 args
+ Opcode 9 has 1 args
+ Opcode 10 has 0 args
+ Opcode 11 has 0 args
+ Opcode 12 has 1 args
+
+ The Directory Table is empty.
+
+ The File Name Table \(offset 0x1c\):
+ Entry Dir Time Size Name
+ 1 0 0 0 dwarf2-5\.c
+
+ Line Number Statements:
+ \[0x.*\] Extended opcode 2: set Address to 0x0
+ \[0x.*\] Copy
+ \[0x.*\] Special opcode [0-9]*: advance Address by 0 to 0x0 and Line by 1 to 2 \(view 1\)
+ \[0x.*\] Special opcode [0-9]*: advance Address by 4 to 0x4 and Line by 1 to 3
+ \[0x.*\] Special opcode [0-9]*: advance Address by 0 to 0x4 and Line by 1 to 4 \(view 1\)
+ \[0x.*\] Special opcode [0-9]*: advance Address by 0 to 0x4 and Line by 1 to 5 \(view 2\)
+ \[0x.*\] Special opcode [0-9]*: advance Address by 4 to 0x8 and Line by 1 to 6
+ \[0x.*\] Special opcode [0-9]*: advance Address by 4 to 0xc and Line by 1 to 7
+ \[0x.*\] Special opcode [0-9]*: advance Address by 0 to 0xc and Line by 1 to 8 \(view 1\)
+ \[0x.*\] Special opcode [0-9]*: advance Address by 4 to 0x10 and Line by 1 to 9
+ \[0x.*\] Special opcode [0-9]*: advance Address by 0 to 0x10 and Line by 1 to 10 \(view 1\)
+ \[0x.*\] Special opcode [0-9]*: advance Address by 0 to 0x10 and Line by 1 to 11 \(view 2\)
+ \[0x.*\] Special opcode [0-9]*: advance Address by 0 to 0x10 and Line by 1 to 12 \(view 3\)
+ \[0x.*\] Advance PC by 4 to 0x14
+ \[0x.*\] Extended opcode 1: End of Sequence
+
+
+Decoded dump of debug contents of section \.debug_line:
+
+CU: dwarf2-5\.c:
+File name *Line number *Starting address *View
+dwarf2-5\.c *1 *0
+dwarf2-5\.c *2 *0 *1
+dwarf2-5\.c *3 *0x4
+dwarf2-5\.c *4 *0x4 *1
+dwarf2-5\.c *5 *0x4 *2
+dwarf2-5\.c *6 *0x8
+dwarf2-5\.c *7 *0xc
+dwarf2-5\.c *8 *0xc *1
+dwarf2-5\.c *9 *0x10
+dwarf2-5\.c *10 *0x10 *1
+dwarf2-5\.c *11 *0x10 *2
+dwarf2-5\.c *12 *0x10 *3
+dwarf2-5\.c *12 *0x14
--- /dev/null
+/* Test view numbering.
+
+ Copyright (C) 2017 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+ .file "dwarf2-5.c"
+ .text
+ .balign 4
+ .globl _start
+_start:
+ .file 1 "dwarf2-5.c"
+ .loc 1 1 view 0
+ .loc 1 2 view .L2
+ .dc.l 0
+ .loc 1 3 view 0
+ .balign 4
+ .loc 1 4 view .L4
+ .loc 1 5 view .L5
+ .org .+1
+ .balign 4
+ .loc 1 6 view 0
+ .dc.l 0
+ .text
+ .globl func
+ .type func, %function
+func:
+ .loc 1 7 view 0
+ .loc 1 8 view .L8
+ .dc.l 0
+ .loc 1 9 view 0
+ .loc 1 10 view .L10
+ .pushsection .text
+ .loc 1 11 view .L11
+ .popsection
+ .loc 1 12 view .L12
+ .dc.l 0
+ .size func, .-func
+
+ .section .rodata
+ .uleb128 .L2
+ .uleb128 .L4
+ .uleb128 .L5
+ .uleb128 .L8
+ .uleb128 .L10
+ .uleb128 .L11
+ .uleb128 .L12
--- /dev/null
+#as:
+#readelf: -wlL
+#name: DWARF2 6
+# These targets either do not support or do not evaluate the subtraction of symbols at assembly time
+#not-target: am3-* avr-* cr16-* crx-* mn10*-* msp430-* nds32*-* pru-* riscv*-* rl78-* xtensa-*
+
+Raw dump of debug contents of section .debug_line:
+
+ Offset: 0x0
+ Length: 84
+ DWARF Version: 2
+ Prologue Length: 36
+ Minimum Instruction Length: 1
+ Initial value of 'is_stmt': 1
+ Line Base: 1
+ Line Range: 1
+ Opcode Base: 16
+
+ Opcodes:
+ Opcode 1 has 0 args
+ Opcode 2 has 1 args
+ Opcode 3 has 1 args
+ Opcode 4 has 1 args
+ Opcode 5 has 1 args
+ Opcode 6 has 0 args
+ Opcode 7 has 0 args
+ Opcode 8 has 0 args
+ Opcode 9 has 1 args
+ Opcode 10 has 0 args
+ Opcode 11 has 0 args
+ Opcode 12 has 1 args
+ Opcode 13 has 0 args
+ Opcode 14 has 0 args
+ Opcode 15 has 0 args
+
+ The Directory Table is empty.
+
+ The File Name Table \(offset 0x1f\):
+ Entry Dir Time Size Name
+ 1 0 0 0 dwarf2-6\.c
+
+
+ Line Number Statements:
+ \[0x.*\] Extended opcode 2: set Address to 0x0
+ \[0x.*\] Copy
+ \[0x.*\] Copy \(view 1\)
+ \[0x.*\] Extended opcode 2: set Address to 0x1
+ \[0x.*\] Copy
+ \[0x.*\] Advance PC by 0 to 0x1
+ \[0x.*\] Copy \(view 1\)
+ \[0x.*\] Advance PC by 1 to 0x2
+ \[0x.*\] Copy
+ \[0x.*\] Advance PC by fixed size amount 1 to 0x3
+ \[0x.*\] Copy \(view 1\)
+ \[0x.*\] Special opcode 0: advance Address by 0 to 0x3 and Line by 1 to 2 \(view 2\)
+ \[0x.*\] Special opcode 1: advance Address by 1 to 0x4 and Line by 1 to 3
+ \[0x.*\] Copy \(view 1\)
+ \[0x.*\] Advance PC by constant 239 to 0xf3
+ \[0x.*\] Copy
+ \[0x.*\] Extended opcode 2: set Address to 0x100
+ \[0x.*\] Extended opcode 1: End of Sequence
+
+
+Decoded dump of debug contents of section \.debug_line:
+
+CU: dwarf2-6\.c:
+File name *Line number *Starting address *View
+dwarf2-6\.c *1 *0
+dwarf2-6\.c *1 *0 *1
+dwarf2-6\.c *1 *0x1
+dwarf2-6\.c *1 *0x1 *1
+dwarf2-6\.c *1 *0x2
+dwarf2-6\.c *1 *0x3 *1
+dwarf2-6\.c *2 *0x3 *2
+dwarf2-6\.c *3 *0x4
+dwarf2-6\.c *3 *0x4 *1
+dwarf2-6\.c *3 *0xf3
+dwarf2-6\.c *3 *0x100
--- /dev/null
+/* Test view number decoding.
+
+ Copyright (C) 2017 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+ .file "dwarf2-6.c"
+ .text
+ .balign 4
+ .globl _start
+_start:
+.L_start:
+ .org .+256
+.Lend_start:
+
+ .section .debug_line,"",%progbits
+ .4byte .Lline_end - .Lline_start /* Initial length. */
+.Lline_start:
+ .2byte 2 /* Dwarf Version. */
+ .4byte .Lline_lines - .Lline_hdr
+.Lline_hdr:
+ .byte 1 /* Minimum insn length. */
+ .byte 1 /* Default is_stmt. */
+ .byte 1 /* Line base. */
+ .byte 1 /* Line range. */
+ .byte 0x10 /* Opcode base. */
+
+ /* Standard lengths. */
+ .byte 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0
+
+ .byte 0 /* Include directories. */
+
+ /* File names. */
+ .ascii "dwarf2-6.c\0"
+ .uleb128 0, 0, 0
+
+ .byte 0
+
+.Lline_lines:
+ .byte 0 /* DW_LNS_extended_op. */
+ .uleb128 5
+ .byte 2 /* DW_LNE_set_address. */
+ .4byte .L_start
+
+ .byte 1 /* DW_LNS_copy view 0. */
+
+ .byte 1 /* DW_LNS_copy view 1. */
+
+ .byte 0 /* DW_LNS_extended_op. */
+ .uleb128 5
+ .byte 2 /* DW_LNE_set_address. */
+ .4byte .L_start+1
+
+ .byte 1 /* DW_LNS_copy view 0. */
+
+ .byte 2 /* DW_LNS_advance_pc by 0. */
+ .uleb128 0
+
+ .byte 1 /* DW_LNS_copy view 1. */
+
+ .byte 2 /* DW_LNS_advance_pc by 1 (reset view). */
+ .uleb128 1
+
+ .byte 1 /* DW_LNS_copy view 0. */
+
+ .byte 9 /* DW_LNS_fixed_advance_pc by 1. */
+ .2byte 1 /* This opcode does NOT reset view. */
+
+ .byte 1 /* DW_LNS_copy view 1. */
+
+ .byte 16 /* Special opcode 0, PC+=0, Line+=1, view 2. */
+
+ .byte 17 /* Special opcode 1, PC+=1 (reset view), Line+=1. */
+
+ .byte 1 /* DW_LNS_copy view 1. */
+
+ .byte 8 /* DW_LNS_const_add_pc by 239 (reset view). */
+
+ .byte 1 /* DW_LNS_copy view 0. */
+
+ .byte 0 /* DW_LNS_extended_op. */
+ .uleb128 5
+ .byte 2 /* DW_LNE_set_address. */
+ .4byte .Lend_start
+
+ .byte 0 /* DW_LNS_extended_op. */
+ .uleb128 1
+ .byte 1 /* DW_LEN_end_of_sequence. */
+
+.Lline_end:
--- /dev/null
+#as:
+#readelf: -x.rodata -wL
+#name: DWARF2 7
+# The am3 avr cr16 crx mn10 msp430 nds32 pru rl78 and xtensa targets do not evaluate the subtraction of symbols at assembly time
+# The riscv targets do not support the subtraction of symbols.
+# The tile targets require 8-byte instructions, but the test only simulates 4-byte instructions.
+#not-target: am3-* avr-* cr16-* crx-* mn10*-* msp430-* nds32*-* pru-* riscv*-* rl78-* tile*-* xtensa-*
+
+Hex dump of section '\.rodata':
+ 0x00000000 01 *.*
+
+Decoded dump of debug contents of section \.debug_line:
+
+CU: dwarf2-7\.c:
+File name *Line number *Starting address *View
+dwarf2-7\.c *1 *0
+dwarf2-7\.c *2 *0
+dwarf2-7\.c *3 *0 *1
+dwarf2-7\.c *3 *0x.
--- /dev/null
+/* Test view numbering forced reset.
+
+ Copyright (C) 2017 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+ .file "dwarf2-7.c"
+ .text
+ .balign 4
+ .globl _start
+_start:
+ .file 1 "dwarf2-7.c"
+ .loc 1 1 view 0
+
+ .section .rodata
+ .uleb128 .L1
+
+ .text
+ .globl func
+ .type func, %function
+func:
+ .loc 1 2 view -0
+ .loc 1 3 view .L1
+ .dc.l 0
+ .size func, .-func
--- /dev/null
+#as:
+#name: DWARF2 8
+#error-output: dwarf2-8.l
+# The tile targets require 8-byte instructions, but the test only simulates 4-byte instructions.
+#not-target: tile*-*
--- /dev/null
+[^:]*: Assembler messages:
+[^:]*:25: Error: view number mismatch
--- /dev/null
+/* Test view numbering zero-assert checking, same frag.
+
+ Copyright (C) 2017 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+ .file "dwarf2-8.c"
+ .text
+ .balign 4
+ .globl _start
+_start:
+ .file 1 "dwarf2-8.c"
+ .loc 1 1 view 0
+ .loc 1 2 view 0
+ .int 0
+ .size _start, .-_start
--- /dev/null
+#as:
+#name: DWARF2 9
+#error-output: dwarf2-9.l
+# The tile targets require 8-byte instructions, but the test only simulates 4-byte instructions.
+#not-target: tile*-*
--- /dev/null
+[^:]*: Assembler messages:
+[^:]*.* Error: view number mismatch
--- /dev/null
+/* Test view numbering zero-assert checking, different frag.
+
+ Copyright (C) 2017 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+ .file "dwarf2-9.c"
+ .text
+ .balign 4
+ .globl _start
+_start:
+ .file 1 "dwarf2-9.c"
+ .loc 1 1 view 0
+
+ .section .rodata
+ .uleb128 0
+
+ .text
+ .loc 1 2 view 0
+ .int 0
+ .size _start, .-_start
run_dump_test "dwarf2-2"
run_dump_test "dwarf2-3"
run_dump_test "dwarf2-4"
+ run_dump_test "dwarf2-5"
+ run_dump_test "dwarf2-6"
+ run_dump_test "dwarf2-7"
+ run_dump_test "dwarf2-8"
+ run_dump_test "dwarf2-9"
+ run_dump_test "dwarf2-10"
+ run_dump_test "dwarf2-11"
+ run_dump_test "dwarf2-12"
+ run_dump_test "dwarf2-13"
+ run_dump_test "dwarf2-14"
+ run_dump_test "dwarf2-15"
+ run_dump_test "dwarf2-16"
+ run_dump_test "dwarf2-17"
+ run_dump_test "dwarf2-18"
run_dump_test "bss"
run_dump_test "bad-bss"
run_dump_test "bad-section-flag"
\[0x.*\] Extended opcode 2: set Address to 0x0
\[0x.*\] Advance Line by 3 to 4
\[0x.*\] Copy
- \[0x.*\] Copy
+ \[0x.*\] Copy \(view 1\)
\[0x.*\] Extended opcode 2: set Address to 0x4
\[0x.*\] Extended opcode 1: End of Sequence
\[0x.*\] Extended opcode 2: set Address to 0x0
\[0x.*\] Advance Line by 3 to 4
\[0x.*\] Copy
- \[0x.*\] Copy
+ \[0x.*\] Copy \(view 1\)
\[0x.*\] Extended opcode 2: set Address to 0x4
\[0x.*\] Extended opcode 1: End of Sequence
\[0x.*\] Extended opcode 2: set Address to .*
\[0x.*\] Copy
\[0x.*\] Set basic block
- \[0x.*\] .* by 1 to 2
+ \[0x.*\] .* by 1 to 2 \(view 1\)
#pass
\[0x.*\] Copy
\[0x.*\] Advance Line by 1 to 2
\[0x.*\] Advance PC by fixed size amount 0 to 0x0
- \[0x.*\] Copy
+ \[0x.*\] Copy \(view 1\)
\[0x.*\] Advance Line by 1 to 3
\[0x.*\] Extended opcode 2: set Address to 0x.*
\[0x.*\] Copy
#...
Line Number Statements:
\[0x.*\] Extended opcode 2: set Address to .*
- \[0x.*\] Copy
+ \[0x.*\] Copy( \(view 1\)|)
\[0x.*\] Set column to 3
\[0x.*\] Advance Line by 1 to 2
\[0x.*\] Advance PC by fixed size amount .* to .*
- \[0x.*\] Copy
+ \[0x.*\] Copy( \(view 1\)|)
\[0x.*\] Set prologue_end to true
\[0x.*\] Advance Line by 1 to 3
\[0x.*\] Advance PC by fixed size amount .* to .*
- \[0x.*\] Copy
+ \[0x.*\] Copy( \(view 2\)|)
\[0x.*\] Set column to 0
\[0x.*\] Set epilogue_begin to true
\[0x.*\] Advance Line by 1 to 4
\[0x.*\] Advance PC by fixed size amount .* to .*
- \[0x.*\] Copy
+ \[0x.*\] Copy( \(view 3\)|)
\[0x.*\] Set ISA to 1
\[0x.*\] Set basic block
\[0x.*\] Advance Line by 1 to 5
\[0x.*\] Advance PC by fixed size amount .* to .*
- \[0x.*\] Copy
+ \[0x.*\] Copy( \(view 4\)|)
\[0x.*\] Set is_stmt to 0
\[0x.*\] Advance Line by 1 to 6
\[0x.*\] Advance PC by fixed size amount .* to .*
- \[0x.*\] Copy
+ \[0x.*\] Copy( \(view 5\)|)
\[0x.*\] Set is_stmt to 1
\[0x.*\] Advance Line by 1 to 7
\[0x.*\] Advance PC by fixed size amount .* to .*
- \[0x.*\] Copy
+ \[0x.*\] Copy( \(view 6\)|)
\[0x.*\] Extended opcode 4: set Discriminator to 1
\[0x.*\] Advance Line by 0 to 7
\[0x.*\] Advance PC by fixed size amount .* to .*
- \[0x.*\] Copy
+ \[0x.*\] Copy( \(view 7\)|)
\[0x.*\] Advance PC by fixed size amount .* to .*
\[0x.*\] Extended opcode 1: End of Sequence
#...
\[0x.*\] Extended opcode 2: set Address to .*
\[0x.*\] Copy
\[0x.*\] Set basic block
- \[0x.*\] .* by 1 to 2
+ \[0x.*\] .* by 1 to 2( \(view 1\)|)
#pass
Line Number Statements:
\[0x.*\] Extended opcode 2: set Address to 0x0
\[0x.*\] Special opcode 11: advance Address by 0 to 0x0 and Line by 6 to 7
- \[0x.*\] Special opcode 7: advance Address by 0 to 0x0 and Line by 2 to 9
- \[0x.*\] Special opcode 6: advance Address by 0 to 0x0 and Line by 1 to 10
+ \[0x.*\] Special opcode 7: advance Address by 0 to 0x0 and Line by 2 to 9 \(view 1\)
+ \[0x.*\] Special opcode 6: advance Address by 0 to 0x0 and Line by 1 to 10 \(view 2\)
\[0x.*\] Special opcode 120: advance Address by 8 to 0x8 and Line by 3 to 13
\[0x.*\] Special opcode 62: advance Address by 4 to 0xc and Line by 1 to 14
- \[0x.*\] Special opcode 6: advance Address by 0 to 0xc and Line by 1 to 15
+ \[0x.*\] Special opcode 6: advance Address by 0 to 0xc and Line by 1 to 15 \(view 1\)
\[0x.*\] Special opcode 119: advance Address by 8 to 0x14 and Line by 2 to 17
\[0x.*\] Advance PC by 4 to 0x18
\[0x.*\] Extended opcode 1: End of Sequence
# Set prologue_end to true
# here
#------------------------------------------------------------------------
-.* Special opcode 6: advance Address by 0 to 0x[01] and Line by 1 to 2
+.* Special opcode 6: advance Address by 0 to 0x[01] and Line by 1 to 2 \(view 1\)
.* Advance PC by .*
.* Extended opcode 1: End of Sequence
\[0x.*\] Special opcode 11: advance Address by 0 to 0x0 and Line by 6 to 7
\[0x.*\] Special opcode 63: advance Address by 4 to 0x4 and Line by 2 to 9
\[0x.*\] Special opcode 120: advance Address by 8 to 0xc and Line by 3 to 12
- \[0x.*\] Special opcode 7: advance Address by 0 to 0xc and Line by 2 to 14
+ \[0x.*\] Special opcode 7: advance Address by 0 to 0xc and Line by 2 to 14 \(view 1\)
\[0x.*\] Special opcode 120: advance Address by 8 to 0x14 and Line by 3 to 17
- \[0x.*\] Special opcode 7: advance Address by 0 to 0x14 and Line by 2 to 19
+ \[0x.*\] Special opcode 7: advance Address by 0 to 0x14 and Line by 2 to 19 \(view 1\)
\[0x.*\] Special opcode 120: advance Address by 8 to 0x1c and Line by 3 to 22
\[0x.*\] Special opcode 63: advance Address by 4 to 0x20 and Line by 2 to 24
\[0x.*\] Special opcode 120: advance Address by 8 to 0x28 and Line by 3 to 27
\[0x.*\] Special opcode 120: advance Address by 8 to 0x34 and Line by 3 to 32
\[0x.*\] Special opcode 63: advance Address by 4 to 0x38 and Line by 2 to 34
\[0x.*\] Special opcode 120: advance Address by 8 to 0x40 and Line by 3 to 37
- \[0x.*\] Special opcode 7: advance Address by 0 to 0x40 and Line by 2 to 39
+ \[0x.*\] Special opcode 7: advance Address by 0 to 0x40 and Line by 2 to 39 \(view 1\)
\[0x.*\] Special opcode 120: advance Address by 8 to 0x48 and Line by 3 to 42
\[0x.*\] Special opcode 63: advance Address by 4 to 0x4c and Line by 2 to 44
\[0x.*\] Advance PC by 36 to 0x70
Line Number Statements:
\[0x.*\] Extended opcode 2: set Address to 0x1
\[0x.*\] Special opcode 11: advance Address by 0 to 0x1 and Line by 6 to 7
- \[0x.*\] Special opcode 7: advance Address by 0 to 0x1 and Line by 2 to 9
- \[0x.*\] Special opcode 6: advance Address by 0 to 0x1 and Line by 1 to 10
+ \[0x.*\] Special opcode 7: advance Address by 0 to 0x1 and Line by 2 to 9 \(view 1\)
+ \[0x.*\] Special opcode 6: advance Address by 0 to 0x1 and Line by 1 to 10 \(view 2\)
\[0x.*\] Special opcode 64: advance Address by 4 to 0x5 and Line by 3 to 13
\[0x.*\] Special opcode 34: advance Address by 2 to 0x7 and Line by 1 to 14
- \[0x.*\] Special opcode 6: advance Address by 0 to 0x7 and Line by 1 to 15
+ \[0x.*\] Special opcode 6: advance Address by 0 to 0x7 and Line by 1 to 15 \(view 1\)
\[0x.*\] Special opcode 63: advance Address by 4 to 0xb and Line by 2 to 17
\[0x.*\] Advance PC by 1 to 0xc
\[0x.*\] Extended opcode 1: End of Sequence
\[0x.*\] Special opcode 11: advance Address by 0 to 0x1 and Line by 6 to 7
\[0x.*\] Special opcode 35: advance Address by 2 to 0x3 and Line by 2 to 9
\[0x.*\] Special opcode 36: advance Address by 2 to 0x5 and Line by 3 to 12
- \[0x.*\] Special opcode 7: advance Address by 0 to 0x5 and Line by 2 to 14
+ \[0x.*\] Special opcode 7: advance Address by 0 to 0x5 and Line by 2 to 14 \(view 1\)
\[0x.*\] Special opcode 64: advance Address by 4 to 0x9 and Line by 3 to 17
- \[0x.*\] Special opcode 7: advance Address by 0 to 0x9 and Line by 2 to 19
+ \[0x.*\] Special opcode 7: advance Address by 0 to 0x9 and Line by 2 to 19 \(view 1\)
\[0x.*\] Special opcode 64: advance Address by 4 to 0xd and Line by 3 to 22
\[0x.*\] Special opcode 35: advance Address by 2 to 0xf and Line by 2 to 24
\[0x.*\] Special opcode 36: advance Address by 2 to 0x11 and Line by 3 to 27
Line Number Statements:
\[0x.*\] Extended opcode 2: set Address to 0x1
\[0x.*\] Special opcode 11: advance Address by 0 to 0x1 and Line by 6 to 7
- \[0x.*\] Special opcode 7: advance Address by 0 to 0x1 and Line by 2 to 9
- \[0x.*\] Special opcode 6: advance Address by 0 to 0x1 and Line by 1 to 10
+ \[0x.*\] Special opcode 7: advance Address by 0 to 0x1 and Line by 2 to 9 \(view 1\)
+ \[0x.*\] Special opcode 6: advance Address by 0 to 0x1 and Line by 1 to 10 \(view 2\)
\[0x.*\] Special opcode 64: advance Address by 4 to 0x5 and Line by 3 to 13
\[0x.*\] Special opcode 34: advance Address by 2 to 0x7 and Line by 1 to 14
- \[0x.*\] Special opcode 6: advance Address by 0 to 0x7 and Line by 1 to 15
+ \[0x.*\] Special opcode 6: advance Address by 0 to 0x7 and Line by 1 to 15 \(view 1\)
\[0x.*\] Special opcode 35: advance Address by 2 to 0x9 and Line by 2 to 17
\[0x.*\] Advance PC by 1 to 0xa
\[0x.*\] Extended opcode 1: End of Sequence
\[0x.*\] Special opcode 11: advance Address by 0 to 0x1 and Line by 6 to 7
\[0x.*\] Special opcode 35: advance Address by 2 to 0x3 and Line by 2 to 9
\[0x.*\] Special opcode 64: advance Address by 4 to 0x7 and Line by 3 to 12
- \[0x.*\] Special opcode 7: advance Address by 0 to 0x7 and Line by 2 to 14
+ \[0x.*\] Special opcode 7: advance Address by 0 to 0x7 and Line by 2 to 14 \(view 1\)
\[0x.*\] Special opcode 64: advance Address by 4 to 0xb and Line by 3 to 17
- \[0x.*\] Special opcode 7: advance Address by 0 to 0xb and Line by 2 to 19
+ \[0x.*\] Special opcode 7: advance Address by 0 to 0xb and Line by 2 to 19 \(view 1\)
\[0x.*\] Special opcode 64: advance Address by 4 to 0xf and Line by 3 to 22
\[0x.*\] Special opcode 35: advance Address by 2 to 0x11 and Line by 2 to 24
\[0x.*\] Special opcode 64: advance Address by 4 to 0x15 and Line by 3 to 27
\[0x.*\] Special opcode 64: advance Address by 4 to 0x1b and Line by 3 to 32
\[0x.*\] Special opcode 35: advance Address by 2 to 0x1d and Line by 2 to 34
\[0x.*\] Special opcode 64: advance Address by 4 to 0x21 and Line by 3 to 37
- \[0x.*\] Special opcode 7: advance Address by 0 to 0x21 and Line by 2 to 39
+ \[0x.*\] Special opcode 7: advance Address by 0 to 0x21 and Line by 2 to 39 \(view 1\)
\[0x.*\] Special opcode 92: advance Address by 6 to 0x27 and Line by 3 to 42
\[0x.*\] Special opcode 35: advance Address by 2 to 0x29 and Line by 2 to 44
\[0x.*\] Advance PC by 23 to 0x40
\[0x.*\] Special opcode 11: advance Address by 0 to 0x1 and Line by 6 to 7
\[0x.*\] Special opcode 35: advance Address by 2 to 0x3 and Line by 2 to 9
\[0x.*\] Special opcode 36: advance Address by 2 to 0x5 and Line by 3 to 12
- \[0x.*\] Special opcode 7: advance Address by 0 to 0x5 and Line by 2 to 14
+ \[0x.*\] Special opcode 7: advance Address by 0 to 0x5 and Line by 2 to 14 \(view 1\)
\[0x.*\] Special opcode 64: advance Address by 4 to 0x9 and Line by 3 to 17
- \[0x.*\] Special opcode 7: advance Address by 0 to 0x9 and Line by 2 to 19
+ \[0x.*\] Special opcode 7: advance Address by 0 to 0x9 and Line by 2 to 19 \(view 1\)
\[0x.*\] Special opcode 64: advance Address by 4 to 0xd and Line by 3 to 22
\[0x.*\] Special opcode 35: advance Address by 2 to 0xf and Line by 2 to 24
\[0x.*\] Special opcode 36: advance Address by 2 to 0x11 and Line by 3 to 27
\[0x.*\] Special opcode 36: advance Address by 2 to 0x15 and Line by 3 to 32
\[0x.*\] Special opcode 35: advance Address by 2 to 0x17 and Line by 2 to 34
\[0x.*\] Special opcode 36: advance Address by 2 to 0x19 and Line by 3 to 37
- \[0x.*\] Special opcode 7: advance Address by 0 to 0x19 and Line by 2 to 39
+ \[0x.*\] Special opcode 7: advance Address by 0 to 0x19 and Line by 2 to 39 \(view 1\)
\[0x.*\] Special opcode 92: advance Address by 6 to 0x1f and Line by 3 to 42
\[0x.*\] Special opcode 35: advance Address by 2 to 0x21 and Line by 2 to 44
\[0x.*\] Advance PC by 31 to 0x40
valueT value = S_GET_VALUE (fragP->fr_symbol);
int size;
+ if (!S_IS_DEFINED (fragP->fr_symbol))
+ {
+ as_bad_where (fragP->fr_file, fragP->fr_line,
+ _("leb128 operand is an undefined symbol: %s"),
+ S_GET_NAME (fragP->fr_symbol));
+ }
+
size = output_leb128 (fragP->fr_literal + fragP->fr_fix, value,
fragP->fr_subtype);
/* Relaxation has completed. Freeze all syms. */
finalize_syms = 1;
+ dwarf2dbg_final_check ();
+
#ifdef md_post_relax_hook
md_post_relax_hook;
#endif
Decoded dump of debug contents of section .debug_line:
.*:
-File name Line number Starting address
+File name Line number Starting address View
per-function-debugline.s 39 0
-per-function-debugline.s 40 0x2
+per-function-debugline.s 40 0x2 1
-per-function-debugline.s 41 0x4
+per-function-debugline.s 41 0x4 2
-per-function-debugline.s 42 0x6
+per-function-debugline.s 42 0x6 3
-per-function-debugline.s 47 0x8
+per-function-debugline.s 47 0x8 4
-per-function-debugline.s 48 0xc
+per-function-debugline.s 48 0xc 5
-per-function-debugline.s 49 0x10
+per-function-debugline.s 49 0x10 6
-per-function-debugline.s 50 0x12
+per-function-debugline.s 50 0x12 7
-per-function-debugline.s 51 0x16
+per-function-debugline.s 51 0x16 8
-per-function-debugline.s 52 0x1a
+per-function-debugline.s 52 0x1a 9
-per-function-debugline.s 54 0x1c
+per-function-debugline.s 54 0x1c 10
-per-function-debugline.s 55 0x1e
+per-function-debugline.s 55 0x1e 11
-per-function-debugline.s 56 0x20
+per-function-debugline.s 56 0x20 12
-per-function-debugline.s 62 0x22
-
-per-function-debugline.s 63 0x24
+per-function-debugline.s 56 0x22 13
-per-function-debugline.s 64 0x26
-
-per-function-debugline.s 65 0x28
+per-function-debugline.s 62 0x22
-per-function-debugline.s 70 0x2a
+per-function-debugline.s 63 0x24 1
-per-function-debugline.s 71 0x2e
+per-function-debugline.s 64 0x26 2
-per-function-debugline.s 72 0x32
+per-function-debugline.s 65 0x28 3
-per-function-debugline.s 73 0x36
+per-function-debugline.s 70 0x2a 4
-per-function-debugline.s 74 0x38
+per-function-debugline.s 71 0x2e 5
-per-function-debugline.s 75 0x3c
+per-function-debugline.s 72 0x32 6
-per-function-debugline.s 76 0x40
+per-function-debugline.s 73 0x36 7
-per-function-debugline.s 77 0x44
+per-function-debugline.s 74 0x38 8
-per-function-debugline.s 79 0x48
+per-function-debugline.s 75 0x3c 9
-per-function-debugline.s 80 0x4a
+per-function-debugline.s 76 0x40 10
-per-function-debugline.s 81 0x4c
+per-function-debugline.s 77 0x44 11
+per-function-debugline.s 79 0x48 12
+per-function-debugline.s 80 0x4a 13
+#pass