[gas] Emit v2 .debug_line for -gdwarf-2
authorTom de Vries <tdevries@suse.de>
Wed, 1 Feb 2023 00:13:37 +0000 (01:13 +0100)
committerTom de Vries <tdevries@suse.de>
Wed, 1 Feb 2023 00:13:37 +0000 (01:13 +0100)
Currently, when using -gdwarf-2, gas emits a v3 .debug_line contribution.

Fix this by emitting a v2 .debug_line contribution instead.

gas/ChangeLog:

2023-01-31  Tom de Vries  <tdevries@suse.de>

PR 23941
* dwarf2dbg.c (DWARF2_LINE_VERSION): Set to 2 for -gdwarf-2.
(DWARF2_LINE_OPCODE_BASE): Handle DWARF2_LINE_VERSION == 2.
(dwarf2_directive_loc): Bump dwarf_level when encountering
v3 .loc options.
(out_debug_line): Don't output v3 standard opcodes for v2.
* testsuite/gas/i386/debug1.d: Update.
* testsuite/gas/i386/dwarf2-line-1.d: Update.
* testsuite/gas/i386/dwarf2-line-4.d: Update.

gas/dwarf2dbg.c
gas/testsuite/gas/i386/debug1.d
gas/testsuite/gas/i386/dwarf2-line-1.d
gas/testsuite/gas/i386/dwarf2-line-4.d

index c7d9e8ef72fe0a1eafaa8fb705c99a0c457469d5..b54050c644238b12eae03e3fd762fc85c4323c24 100644 (file)
@@ -86,9 +86,9 @@
 #define DWARF2_ARANGES_VERSION 2
 #endif
 
-/* This implementation outputs version 3 .debug_line information.  */
+/* The .debug_line version is the same as the .debug_info version.  */
 #ifndef DWARF2_LINE_VERSION
-#define DWARF2_LINE_VERSION (dwarf_level > 3 ? dwarf_level : 3)
+#define DWARF2_LINE_VERSION DWARF2_VERSION
 #endif
 
 /* The .debug_rnglists has only been in DWARF version 5. */
    Note: If you want to change this, you'll have to update the
    "standard_opcode_lengths" table that is emitted below in
    out_debug_line().  */
-#define DWARF2_LINE_OPCODE_BASE                13
+#define DWARF2_LINE_OPCODE_BASE                (DWARF2_LINE_VERSION == 2 ? 10 : 13)
 
 #ifndef DWARF2_LINE_BASE
   /* Minimum line offset in a special line info. opcode.  This value
@@ -1328,11 +1328,15 @@ dwarf2_directive_loc (int dummy ATTRIBUTE_UNUSED)
        }
       else if (strcmp (p, "prologue_end") == 0)
        {
+         if (dwarf_level < 3)
+           dwarf_level = 3;
          current.flags |= DWARF2_FLAG_PROLOGUE_END;
          *input_line_pointer = c;
        }
       else if (strcmp (p, "epilogue_begin") == 0)
        {
+         if (dwarf_level < 3)
+           dwarf_level = 3;
          current.flags |= DWARF2_FLAG_EPILOGUE_BEGIN;
          *input_line_pointer = c;
        }
@@ -1352,6 +1356,8 @@ dwarf2_directive_loc (int dummy ATTRIBUTE_UNUSED)
        }
       else if (strcmp (p, "isa") == 0)
        {
+         if (dwarf_level < 3)
+           dwarf_level = 3;
          (void) restore_line_pointer (c);
          value = get_absolute_expression ();
          if (value >= 0)
@@ -2479,12 +2485,17 @@ out_debug_line (segT line_seg)
   out_byte (0);                        /* DW_LNS_set_basic_block */
   out_byte (0);                        /* DW_LNS_const_add_pc */
   out_byte (1);                        /* DW_LNS_fixed_advance_pc */
