]> git.ipfire.org Git - thirdparty/elfutils.git/commitdiff
dwarflint: Add DW_LNE_set_discriminator check and clean unknown upcode warn.
authorMark Wielaard <mjw@redhat.com>
Sat, 2 Apr 2011 15:33:41 +0000 (17:33 +0200)
committerMark Wielaard <mjw@redhat.com>
Sat, 2 Apr 2011 15:33:41 +0000 (17:33 +0200)
Print unknown (extended) opcodes has hex values.
Add dwarf_line_extended_opcode_string.
New simple DW_LNE_set_discriminator check (not zero).

dwarflint/check_debug_line.cc
src/dwarfstrings.c
src/dwarfstrings.h

index b9d450f7914c1f84bc0f5fd9306b8772b6d31c93..4a21125c3fde3ab78cf5ef1e6b4506f80927cb84 100644 (file)
@@ -459,6 +459,25 @@ check_debug_line::check_debug_line (checkstack &stack, dwarflint &lint)
                      break;
                    }
 
+                 case DW_LNE_set_discriminator:
+                   {
+                     /* XXX Is there anything interesting we should
+                        check here?  */
+                     uint64_t disc;
+                     if (!checked_read_uleb128 (&sub_ctx, &disc, &where,
+                                                "set_discriminator operand"))
+                       goto skip;
+
+                     /* The discriminator is reset to zero on any
+                        sequence change.  So setting to zero is never
+                        necessary.  */
+                     if (disc == 0)
+                       wr_message (where, mc_line | mc_impact_1)
+                         << "DW_LNE_set_discriminator with zero operand."
+                         << std::endl;
+                     break;
+                   }
+
                  case DW_LNE_define_file:
                    {
                      const char *name;
@@ -490,7 +509,8 @@ check_debug_line::check_debug_line (checkstack &stack, dwarflint &lint)
                      default:
                        /* No we don't, emit a warning.  */
                        wr_message (where, mc_impact_2 | mc_line)
-                         << "unknown extended opcode #" << extended
+                         << "unknown extended opcode 0x"
+                         << std::hex << +extended << std::dec
                          << '.' << std::endl;
                      };
                  };
@@ -578,7 +598,8 @@ check_debug_line::check_debug_line (checkstack &stack, dwarflint &lint)
                default:
                  if (opcode < opcode_base)
                    wr_message (where, mc_impact_2 | mc_line)
-                     << "unknown standard opcode #" << opcode
+                     << "unknown standard opcode 0x"
+                     << std::hex << +opcode << std::dec
                      << '.' << std::endl;
                };
            };
@@ -591,8 +612,8 @@ check_debug_line::check_debug_line (checkstack &stack, dwarflint &lint)
                sprintf (buf, "operand #%d of DW_LNS_%s",
                         i, dwarf_line_standard_opcode_string (opcode));
              else
-               sprintf (buf, "operand #%d of extended opcode %d",
-                        i, extended);
+               sprintf (buf, "operand #%d of DW_LNE_%s",
+                        i, dwarf_line_extended_opcode_string (extended));
              if (!checked_read_uleb128 (&sub_ctx, &operand, &where, buf))
                goto skip;
            }
index 91933f013943479092a1fba43f96ea19d03f3f15..9826cf30a4edb9ec3b9aa827d1aa8e2e5bf93e76 100644 (file)
@@ -765,7 +765,6 @@ dwarf_locexpr_opcode_string (unsigned int code)
   return ret;
 }
 
-
 const char *
 dwarf_line_standard_opcode_string (unsigned int code)
 {
@@ -789,3 +788,27 @@ dwarf_line_standard_opcode_string (unsigned int code)
 
   return ret;
 }
+
+const char *
+dwarf_line_extended_opcode_string (unsigned int code)
+{
+  static const char *const known[] =
+    {
+#define ONE_KNOWN_DW_LNE(NAME, CODE) [CODE] = #NAME,
+      ALL_KNOWN_DW_LNE
+#undef ONE_KNOWN_DW_LNE
+    };
+
+  const char *ret = NULL;
+  if (likely (code < sizeof (known) / sizeof (known[0])))
+    ret = known[code];
+
+  if (ret == NULL)
+    {
+      static char buf[40];
+      snprintf (buf, sizeof buf, gettext ("unknown opcode %x"), code);
+      ret = buf;
+    }
+
+  return ret;
+}
index c77a19072b422b0c8d61e5f84ee1d3fb7ff3a1ec..16180f199026af893ff428fed39b71dd658a3951 100644 (file)
@@ -61,6 +61,8 @@ const char *dwarf_locexpr_opcode_string (unsigned int code);
 
 const char *dwarf_line_standard_opcode_string (unsigned int code);
 
+const char *dwarf_line_extended_opcode_string (unsigned int code);
+
 #ifdef __cplusplus
 }
 #endif