OSDN Git Service

* common.opt (gdwarf-): Accept a version number.
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 12 Jun 2009 03:08:11 +0000 (03:08 +0000)
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 12 Jun 2009 03:08:11 +0000 (03:08 +0000)
* doc/invoke.texi (gdwarf-): Update docs.
* opth-gen.awk: Special case -gdwarf+ to OPT_gdwarfplus.
* opts.c (common_handle_option) [OPT_gdwarf_]: Verify dwarf
version level, and record it.

* dwarf2.h (DW_CIE_VERSION): Remove.
* dwarf2out.c (DWARF_VERSION): Remove.
(add_fde_cfi): Skip DW_CFA_set_loc addition for dwarf3.
(output_call_frame_info): Use CIE version 3 for dwarf3,
or if the return register column is out of range for version 1.
(dwarf_stack_op_name): Add all dwarf3 values.
(DEBUG_PUBTYPES_SECTION): New.
(size_of_die) [dw_val_class_die_ref]: Handle DW_FORM_ref_addr
encoding change for dwarf3.
(output_die) [dw_val_class_die_ref]: Likewise.
(output_compilation_unit_header): Emit correct version for dwarf3.
(output_line_info): Likewise.
(output_pubnames): Update for DWARF_VERSION removal.
(output_aranges): Likewise.
(gen_subprogram_die): Emit DW_OP_call_frame_cfa if emitting dwarf3.
(dwarf2out_init): Don't ifdef DEBUG_PUBTYPES_SECTION.
(dwarf2out_finish): Likewise.

ada/
* gcc-interface/misc.c (gnat_handle_option): Rename
OPT_gdwarf_ to OPT_gdwarfplus.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@148408 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ada/ChangeLog
gcc/ada/gcc-interface/misc.c
gcc/common.opt
gcc/doc/invoke.texi
gcc/dwarf2.h
gcc/dwarf2out.c
gcc/opth-gen.awk
gcc/opts.c

