[gdb/symtab] Factor out have_complaint
authorTom de Vries <tdevries@suse.de>
Thu, 6 Oct 2022 12:53:07 +0000 (14:53 +0200)
committerTom de Vries <tdevries@suse.de>
Thu, 6 Oct 2022 12:53:07 +0000 (14:53 +0200)
After committing 8ba677d3560 ("[gdb/symtab] Don't complain about function
decls") I noticed that quite a bit of code in read_func_scope is used to decide
whether to issue the "cannot get low and high bounds for subprogram DIE at
$hex" complaint, which executes unnecessarily if we have the default
"set complaints 0".

Fix this by (NFC):
- factoring out new static function have_complaint from macro complaint, and
- using it to wrap the relevant code in read_func_scope.

Tested on x86_64-linux.

gdb/complaints.h
gdb/dwarf2/read.c

index 68c79bd6d0a1f99994805b976bca082d6ad1db88..02c8c2c558be6a9de966deb41529074a28322ae3 100644 (file)
@@ -31,6 +31,15 @@ extern void complaint_internal (const char *fmt, ...)
 
 extern int stop_whining;
 
+/* Return true if complaints are enabled.  This can be used to guard code
+   that is used only to decide whether to issue a complaint.  */
+
+static inline bool
+have_complaint ()
+{
+  return stop_whining > 0;
+}
+
 /* Register a complaint.  This is a macro around complaint_internal to
    avoid computing complaint's arguments when complaints are disabled.
    Running FMT via gettext [i.e., _(FMT)] can be quite expensive, for
@@ -38,7 +47,7 @@ extern int stop_whining;
 #define complaint(FMT, ...)                                    \
   do                                                           \
     {                                                          \
-      if (stop_whining > 0)                                    \
+      if (have_complaint ())                                   \
        complaint_internal (FMT, ##__VA_ARGS__);                \
     }                                                          \
   while (0)
index 8e42c0f4d8df0615e079ce973c1392e608312488..78f4cc1f60d9dd197cbc1e58e15011ec32b60061 100644 (file)
@@ -12043,20 +12043,23 @@ read_func_scope (struct die_info *die, struct dwarf2_cu *cu)
   if (dwarf2_get_pc_bounds (die, &lowpc, &highpc, cu, nullptr, nullptr)
       <= PC_BOUNDS_INVALID)
     {
-      attr = dwarf2_attr (die, DW_AT_external, cu);
-      bool external_p = attr != nullptr && attr->as_boolean ();
-      attr = dwarf2_attr (die, DW_AT_inline, cu);
-      bool inlined_p
-       = (attr != nullptr
-          && attr->is_nonnegative ()
-          && (attr->as_nonnegative () == DW_INL_inlined
-              || attr->as_nonnegative () == DW_INL_declared_inlined));
-      attr = dwarf2_attr (die, DW_AT_declaration, cu);
-      bool decl_p = attr != nullptr && attr->as_boolean ();
-      if (!external_p && !inlined_p && !decl_p)
-       complaint (_("cannot get low and high bounds "
-                    "for subprogram DIE at %s"),
-                  sect_offset_str (die->sect_off));
+      if (have_complaint ())
+       {
+         attr = dwarf2_attr (die, DW_AT_external, cu);
+         bool external_p = attr != nullptr && attr->as_boolean ();
+         attr = dwarf2_attr (die, DW_AT_inline, cu);
+         bool inlined_p
+           = (attr != nullptr
+              && attr->is_nonnegative ()
+              && (attr->as_nonnegative () == DW_INL_inlined
+                  || attr->as_nonnegative () == DW_INL_declared_inlined));
+         attr = dwarf2_attr (die, DW_AT_declaration, cu);
+         bool decl_p = attr != nullptr && attr->as_boolean ();
+         if (!external_p && !inlined_p && !decl_p)
+           complaint (_("cannot get low and high bounds "
+                        "for subprogram DIE at %s"),
+                      sect_offset_str (die->sect_off));
+       }
       return;
     }