-  out_byte (0);                        /* DW_LNS_set_prologue_end */
-  out_byte (0);                        /* DW_LNS_set_epilogue_begin */
-  out_byte (1);                        /* DW_LNS_set_isa */
-  /* We have emitted 12 opcode lengths, so make that this
-     matches up to the opcode base value we have been using.  */
-  gas_assert (DWARF2_LINE_OPCODE_BASE == 13);
+  if (DWARF2_LINE_VERSION >= 3)
+    {
+      out_byte (0);                    /* DW_LNS_set_prologue_end */
+      out_byte (0);                    /* DW_LNS_set_epilogue_begin */
+      out_byte (1);                    /* DW_LNS_set_isa */
+      /* We have emitted 12 opcode lengths, so make that this
+        matches up to the opcode base value we have been using.  */
+      gas_assert (DWARF2_LINE_OPCODE_BASE == 13);
+    }
+  else
+    gas_assert (DWARF2_LINE_OPCODE_BASE == 10);
 
   out_dir_and_file_list (line_seg, sizeof_offset);
 
index 4bed8754747584ff52f170f262019523f6f681ec..549ba66935c30e282ceb4617bc028fcfe2cae9dd 100644 (file)
@@ -6,13 +6,13 @@ Raw dump of debug contents of section \.z?debug_line:
 
   Offset:                      (0x)?0
   Length:                      .*
-  DWARF Version:               3
+  DWARF Version:               2
   Prologue Length:             .*
   Minimum Instruction Length:  1
   Initial value of 'is_stmt':  1
   Line Base:                   -5
   Line Range:                  14
-  Opcode Base:                 13
+  Opcode Base:                 10
 
  Opcodes:
   Opcode 1 has 0 args
@@ -24,9 +24,6 @@ Raw dump of debug contents of section \.z?debug_line:
   Opcode 7 has 0 args
   Opcode 8 has 0 args
   Opcode 9 has 1 arg
-  Opcode 10 has 0 args
-  Opcode 11 has 0 args
-  Opcode 12 has 1 arg
 
  The Directory Table \(offset 0x.*\):
   .*
index d9baafda26d9a308c08704557660ba9c3d2864b6..1d9592d8c65523b6b4713003ef58604f6f16415c 100644 (file)
@@ -6,13 +6,13 @@ Raw dump of debug contents of section \.z?debug_line:
 
   Offset:                      (0x)?0
   Length:                      .*
-  DWARF Version:               3
+  DWARF Version:               2
   Prologue Length:             .*
   Minimum Instruction Length:  1
   Initial value of 'is_stmt':  1
   Line Base:                   -5
   Line Range:                  14
-  Opcode Base:                 13
+  Opcode Base:                 10
 
  Opcodes:
   Opcode 1 has 0 args
@@ -24,9 +24,6 @@ Raw dump of debug contents of section \.z?debug_line:
   Opcode 7 has 0 args
   Opcode 8 has 0 args
   Opcode 9 has 1 arg
-  Opcode 10 has 0 args
-  Opcode 11 has 0 args
-  Opcode 12 has 1 arg
 
  The Directory Table \(offset 0x.*\):
   .*
index 6846ae21e9a79d2093c0d0988cc7c040a0036d9f..6b8fe5c04afad23c60f58c7a8001dad0621ed245 100644 (file)
@@ -6,13 +6,13 @@ Raw dump of debug contents of section \.z?debug_line:
 
   Offset:                      (0x)?0
   Length:                      .*
-  DWARF Version:               3
+  DWARF Version:               2
   Prologue Length:             .*
   Minimum Instruction Length:  1
   Initial value of 'is_stmt':  1
   Line Base:                   -5
   Line Range:                  14
-  Opcode Base:                 13
+  Opcode Base:                 10
 
  Opcodes:
   Opcode 1 has 0 args
@@ -24,9 +24,6 @@ Raw dump of debug contents of section \.z?debug_line:
   Opcode 7 has 0 args
   Opcode 8 has 0 args
   Opcode 9 has 1 arg
-  Opcode 10 has 0 args
-  Opcode 11 has 0 args
-  Opcode 12 has 1 arg
 
  The Directory Table is empty\.