index 8f29f5b..b3a38fa 100644 (file)
@@ -1,3 +1,8 @@
+2009-06-11  Richard Henderson  <rth@redhat.com>
+
+       * gcc-interface/misc.c (gnat_handle_option): Rename
+       OPT_gdwarf_ to OPT_gdwarfplus.
+
 2009-06-11  Ed Schonberg  <schonberg@adacore.com>
 
        * sem_attr.adb (Resolve_Attribute, case 'access): Add missing
        * gcc-interface/Make-lang.in: Fix formatting.
 
 2009-06-01  Olivier Hainque  <hainque@adacore.com>
-            Eric Botcazou  <ebotcazou@adacore.com>
+           Eric Botcazou  <ebotcazou@adacore.com>
        
        * gcc-interface/utils.c (convert) <CONSTRUCTOR case>: When converting
        to the packable version of the type, clear TREE_STATIC/TREE_CONSTANT
        as a static constant any more.
 
 2009-06-01  Olivier Hainque  <hainque@adacore.com>
-            Eric Botcazou  <ebotcazou@adacore.com>
+           Eric Botcazou  <ebotcazou@adacore.com>
        
        * gcc-interface/utils2.c (gnat_build_constructor): Factor
        out code.  Use initializer_constant_valid_for_bitfield_p and
        GPS.
 
        * sinput.ads, sinput.adb (Expr_First_Char): New function
-        (Expr_Last_Char): New function
+       (Expr_Last_Char): New function
 
 2009-05-06  Sergey Rybin  <rybin@adacore.com>
 
 
        * prj-proc.adb, prj.adb, prj.ads, prj-nmsc.adb, prj-env.adb
        (Source_Iterator): new type.
-        This removes the need for having the sources on three different
-        lists at the project tree, project and language level. They are now
-        on a single list.
+       This removes the need for having the sources on three different
+       lists at the project tree, project and language level. They are now
+       on a single list.
 
 2009-04-24  Emmanuel Briot  <briot@adacore.com>
 
        efficient.
 
 2009-04-24  Richard Kenner  <kenner@vlsi1.ultra.nyu.edu>
-            Thomas Quinot  <quinot@adacore.com>
+           Thomas Quinot  <quinot@adacore.com>
 
        * fe.h (Set_Identifier_Casing): Add const to second parameter.
        * gcc-interface/misc.c (internal_error_function): Make copy of return
 
 2009-04-09  Robert Dewar  <dewar@adacore.com>
 
-        * checks.adb:
-        (Insert_Valid_Check): Avoid unnecessary generation of junk declaration
-        when no invalid values exist, Avoid duplicate read of atomic variable.
+       * checks.adb:
+       (Insert_Valid_Check): Avoid unnecessary generation of junk declaration
+       when no invalid values exist, Avoid duplicate read of atomic variable.
 
-        * cstand.adb (Build_Signed_Integer_Type): Set Is_Known_Valid
-        (Standard_Unsigned): Set Is_Known_Valid
+       * cstand.adb (Build_Signed_Integer_Type): Set Is_Known_Valid
+       (Standard_Unsigned): Set Is_Known_Valid
 
-        * sem_ch3.adb (Analyze_Subtype_Declaration): Copy Is_Known_Valid on
+       * sem_ch3.adb (Analyze_Subtype_Declaration): Copy Is_Known_Valid on
        subtype declaration if no constraint.
-        (Set_Modular_Size): Set Is_Known_Valid if appropriate
-        (Build_Derived_Numeric_Type): Copy Is_Known_Valid if no constraint
+       (Set_Modular_Size): Set Is_Known_Valid if appropriate
+       (Build_Derived_Numeric_Type): Copy Is_Known_Valid if no constraint
 
 2009-04-09  Robert Dewar  <dewar@adacore.com>
 
index 6a601bb..63d7805 100644 (file)
@@ -272,8 +272,8 @@ gnat_handle_option (size_t scode, const char *arg, int value)
       gnat_argc++;
       break;
 
-    case OPT_gdwarf_:
-      gnat_dwarf_extensions ++;
+    case OPT_gdwarfplus:
+      gnat_dwarf_extensions = 1;
       break;
 
     default:
index f724890..2006a5b 100644 (file)
@@ -1410,12 +1410,12 @@ Common JoinedOrMissing
 Generate debug information in default format
 
 gcoff
-Common JoinedOrMissing Negative(gdwarf-2)
+Common JoinedOrMissing Negative(gdwarf-)
 Generate debug information in COFF format
 
-gdwarf-2
-Common JoinedOrMissing Negative(gstabs)
-Generate debug information in DWARF v2 format
+gdwarf-
+Common Joined UInteger Var(dwarf_version) Init(2) Negative(gstabs)
+Generate debug information in DWARF v2 (or later) format
 
 ggdb
 Common JoinedOrMissing
index 8109cf3..4b1ca70 100644 (file)
@@ -310,7 +310,7 @@ Objective-C and Objective-C++ Dialects}.
 -frandom-seed=@var{string} -fsched-verbose=@var{n} @gol
 -fsel-sched-verbose -fsel-sched-dump-cfg -fsel-sched-pipelining-verbose @gol
 -ftest-coverage  -ftime-report -fvar-tracking @gol
--g  -g@var{level}  -gtoggle  -gcoff  -gdwarf-2 @gol
+-g  -g@var{level}  -gtoggle  -gcoff  -gdwarf-@var{version} @gol
 -ggdb  -gstabs  -gstabs+  -gvms  -gxcoff  -gxcoff+ @gol
 -fno-merge-debug-strings -fno-dwarf2-cfi-asm @gol
 -fdebug-prefix-map=@var{old}=@var{new} @gol
@@ -4344,13 +4344,14 @@ use of these extensions is likely to make other debuggers crash or
 refuse to read the program, and may cause assemblers other than the GNU
 assembler (GAS) to fail with an error.
 
-@item -gdwarf-2
-@opindex gdwarf-2
-Produce debugging information in DWARF version 2 format (if that is
-supported).  This is the format used by DBX on IRIX 6.  With this
-option, GCC uses features of DWARF version 3 when they are useful;
-version 3 is upward compatible with version 2, but may still cause
-problems for older debuggers.
+@item -gdwarf-@var{version}
+@opindex gdwarf-@var{version}
+Produce debugging information in DWARF format (if that is
+supported).  This is the format used by DBX on IRIX 6.  The value
+of @var{version} may be either 2 or 3; the default version is 2.
+
+Note that with DWARF version 2 some ports require, and will always
+use, some non-conflicting DWARF 3 extensions in the unwind tables.
 
 @item -gvms
 @opindex gvms
@@ -4384,7 +4385,7 @@ debug information in version 1 of the DWARF format (which is very
 different from version 2), and it would have been too confusing.  That
 debug format is long obsolete, but the option cannot be changed now.
 Instead use an additional @option{-g@var{level}} option to change the
