/* Definitions for complaint handling during symbol reading in GDB.

   Copyright (C) 1990-2025 Free Software Foundation, Inc.

   This file is part of GDB.

   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/>.  */

#ifndef GDB_COMPLAINTS_H
#define GDB_COMPLAINTS_H

#include "gdbsupport/scoped_restore.h"
#include "gdbsupport/unordered_set.h"

/* Helper for complaint.  */
extern void complaint_internal (const char *fmt, ...)
  ATTRIBUTE_PRINTF (1, 2);

/* This controls whether complaints are emitted.  */

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
   example.  */
#define complaint(FMT, ...)					\
  do								\
    {								\
      if (have_complaint ())					\
	complaint_internal (FMT, ##__VA_ARGS__);		\
    }								\
  while (0)

/* Clear out / initialize all complaint counters that have ever been
   incremented.  */

extern void clear_complaints ();

/* Type of collected complaints.  */

typedef gdb::unordered_set<std::string> complaint_collection;

/* A class that can handle calls to complaint from multiple threads.
   When this is instantiated, it hooks into the complaint mechanism,
   so the 'complaint' macro can continue to be used.  It collects all
   the complaints (and warnings) emitted while it is installed, and
   these can be retrieved before the object is destroyed.  This is
   intended for use from worker threads (though it will also work on
   the main thread).  Messages can be re-emitted on the main thread
   using re_emit_complaints, see below.  */

class complaint_interceptor final : public warning_hook_handler_type
{
public:

  complaint_interceptor ();
  ~complaint_interceptor () = default;

  DISABLE_COPY_AND_ASSIGN (complaint_interceptor);

  complaint_collection &&release ()
  {
    return std::move (m_complaints);
  }

private:

  /* The issued complaints.  */
  complaint_collection m_complaints;

  /* The saved value of g_complaint_interceptor.  */
  scoped_restore_tmpl<complaint_interceptor *> m_saved_complaint_interceptor;

  /* A helper function that is used by the 'complaint' implementation
     to issue a complaint.  */
  void warn (const char *, va_list) override
    ATTRIBUTE_PRINTF (2, 0);

  /* This object.  Used by the static callback function.  */
  static thread_local complaint_interceptor *g_complaint_interceptor;

  /* Object to initialise the warning hook.  */
  scoped_restore_warning_hook m_saved_warning_hook;
};

/* Re-emit complaints that were collected by complaint_interceptor.
   This can only be called on the main thread.  */

extern void re_emit_complaints (const complaint_collection &);

#endif /* GDB_COMPLAINTS_H */
