This patch introduces support for specifing views in .loc directives, so that the...
authorAlexandre Oliva <aoliva@redhat.com>
Fri, 21 Jul 2017 09:09:06 +0000 (10:09 +0100)
committerNick Clifton <nickc@redhat.com>
Fri, 21 Jul 2017 09:13:18 +0000 (10:13 +0100)
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.

72 files changed:
binutils/ChangeLog
binutils/dwarf.c
binutils/testsuite/binutils-all/dw2-1.W
binutils/testsuite/binutils-all/dw2-3.W
binutils/testsuite/binutils-all/dw2-3gabi.W
binutils/testsuite/binutils-all/dw5.W
binutils/testsuite/binutils-all/i386/compressed-1a.d
binutils/testsuite/binutils-all/libdw2-compressedgabi.out
binutils/testsuite/binutils-all/objdump.W
binutils/testsuite/binutils-all/objdump.WL
binutils/testsuite/binutils-all/x86-64/compressed-1a.d
gas/ChangeLog
gas/NEWS
gas/doc/as.texinfo
gas/dwarf2dbg.c
gas/dwarf2dbg.h
gas/read.c
gas/testsuite/gas/all/gas.exp
gas/testsuite/gas/all/sleb128-9.d [new file with mode: 0644]
gas/testsuite/gas/all/sleb128-9.l [new file with mode: 0644]
gas/testsuite/gas/all/sleb128-9.s [new file with mode: 0644]
gas/testsuite/gas/avr/large-debug-line-table.d
gas/testsuite/gas/elf/dwarf2-1.d
gas/testsuite/gas/elf/dwarf2-10.d [new file with mode: 0644]
gas/testsuite/gas/elf/dwarf2-10.l [new file with mode: 0644]
gas/testsuite/gas/elf/dwarf2-10.s [new file with mode: 0644]
gas/testsuite/gas/elf/dwarf2-11.d [new file with mode: 0644]
gas/testsuite/gas/elf/dwarf2-11.s [new file with mode: 0644]
gas/testsuite/gas/elf/dwarf2-12.d [new file with mode: 0644]
gas/testsuite/gas/elf/dwarf2-12.s [new file with mode: 0644]
gas/testsuite/gas/elf/dwarf2-13.d [new file with mode: 0644]
gas/testsuite/gas/elf/dwarf2-13.s [new file with mode: 0644]
gas/testsuite/gas/elf/dwarf2-14.d [new file with mode: 0644]
gas/testsuite/gas/elf/dwarf2-14.s [new file with mode: 0644]
gas/testsuite/gas/elf/dwarf2-15.d [new file with mode: 0644]
gas/testsuite/gas/elf/dwarf2-15.s [new file with mode: 0644]
gas/testsuite/gas/elf/dwarf2-16.d [new file with mode: 0644]
gas/testsuite/gas/elf/dwarf2-16.s [new file with mode: 0644]
gas/testsuite/gas/elf/dwarf2-17.d [new file with mode: 0644]
gas/testsuite/gas/elf/dwarf2-17.s [new file with mode: 0644]
gas/testsuite/gas/elf/dwarf2-18.d [new file with mode: 0644]
gas/testsuite/gas/elf/dwarf2-18.s [new file with mode: 0644]
gas/testsuite/gas/elf/dwarf2-2.d
gas/testsuite/gas/elf/dwarf2-5.d [new file with mode: 0644]
gas/testsuite/gas/elf/dwarf2-5.s [new file with mode: 0644]
gas/testsuite/gas/elf/dwarf2-6.d [new file with mode: 0644]
gas/testsuite/gas/elf/dwarf2-6.s [new file with mode: 0644]
gas/testsuite/gas/elf/dwarf2-7.d [new file with mode: 0644]
gas/testsuite/gas/elf/dwarf2-7.s [new file with mode: 0644]
gas/testsuite/gas/elf/dwarf2-8.d [new file with mode: 0644]
gas/testsuite/gas/elf/dwarf2-8.l [new file with mode: 0644]
gas/testsuite/gas/elf/dwarf2-8.s [new file with mode: 0644]
gas/testsuite/gas/elf/dwarf2-9.d [new file with mode: 0644]
gas/testsuite/gas/elf/dwarf2-9.l [new file with mode: 0644]
gas/testsuite/gas/elf/dwarf2-9.s [new file with mode: 0644]
gas/testsuite/gas/elf/elf.exp
gas/testsuite/gas/i386/dw2-compress-1.d
gas/testsuite/gas/i386/dw2-compressed-1.d
gas/testsuite/gas/i386/ilp32/lns/lns-duplicate.d
gas/testsuite/gas/lns/lns-big-delta.d
gas/testsuite/gas/lns/lns-common-1-alt.d
gas/testsuite/gas/lns/lns-duplicate.d
gas/testsuite/gas/mips/loc-swap-2.d
gas/testsuite/gas/mips/loc-swap-3.d
gas/testsuite/gas/mips/loc-swap.d
gas/testsuite/gas/mips/micromips@loc-swap-2.d
gas/testsuite/gas/mips/micromips@loc-swap.d
gas/testsuite/gas/mips/mips16@loc-swap-2.d
gas/testsuite/gas/mips/mips16@loc-swap.d
gas/testsuite/gas/mips/mips16e@loc-swap.d
gas/write.c
ld/testsuite/ld-avr/gc-section-debugline.d