-debug level for DWARF2.
+debug level for DWARF.
 
 @item -gtoggle
 @opindex gtoggle
index 1b3a397..d106b67 100644 (file)
@@ -782,7 +782,6 @@ enum dwarf_call_frame_info
 
 #define DW_CIE_ID        0xffffffff
 #define DW64_CIE_ID      0xffffffffffffffffULL
-#define DW_CIE_VERSION   1
 
 #define DW_CFA_extended   0
 
index 2483a7b..bbd763a 100644 (file)
@@ -317,8 +317,6 @@ dw_fde_node;
 #define DWARF_INITIAL_LENGTH_SIZE (DWARF_OFFSET_SIZE == 4 ? 4 : 12)
 #endif
 
-#define DWARF_VERSION 2
-
 /* Round SIZE up to the nearest BOUNDARY.  */
 #define DWARF_ROUND(SIZE,BOUNDARY) \
   ((((SIZE) + (BOUNDARY) - 1) / (BOUNDARY)) * (BOUNDARY))
@@ -749,50 +747,51 @@ add_fde_cfi (const char *label, dw_cfi_ref cfi)
 
          gcc_assert (fde != NULL);
 
-         /* We still have to add the cfi to the list so that
-            lookup_cfa works later on.  When -g2 and above we
-            even need to force emitting of CFI labels and
-            add to list a DW_CFA_set_loc for convert_cfa_to_fb_loc_list
-            purposes.  */
-         switch (cfi->dw_cfi_opc)
+         /* We still have to add the cfi to the list so that lookup_cfa
+            works later on.  When -g2 and above we even need to force
+            emitting of CFI labels and add to list a DW_CFA_set_loc for
+            convert_cfa_to_fb_loc_list purposes.  If we're generating
+            DWARF3 output we use DW_OP_call_frame_cfa and so don't use
+            convert_cfa_to_fb_loc_list.  */
+         if (dwarf_version == 2
+             && debug_info_level > DINFO_LEVEL_TERSE
+             && (write_symbols == DWARF2_DEBUG
+                 || write_symbols == VMS_AND_DWARF2_DEBUG))
            {
-           case DW_CFA_def_cfa_offset:
-           case DW_CFA_def_cfa_offset_sf:
-           case DW_CFA_def_cfa_register:
-           case DW_CFA_def_cfa:
-           case DW_CFA_def_cfa_sf:
-           case DW_CFA_def_cfa_expression:
-           case DW_CFA_restore_state:
-             if (write_symbols != DWARF2_DEBUG
-                 && write_symbols != VMS_AND_DWARF2_DEBUG)
-               break;
-             if (debug_info_level <= DINFO_LEVEL_TERSE)
-               break;
-
-             if (*label == 0 || strcmp (label, "<do not output>") == 0)
-               label = dwarf2out_cfi_label (true);
-
-             if (fde->dw_fde_current_label == NULL
-                 || strcmp (label, fde->dw_fde_current_label) != 0)
+             switch (cfi->dw_cfi_opc)
                {
-                 dw_cfi_ref xcfi;
-
-                 label = xstrdup (label);
-
-                 /* Set the location counter to the new label.  */
-                 xcfi = new_cfi ();
-                 /* It doesn't metter whether DW_CFA_set_loc
-                    or DW_CFA_advance_loc4 is added here, those aren't
-                    emitted into assembly, only looked up by
-                    convert_cfa_to_fb_loc_list.  */
-                 xcfi->dw_cfi_opc = DW_CFA_set_loc;
-                 xcfi->dw_cfi_oprnd1.dw_cfi_addr = label;
-                 add_cfi (&fde->dw_fde_cfi, xcfi);
-                 fde->dw_fde_current_label = label;
-               }
-             break;
-           default:
-             break;
+               case DW_CFA_def_cfa_offset:
+               case DW_CFA_def_cfa_offset_sf:
+               case DW_CFA_def_cfa_register:
+               case DW_CFA_def_cfa:
+               case DW_CFA_def_cfa_sf:
+               case DW_CFA_def_cfa_expression:
+               case DW_CFA_restore_state:
+                 if (*label == 0 || strcmp (label, "<do not output>") == 0)
+                   label = dwarf2out_cfi_label (true);
+
+                 if (fde->dw_fde_current_label == NULL
+                     || strcmp (label, fde->dw_fde_current_label) != 0)
+                   {
+                     dw_cfi_ref xcfi;
+
+                     label = xstrdup (label);
+
+                     /* Set the location counter to the new label.  */
+                     xcfi = new_cfi ();
+                     /* It doesn't metter whether DW_CFA_set_loc
+                        or DW_CFA_advance_loc4 is added here, those aren't
+                        emitted into assembly, only looked up by
+                        convert_cfa_to_fb_loc_list.  */
+                     xcfi->dw_cfi_opc = DW_CFA_set_loc;
+                     xcfi->dw_cfi_oprnd1.dw_cfi_addr = label;
+                     add_cfi (&fde->dw_fde_cfi, xcfi);
+                     fde->dw_fde_current_label = label;
+                   }
+                 break;
+               default:
+                 break;
+               }
            }
 
          output_cfi_directive (cfi);
@@ -3197,6 +3196,7 @@ output_call_frame_info (int for_eh)
   int per_encoding = DW_EH_PE_absptr;
   int lsda_encoding = DW_EH_PE_absptr;
   int return_reg;
+  int dw_cie_version;
 
   /* Don't emit a CIE if there won't be any FDEs.  */
   if (fde_table_in_use == 0)
@@ -3277,7 +3277,14 @@ output_call_frame_info (int for_eh)
                       (for_eh ? 0 : DWARF_CIE_ID),
                       "CIE Identifier Tag");
 
-  dw2_asm_output_data (1, DW_CIE_VERSION, "CIE Version");
+  /* Use the CIE version 3 for DWARF3; allow DWARF2 to continue to
+     use CIE version 1, unless that would produce incorrect results
+     due to overflowing the return register column.  */
+  return_reg = DWARF2_FRAME_REG_OUT (DWARF_FRAME_RETURN_COLUMN, for_eh);
+  dw_cie_version = 1;
+  if (return_reg >= 256 || dwarf_version > 2)
+    dw_cie_version = 3;
+  dw2_asm_output_data (1, dw_cie_version, "CIE Version");
 
   augmentation[0] = 0;
   augmentation_size = 0;
@@ -3349,8 +3356,7 @@ output_call_frame_info (int for_eh)
   dw2_asm_output_data_sleb128 (DWARF_CIE_DATA_ALIGNMENT,
                               "CIE Data Alignment Factor");
 
-  return_reg = DWARF2_FRAME_REG_OUT (DWARF_FRAME_RETURN_COLUMN, for_eh);
-  if (DW_CIE_VERSION == 1)
+  if (dw_cie_version == 1)
     dw2_asm_output_data (1, return_reg, "CIE RA Column");
   else
     dw2_asm_output_data_uleb128 (return_reg, "CIE RA Column");
@@ -4187,6 +4193,7 @@ dwarf_stack_op_name (unsigned int op)
       return "DW_OP_xderef_size";
     case DW_OP_nop:
       return "DW_OP_nop";
+
     case DW_OP_push_object_address:
       return "DW_OP_push_object_address";
     case DW_OP_call2:
@@ -4195,10 +4202,20 @@ dwarf_stack_op_name (unsigned int op)
       return "DW_OP_call4";
     case DW_OP_call_ref:
       return "DW_OP_call_ref";
+    case DW_OP_form_tls_address:
+      return "DW_OP_form_tls_address";
+    case DW_OP_call_frame_cfa:
+      return "DW_OP_call_frame_cfa";
+    case DW_OP_bit_piece:
+      return "DW_OP_bit_piece";
+
     case DW_OP_GNU_push_tls_address:
       return "DW_OP_GNU_push_tls_address";
     case DW_OP_GNU_uninit:
       return "DW_OP_GNU_uninit";
+    case DW_OP_GNU_encoded_addr:
+      return "DW_OP_GNU_encoded_addr";
+
     default:
       return "OP_<unknown>";
     }
@@ -5617,6 +5634,9 @@ static int maybe_emit_file (struct dwarf_file_data *fd);
 #ifndef DEBUG_PUBNAMES_SECTION
 #define DEBUG_PUBNAMES_SECTION ".debug_pubnames"
 #endif
+#ifndef DEBUG_PUBTYPES_SECTION
+#define DEBUG_PUBTYPES_SECTION ".debug_pubtypes"
+#endif
 #ifndef DEBUG_STR_SECTION
 #define DEBUG_STR_SECTION      ".debug_str"
 #endif