index 7e9d809c14391581af0a0a0c262e580991cdf5c2..4b1b9e038b6472b5ce7ca46747eef028ea0df368 100644 (file)
@@ -1,3 +1,22 @@
+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.
index f6fa157fed40ae2d2fe1834cb620274ec1df76d7..ab6446defb06d7288625a140599774c6f3f2b3c7 100644 (file)
@@ -426,6 +426,7 @@ read_uleb128 (unsigned char * data,
 typedef struct State_Machine_Registers
 {
   dwarf_vma address;
+  unsigned int view;
   unsigned int file;
   unsigned int line;
   unsigned int column;
@@ -433,8 +434,8 @@ typedef struct State_Machine_Registers
   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;
 
@@ -444,6 +445,7 @@ static void
 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;
@@ -502,6 +504,7 @@ process_extended_line_op (unsigned char * data,
        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;
 
@@ -3190,6 +3193,7 @@ display_debug_lines_raw (struct dwarf_section *section,
                         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);
@@ -3381,30 +3385,45 @@ display_debug_lines_raw (struct dwarf_section *section,
                    {
                      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)
                     {
@@ -3413,7 +3432,12 @@ display_debug_lines_raw (struct dwarf_section *section,
                       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:
@@ -3423,23 +3447,33 @@ display_debug_lines_raw (struct dwarf_section *section,
                         {
                           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;
 
@@ -3486,23 +3520,33 @@ display_debug_lines_raw (struct dwarf_section *section,
                         {
                           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;
 
@@ -3513,6 +3557,7 @@ display_debug_lines_raw (struct dwarf_section *section,
                       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:
@@ -3925,7 +3970,7 @@ display_debug_lines_decoded (struct dwarf_section *section,
                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;
        }
 
@@ -3933,12 +3978,14 @@ display_debug_lines_decoded (struct dwarf_section *section,
       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)
            {
@@ -3948,21 +3995,28 @@ display_debug_lines_decoded (struct dwarf_section *section,
                {
                  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)
                 {
@@ -3983,11 +4037,13 @@ display_debug_lines_decoded (struct dwarf_section *section,
                       }
                     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,
@@ -3995,6 +4051,7 @@ display_debug_lines_decoded (struct dwarf_section *section,
                                                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:
                         {
@@ -4037,6 +4094,7 @@ display_debug_lines_decoded (struct dwarf_section *section,
                     break;
                   }
                 case DW_LNS_copy:
+                  /* Increment view after printing this row.  */
                   break;
 
                 case DW_LNS_advance_pc:
@@ -4046,16 +4104,22 @@ display_debug_lines_decoded (struct dwarf_section *section,
                     {
                       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;
 
@@ -4124,16 +4188,22 @@ display_debug_lines_decoded (struct dwarf_section *section,
                     {
                       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;
 
@@ -4141,6 +4211,7 @@ display_debug_lines_decoded (struct dwarf_section *section,
                   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:
@@ -4172,8 +4243,8 @@ display_debug_lines_decoded (struct dwarf_section *section,
 
          /* 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;
@@ -4214,11 +4285,11 @@ display_debug_lines_decoded (struct dwarf_section *section,
              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);
@@ -4226,18 +4297,27 @@ display_debug_lines_decoded (struct dwarf_section *section,
              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);
            }
index d70581b2956b49a37194ff2b5227db41d1a3a72c..fb9c7989f37275b5f69f086161ebff79cdfcbd77 100644 (file)
@@ -69,7 +69,7 @@ Raw dump of debug contents of section .z?debug_line:
   \[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
 
index 08a7f356df4d7c791976dae376385ce7f107dad2..af77f87aca8d481551917fd859348c8f79d4db17 100644 (file)
@@ -149,7 +149,7 @@ Raw dump of debug contents of section .z?debug_line:
   \[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
 
index 0d0fe6afbbe3be754a3e4c3661bbe01a6a3e74bb..4a7926021b1fdaf4f7886302db8ffce0657bfd48 100644 (file)
@@ -149,7 +149,7 @@ Raw dump of debug contents of section .debug_line:
   \[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
 
index 6f3f8efa124753e54c8d54c26d628bc0ea975ce9..1fa0d5d07b683e1d18d0232ff513fb11646adb03 100644 (file)
@@ -345,11 +345,13 @@ Raw dump of debug contents of section .debug_line:
 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
 
 
index 5f02defbfcc23ab38a8d21e1dfd438848d158e81..a45c6b88a4a300890c2cb1fa48ae90e151abc2e8 100644 (file)
@@ -96,7 +96,7 @@ Raw dump of debug contents of section .[z]?debug_line:
   \[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
index 3baa42ab4ce36854f36fa75768f34114ddcc1ab3..ab456d5a38851652005b574e2c10731a0c09a209 100644 (file)
@@ -70,7 +70,7 @@ Raw dump of debug contents of section .debug_line:
   \[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
 
@@ -172,7 +172,7 @@ Raw dump of debug contents of section .debug_line:
   \[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
 
@@ -355,7 +355,7 @@ Raw dump of debug contents of section .debug_line:
   \[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
 
index a5379d0c561f4f18a59defc9d23aad5b3ec62b08..5f977eefb13f04867b74b77af17bd177a9b1b34a 100644 (file)
@@ -69,7 +69,7 @@ Raw dump of debug contents of section .z?debug_line:
   \[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
 
index 3846f4fce1a529e1e366e772041898761ca38795..7c5a591a6ddeb7f729c696aa16ba664e3b5f0dea 100644 (file)
@@ -4,7 +4,7 @@
 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 .*
@@ -12,4 +12,5 @@ file1\.c                                        1 .*
 
 \./dw2-decodedline\.c:\[\+\+\]
 dw2-decodedline\.c                              2 .*
+dw2-decodedline\.c                              2 .*
 
index 574b719b79a8e67b8993aeb780ce3a083c03eab0..75b8ce597f5b1e7fbf229278403e753a3bed2bfa 100644 (file)
@@ -96,10 +96,10 @@ Raw dump of debug contents of section .[z]?debug_line:
   \[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
 
index fe8476f968944f9ff708158960655acc784ddf40..58f2ef4ce17016cfdee2f8b0f3418c8ea7558758 100644 (file)
@@ -5,6 +5,80 @@
        * 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.
index ef44007c9897a77e15830e4c95f6fe81bd52aca1..843f6c1120e0df2aa25bd018ba1e0d4bb73a75ac 100644 (file)
--- a/gas/NEWS
+++ b/gas/NEWS
@@ -1,5 +1,7 @@
 -*- text -*-
 
+* Add support for loaction views in DWARF debug line information.
+
 Changes in 2.29:
 
 * Add support for ELF SHF_GNU_MBIND.
index b82204dfdf773de3a3f6f293e350f4e31c72cf0e..8aa83ef1eb3791dcbe319a2357e2d7ac4be5433d 100644 (file)
@@ -5833,6 +5833,19 @@ state machine to @var{value}, which must be an unsigned integer.
 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
index e02b6e8f020fa19c7e6d912f6ad67f86080e8785..4f703304d5294978127fe49292fc2159038f57b0 100644 (file)
 #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;
@@ -176,7 +183,8 @@ struct line_subseg {
   struct line_entry **pmove_tail;
 };
 
-struct line_seg {
+struct line_seg
+{
   struct line_seg *next;
   segT seg;
   struct line_subseg *head;
@@ -188,7 +196,8 @@ struct line_seg {
 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;
 };
@@ -212,12 +221,21 @@ bfd_boolean dwarf2_loc_directive_seen;
 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
@@ -283,6 +301,168 @@ get_line_subseg (segT seg, subsegT subseg, bfd_boolean create_p)
   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
@@ -297,6 +477,12 @@ dwarf2_gen_line_info_1 (symbolS *label, struct dwarf2_line_info *loc)
   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;
 }
@@ -350,12 +536,16 @@ dwarf2_where (struct dwarf2_line_info *line)
 {
   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;
@@ -380,7 +570,9 @@ dwarf2_emit_insn (int size)
 {
   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);
@@ -721,6 +913,54 @@ dwarf2_directive_loc (int dummy ATTRIBUTE_UNUSED)
              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);
@@ -734,6 +974,10 @@ dwarf2_directive_loc (int dummy ATTRIBUTE_UNUSED)
   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
@@ -1362,7 +1606,19 @@ process_entries (segT seg, struct line_entry *e)
       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);
@@ -1975,3 +2231,42 @@ dwarf2_finish (void)
                      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;
+       }
+    }
+}
index 9e2ceada080c20ccf53e42a381a1d476cadbc4f1..60a05685ab9f1753f83bb5ed98a95ebdab5324da 100644 (file)
 #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
@@ -48,27 +50,27 @@ extern char *dwarf2_directive_file (int dummy);
    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);
@@ -99,9 +101,12 @@ extern int dwarf2dbg_estimate_size_before_relax (fragS *);
 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
index a26d4fe44df8f8544c950a2bdd01632c0a14cf73..9627ef513bf37b6ee20b98a7e3ac61b2f2991245 100644 (file)
@@ -5384,7 +5384,7 @@ s_leb128 (int sign)
 
   do
     {
-      expression (&exp);
+      deferred_expression (&exp);
       emit_leb128_expr (&exp, sign);
     }
   while (*input_line_pointer++ == ',');
index b5b0bebbf35ada2a68868a7c00e1d7e0bdd55092..e43947d42a055deeceffedd92cb3e2a33780f827 100644 (file)
@@ -394,6 +394,7 @@ if { ![istarget "tic4x*-*-*"] && ![istarget "tic54x*-*-*"] } {
     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.
diff --git a/gas/testsuite/gas/all/sleb128-9.d b/gas/testsuite/gas/all/sleb128-9.d
new file mode 100644 (file)
index 0000000..5c5997f
--- /dev/null
@@ -0,0 +1,5 @@
+#name: undefined symbols in sleb128 directive
+#source: sleb128-9.s
+#error-output: sleb128-9.l
+#not-target: riscv*-*
+
diff --git a/gas/testsuite/gas/all/sleb128-9.l b/gas/testsuite/gas/all/sleb128-9.l
new file mode 100644 (file)
index 0000000..19842fa
--- /dev/null
@@ -0,0 +1,3 @@
+[^:]*: Assembler messages:
+[^:]*:2: Error: leb128 operand is an undefined symbol: \.Lundef
+[^:]*:3: Error: leb128 operand is an undefined symbol: undef
diff --git a/gas/testsuite/gas/all/sleb128-9.s b/gas/testsuite/gas/all/sleb128-9.s
new file mode 100644 (file)
index 0000000..87cb955
--- /dev/null
@@ -0,0 +1,3 @@
+       .data
+       .sleb128 .Lundef
+       .sleb128 undef
index 31ca7edd1431d543cfe8135b7f9d0503b8a51184..ecba3dfdd00f9003c657898de612e95f3b24c980 100644 (file)
@@ -9,7 +9,7 @@
 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
 
 #...
index bae2f630ea7f752089daeb1e3d2279324f735d0a..d8b79effc7888b997fd9cea1e96bfe7aad1e1e37 100644 (file)
@@ -71,7 +71,7 @@ Raw dump of debug contents of section .[z]?debug_line:
   \[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
 
diff --git a/gas/testsuite/gas/elf/dwarf2-10.d b/gas/testsuite/gas/elf/dwarf2-10.d
new file mode 100644 (file)
index 0000000..13c3171
--- /dev/null
@@ -0,0 +1,6 @@
+#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*-*
diff --git a/gas/testsuite/gas/elf/dwarf2-10.l b/gas/testsuite/gas/elf/dwarf2-10.l
new file mode 100644 (file)
index 0000000..b5f1f65
--- /dev/null
@@ -0,0 +1,2 @@
+[^:]*: Assembler messages:
+[^:]*: Error: view number mismatch
diff --git a/gas/testsuite/gas/elf/dwarf2-10.s b/gas/testsuite/gas/elf/dwarf2-10.s
new file mode 100644 (file)
index 0000000..d159d43
--- /dev/null
@@ -0,0 +1,32 @@
+/* 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
diff --git a/gas/testsuite/gas/elf/dwarf2-11.d b/gas/testsuite/gas/elf/dwarf2-11.d
new file mode 100644 (file)
index 0000000..797d50d
--- /dev/null
@@ -0,0 +1,15 @@
+#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
diff --git a/gas/testsuite/gas/elf/dwarf2-11.s b/gas/testsuite/gas/elf/dwarf2-11.s
new file mode 100644 (file)
index 0000000..a1b0d0a
--- /dev/null
@@ -0,0 +1,28 @@
+/* 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
diff --git a/gas/testsuite/gas/elf/dwarf2-12.d b/gas/testsuite/gas/elf/dwarf2-12.d
new file mode 100644 (file)
index 0000000..0e1bc9b
--- /dev/null
@@ -0,0 +1,20 @@
+#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
diff --git a/gas/testsuite/gas/elf/dwarf2-12.s b/gas/testsuite/gas/elf/dwarf2-12.s
new file mode 100644 (file)
index 0000000..3e3392a
--- /dev/null
@@ -0,0 +1,31 @@
+/* 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
diff --git a/gas/testsuite/gas/elf/dwarf2-13.d b/gas/testsuite/gas/elf/dwarf2-13.d
new file mode 100644 (file)
index 0000000..6961a6b
--- /dev/null
@@ -0,0 +1,19 @@
+#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
diff --git a/gas/testsuite/gas/elf/dwarf2-13.s b/gas/testsuite/gas/elf/dwarf2-13.s
new file mode 100644 (file)
index 0000000..118d692
--- /dev/null
@@ -0,0 +1,33 @@
+/* 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
diff --git a/gas/testsuite/gas/elf/dwarf2-14.d b/gas/testsuite/gas/elf/dwarf2-14.d
new file mode 100644 (file)
index 0000000..88af145
--- /dev/null
@@ -0,0 +1,19 @@
+#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
diff --git a/gas/testsuite/gas/elf/dwarf2-14.s b/gas/testsuite/gas/elf/dwarf2-14.s
new file mode 100644 (file)
index 0000000..80f91ff
--- /dev/null
@@ -0,0 +1,32 @@
+/* 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
diff --git a/gas/testsuite/gas/elf/dwarf2-15.d b/gas/testsuite/gas/elf/dwarf2-15.d
new file mode 100644 (file)
index 0000000..c7280e5
--- /dev/null
@@ -0,0 +1,19 @@
+#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
diff --git a/gas/testsuite/gas/elf/dwarf2-15.s b/gas/testsuite/gas/elf/dwarf2-15.s
new file mode 100644 (file)
index 0000000..e41f84a
--- /dev/null
@@ -0,0 +1,32 @@
+/* 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
diff --git a/gas/testsuite/gas/elf/dwarf2-16.d b/gas/testsuite/gas/elf/dwarf2-16.d
new file mode 100644 (file)
index 0000000..b01292e
--- /dev/null
@@ -0,0 +1,20 @@
+#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
diff --git a/gas/testsuite/gas/elf/dwarf2-16.s b/gas/testsuite/gas/elf/dwarf2-16.s
new file mode 100644 (file)
index 0000000..deacf56
--- /dev/null
@@ -0,0 +1,33 @@
+/* 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
diff --git a/gas/testsuite/gas/elf/dwarf2-17.d b/gas/testsuite/gas/elf/dwarf2-17.d
new file mode 100644 (file)
index 0000000..8c5c287
--- /dev/null
@@ -0,0 +1,20 @@
+#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
diff --git a/gas/testsuite/gas/elf/dwarf2-17.s b/gas/testsuite/gas/elf/dwarf2-17.s
new file mode 100644 (file)
index 0000000..4e5d91b
--- /dev/null
@@ -0,0 +1,33 @@
+/* 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
diff --git a/gas/testsuite/gas/elf/dwarf2-18.d b/gas/testsuite/gas/elf/dwarf2-18.d
new file mode 100644 (file)
index 0000000..08f1af8
--- /dev/null
@@ -0,0 +1,19 @@
+#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
diff --git a/gas/testsuite/gas/elf/dwarf2-18.s b/gas/testsuite/gas/elf/dwarf2-18.s
new file mode 100644 (file)
index 0000000..9e5e210
--- /dev/null
@@ -0,0 +1,33 @@
+/* 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
index b42a2ec5e64a59d4ed39b7f715bf06a5288b729d..8cc1c3bb03972ca83d666ef5d640ef13cc9387fb 100644 (file)
@@ -71,7 +71,7 @@ Raw dump of debug contents of section .[z]?debug_line:
   \[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
 
diff --git a/gas/testsuite/gas/elf/dwarf2-5.d b/gas/testsuite/gas/elf/dwarf2-5.d
new file mode 100644 (file)
index 0000000..6525c2e
--- /dev/null
@@ -0,0 +1,79 @@
+#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
diff --git a/gas/testsuite/gas/elf/dwarf2-5.s b/gas/testsuite/gas/elf/dwarf2-5.s
new file mode 100644 (file)
index 0000000..3e58239
--- /dev/null
@@ -0,0 +1,58 @@
+/* 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
diff --git a/gas/testsuite/gas/elf/dwarf2-6.d b/gas/testsuite/gas/elf/dwarf2-6.d
new file mode 100644 (file)
index 0000000..93489d6
--- /dev/null
@@ -0,0 +1,78 @@
+#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
diff --git a/gas/testsuite/gas/elf/dwarf2-6.s b/gas/testsuite/gas/elf/dwarf2-6.s
new file mode 100644 (file)
index 0000000..28b1829
--- /dev/null
@@ -0,0 +1,101 @@
+/* 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:
diff --git a/gas/testsuite/gas/elf/dwarf2-7.d b/gas/testsuite/gas/elf/dwarf2-7.d
new file mode 100644 (file)
index 0000000..8782d6b
--- /dev/null
@@ -0,0 +1,19 @@
+#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.
diff --git a/gas/testsuite/gas/elf/dwarf2-7.s b/gas/testsuite/gas/elf/dwarf2-7.s
new file mode 100644 (file)
index 0000000..e96e64e
--- /dev/null
@@ -0,0 +1,36 @@
+/* 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
diff --git a/gas/testsuite/gas/elf/dwarf2-8.d b/gas/testsuite/gas/elf/dwarf2-8.d
new file mode 100644 (file)
index 0000000..455079d
--- /dev/null
@@ -0,0 +1,5 @@
+#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*-*
diff --git a/gas/testsuite/gas/elf/dwarf2-8.l b/gas/testsuite/gas/elf/dwarf2-8.l
new file mode 100644 (file)
index 0000000..60c73e5
--- /dev/null
@@ -0,0 +1,2 @@
+[^:]*: Assembler messages:
+[^:]*:25: Error: view number mismatch
diff --git a/gas/testsuite/gas/elf/dwarf2-8.s b/gas/testsuite/gas/elf/dwarf2-8.s
new file mode 100644 (file)
index 0000000..228063c
--- /dev/null
@@ -0,0 +1,27 @@
+/* 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
diff --git a/gas/testsuite/gas/elf/dwarf2-9.d b/gas/testsuite/gas/elf/dwarf2-9.d
new file mode 100644 (file)
index 0000000..ebf11cb
--- /dev/null
@@ -0,0 +1,5 @@
+#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*-*
diff --git a/gas/testsuite/gas/elf/dwarf2-9.l b/gas/testsuite/gas/elf/dwarf2-9.l
new file mode 100644 (file)
index 0000000..fb44774
--- /dev/null
@@ -0,0 +1,2 @@
+[^:]*: Assembler messages:
+[^:]*.* Error: view number mismatch
diff --git a/gas/testsuite/gas/elf/dwarf2-9.s b/gas/testsuite/gas/elf/dwarf2-9.s
new file mode 100644 (file)
index 0000000..afc2019
--- /dev/null
@@ -0,0 +1,32 @@
+/* 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
index 6b2b31a04ef4cde5d3b00f834d04ccebb5b76f9c..c04c74b958adc05ecb439072bc2e60c484cd05fd 100644 (file)
@@ -220,6 +220,20 @@ if { [is_elf_format] } then {
     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"
index ceebb3f108af1cd36c429574ec2d79789986536b..bfd4837422db142ead421cbe88c425f0c6c4c472 100644 (file)
@@ -97,7 +97,7 @@ Raw dump of debug contents of section .z?debug_line:
   \[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
 
index f4c110d52f061267318bb86d5493e7597b3163ee..0a2a092e0df1429b535c836b38c5c7e6b1d94120 100644 (file)
@@ -98,7 +98,7 @@ Raw dump of debug contents of section .debug_line:
   \[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
 
index c4e5c6f4881193193fd592407a60e76f1561f1ab..fc0f861eb743f514453a9560684a6ceecbda065d 100644 (file)
@@ -7,5 +7,5 @@ Raw dump of debug contents of section \.z?debug_line:
   \[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
index d86f434fdd43bf2740d7b0ac9b92ec0cb8a6f3d4..65e0ce174feba1fa992dacdeb3225bf8c0150399 100644 (file)
@@ -8,7 +8,7 @@ Raw dump of debug contents of section \.debug_line:
   \[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
index e762b8316647de9da3d8d1061c8a5e7f80d0a105..8aa8c7356c3fedc9ce6cb1c47921fc7753f5ef07 100644 (file)
@@ -7,37 +7,37 @@ Raw dump of debug contents of section \.debug_line:
 #...
  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
 #...
index 9fe28ab5a77d9cf9aaa3609e6016547f3d5c4fa2..6aed5e75b9d725922811c445b872eda0953a3e45 100644 (file)
@@ -6,5 +6,5 @@ Raw dump of debug contents of section \.z?debug_line:
   \[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
index ed280a8dfea9b048da0420b61d00ec43ba553448..6176614b1e3bbb5341e5f3acbd18c1e4148291f0 100644 (file)
@@ -39,11 +39,11 @@ Raw dump of debug contents of section .debug_line:
  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
index 2e46e0456d82e20a8b78a92a3e1eeeb49379296e..0610a443f7deeae559765a064cf9f4b36371bb07 100644 (file)
@@ -12,6 +12,6 @@
 #   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
index 4e11106a1860b4f92d097cd8e3f9f5108b38defa..94fe7cd09874fea102c2a0358e9f1e183b5e6cc6 100644 (file)
@@ -44,9 +44,9 @@ Raw dump of debug contents of section \.debug_line:
   \[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
@@ -54,7 +54,7 @@ Raw dump of debug contents of section \.debug_line:
   \[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
index e148f25d9b723f8e1105778c3292a430b90a8555..9504be7c30c2fa73ffa2fb5aa47429a19d910f49 100644 (file)
@@ -39,11 +39,11 @@ Raw dump of debug contents of section .debug_line:
  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
index 23aedae972d86f18903434fa2ee7264448bd315e..1427feea1bedbbb040624a0e69a5137c57f07d7d 100644 (file)
@@ -45,9 +45,9 @@ Raw dump of debug contents of section \.debug_line:
   \[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
index 95b9e9c10b71b021b7d053548cb8322475ccf426..a4cc0005ad32d26b55425d3d416da5a394019828 100644 (file)
@@ -39,11 +39,11 @@ Raw dump of debug contents of section .debug_line:
  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
index 4d0c781f57c784ffbafe9b2458e41222a01f4bd0..9b023461d71cfce08fa95ba06e1a6d94a073d70d 100644 (file)
@@ -44,9 +44,9 @@ Raw dump of debug contents of section \.debug_line:
   \[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
@@ -54,7 +54,7 @@ Raw dump of debug contents of section \.debug_line:
   \[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
index 412e45bb7c314302d6a509adb98776a665bb4860..7356e3f90fccb2447fa4f23fead08c9f70b764f0 100644 (file)
@@ -44,9 +44,9 @@ Raw dump of debug contents of section \.debug_line:
   \[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
@@ -54,7 +54,7 @@ Raw dump of debug contents of section \.debug_line:
   \[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
index 1242cbf99856d393eb3e80e5ff58e8cfaecc6056..8efdbc506f411d9fb3b5278cf2ef894ec0f965ba 100644 (file)
@@ -465,6 +465,13 @@ cvt_frag_to_fill (segT sec ATTRIBUTE_UNUSED, fragS *fragP)
        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);
 
@@ -1904,6 +1911,8 @@ write_object_file (void)
   /* Relaxation has completed.  Freeze all syms.  */
   finalize_syms = 1;
 
+  dwarf2dbg_final_check ();
+
 #ifdef md_post_relax_hook
   md_post_relax_hook;
 #endif
index f8c07de6a4aa39e940055176f97b2865c1de12a8..4c155a90d18c9781802ebf5c3574f9646822515b 100644 (file)
 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