@@ -7869,7 +7889,6 @@ build_abbrev_table (dw_die_ref die)
        && AT_ref (a)->die_mark == 0)
       {
        gcc_assert (AT_ref (a)->die_symbol);
-
        set_AT_ref_external (a, 1);
       }
 
@@ -7997,7 +8016,9 @@ size_of_die (dw_die_ref die)
          size += 1;
          break;
        case dw_val_class_die_ref:
-         if (AT_ref_external (a))
+         /* In DWARF2, DW_FORM_ref_addr is sized by target address length,
+            whereas in DWARF3 it's always sized as an offset.  */
+         if (AT_ref_external (a) && dwarf_version == 2)
            size += DWARF2_ADDR_SIZE;
          else
            size += DWARF_OFFSET_SIZE;
@@ -8526,10 +8547,17 @@ output_die (dw_die_ref die)
          if (AT_ref_external (a))
            {
              char *sym = AT_ref (a)->die_symbol;
+             int size;
 
              gcc_assert (sym);
-             dw2_asm_output_offset (DWARF2_ADDR_SIZE, sym, debug_info_section,
-                                    "%s", name);
+
+             /* In DWARF2, DW_FORM_ref_addr is sized by target address
+                length, whereas in DWARF3 it's always sized as an offset.  */
+             if (dwarf_version == 2)
+               size = DWARF2_ADDR_SIZE;
+             else
+               size = DWARF_OFFSET_SIZE;
+             dw2_asm_output_offset (size, sym, debug_info_section, "%s", name);
            }
          else
            {
@@ -8608,7 +8636,7 @@ output_compilation_unit_header (void)
   dw2_asm_output_data (DWARF_OFFSET_SIZE,
                       next_die_offset - DWARF_INITIAL_LENGTH_SIZE,
                       "Length of Compilation Unit Info");
-  dw2_asm_output_data (2, DWARF_VERSION, "DWARF version number");
+  dw2_asm_output_data (2, dwarf_version, "DWARF version number");
   dw2_asm_output_offset (DWARF_OFFSET_SIZE, abbrev_section_label,
                         debug_abbrev_section,
                         "Offset Into Abbrev. Section");
@@ -8689,7 +8717,6 @@ add_pubname_string (const char *str, dw_die_ref die)
 static void
 add_pubname (tree decl, dw_die_ref die)
 {
-
   if (TREE_PUBLIC (decl))
     add_pubname_string (dwarf2_name (decl, 1), die);
 }
@@ -8749,7 +8776,8 @@ output_pubnames (VEC (pubname_entry, gc) * names)
   else
     dw2_asm_output_data (DWARF_OFFSET_SIZE, pubnames_length,
                         "Length of Public Type Names Info");
-  dw2_asm_output_data (2, DWARF_VERSION, "DWARF Version");
+  /* Version number for pubnames/pubtypes is still 2, even in DWARF3.  */
+  dw2_asm_output_data (2, 2, "DWARF Version");
   dw2_asm_output_offset (DWARF_OFFSET_SIZE, debug_info_section_label,
                         debug_info_section,
                         "Offset of Compilation Unit Info");
@@ -8811,7 +8839,8 @@ output_aranges (void)
       "Initial length escape value indicating 64-bit DWARF extension");
   dw2_asm_output_data (DWARF_OFFSET_SIZE, aranges_length,
                       "Length of Address Ranges Info");
-  dw2_asm_output_data (2, DWARF_VERSION, "DWARF Version");
+  /* Version number for aranges is still 2, even in DWARF3.  */
+  dw2_asm_output_data (2, 2, "DWARF Version");
   dw2_asm_output_offset (DWARF_OFFSET_SIZE, debug_info_section_label,
                         debug_info_section,
                         "Offset of Compilation Unit Info");
@@ -9356,7 +9385,7 @@ output_line_info (void)
                        "Length of Source Line Info");
   ASM_OUTPUT_LABEL (asm_out_file, l1);
 
-  dw2_asm_output_data (2, DWARF_VERSION, "DWARF Version");
+  dw2_asm_output_data (2, dwarf_version, "DWARF Version");
   dw2_asm_output_delta (DWARF_OFFSET_SIZE, p2, p1, "Prolog Length");
   ASM_OUTPUT_LABEL (asm_out_file, p1);
 
@@ -14079,17 +14108,19 @@ gen_subprogram_die (tree decl, dw_die_ref context_die)
         (3) We can at least reuse the code inspection and interpretation
         code that determines the CFA position at various points in the
         function.  */
-      /* ??? Use some command-line or configury switch to enable the use
-        of dwarf3 DW_OP_call_frame_cfa.  At present there are no dwarf
-        consumers that understand it; fall back to "pure" dwarf2 and
-        convert the CFA data into a location list.  */
-      {
-       dw_loc_list_ref list = convert_cfa_to_fb_loc_list (cfa_fb_offset);
-       if (list->dw_loc_next)
-         add_AT_loc_list (subr_die, DW_AT_frame_base, list);
-       else
-         add_AT_loc (subr_die, DW_AT_frame_base, list->expr);
-      }
+      if (dwarf_version >= 3)
+       {
+         dw_loc_descr_ref op = new_loc_descr (DW_OP_call_frame_cfa, 0, 0);
+         add_AT_loc (subr_die, DW_AT_frame_base, op);
+       }
+      else
+       {
+         dw_loc_list_ref list = convert_cfa_to_fb_loc_list (cfa_fb_offset);
+         if (list->dw_loc_next)
+           add_AT_loc_list (subr_die, DW_AT_frame_base, list);
+         else
+           add_AT_loc (subr_die, DW_AT_frame_base, list->expr);
+       }
 
       /* Compute a displacement from the "steady-state frame pointer" to
         the CFA.  The former is what all stack slots and argument slots
@@ -16457,10 +16488,8 @@ dwarf2out_init (const char *filename ATTRIBUTE_UNUSED)
                                   SECTION_DEBUG, NULL);
   debug_pubnames_section = get_section (DEBUG_PUBNAMES_SECTION,
                                        SECTION_DEBUG, NULL);
-#ifdef DEBUG_PUBTYPES_SECTION
   debug_pubtypes_section = get_section (DEBUG_PUBTYPES_SECTION,
                                        SECTION_DEBUG, NULL);
-#endif
   debug_str_section = get_section (DEBUG_STR_SECTION,
                                   DEBUG_STR_SECTION_FLAGS, NULL);
   debug_ranges_section = get_section (DEBUG_RANGES_SECTION,
@@ -17092,14 +17121,15 @@ dwarf2out_finish (const char *filename)
       output_pubnames (pubname_table);
     }
 
-#ifdef DEBUG_PUBTYPES_SECTION
   /* Output public types table if necessary.  */
+  /* ??? Only defined by DWARF3, but emitted by Darwin for DWARF2.
+     It shouldn't hurt to emit it always, since pure DWARF2 consumers
+     simply won't look for the section.  */
   if (!VEC_empty (pubname_entry, pubtype_table))
     {
       switch_to_section (debug_pubtypes_section);
       output_pubnames (pubtype_table);
     }
-#endif
 
   /* Output the address range information.  We only put functions in the arange
      table, so don't write it out if we don't have any.  */
index ecccbdd..fb262bd 100644 (file)
@@ -333,6 +333,8 @@ for (i = 0; i < n_opts; i++) {
        enum = "OPT_" opts[i]
        if (opts[i] == "finline-limit=" || opts[i] == "Wlarger-than=")
                enum = enum "eq"
+       if (opts[i] == "gdwarf+")
+               enum = "OPT_gdwarfplus"
        gsub ("[^A-Za-z0-9]", "_", enum)
 
        # If this switch takes joined arguments, back-chain all
@@ -348,7 +350,7 @@ for (i = 0; i < n_opts; i++) {
                }
        }
 
-       s = substr("                                     ", length (opts[i]))
+       s = substr("                                         ", length (enum))
        if (i + 1 == n_opts)
                comma = ""
 
index 424250e..210140c 100644 (file)
@@ -2033,8 +2033,12 @@ common_handle_option (size_t scode, const char *arg, int value,
       set_debug_level (SDB_DEBUG, false, arg);
       break;
 
-    case OPT_gdwarf_2:
-      set_debug_level (DWARF2_DEBUG, false, arg);
+    case OPT_gdwarf_:
+      if (value < 2 || value > 3)
+       error ("dwarf version %d is not supported", value);
+      else
+       dwarf_version = value;
+      set_debug_level (DWARF2_DEBUG, false, "");
       break;
 
     case OPT_ggdb: