]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/complaints.h
Introduce thread-safe handling for complaints
[thirdparty/binutils-gdb.git] / gdb / complaints.h
CommitLineData
c906108c 1/* Definitions for complaint handling during symbol reading in GDB.
b9caf505 2
4a94e368 3 Copyright (C) 1990-2022 Free Software Foundation, Inc.
c906108c 4
c5aa993b 5 This file is part of GDB.
c906108c 6
c5aa993b
JM
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
a9762ec7 9 the Free Software Foundation; either version 3 of the License, or
c5aa993b 10 (at your option) any later version.
c906108c 11
c5aa993b
JM
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
c906108c 16
c5aa993b 17 You should have received a copy of the GNU General Public License
a9762ec7 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c
SS
19
20
21#if !defined (COMPLAINTS_H)
22#define COMPLAINTS_H
23
da632297
TT
24#include <unordered_set>
25
62d7ae92 26/* Helper for complaint. */
b98664d3
TT
27extern void complaint_internal (const char *fmt, ...)
28 ATTRIBUTE_PRINTF (1, 2);
62d7ae92 29
a00caa12
TT
30/* This controls whether complaints are emitted. */
31
32extern int stop_whining;
33
62d7ae92
PA
34/* Register a complaint. This is a macro around complaint_internal to
35 avoid computing complaint's arguments when complaints are disabled.
36 Running FMT via gettext [i.e., _(FMT)] can be quite expensive, for
37 example. */
b98664d3 38#define complaint(FMT, ...) \
62d7ae92
PA
39 do \
40 { \
62d7ae92 41 if (stop_whining > 0) \
b98664d3 42 complaint_internal (FMT, ##__VA_ARGS__); \
62d7ae92
PA
43 } \
44 while (0)
45
b9caf505 46/* Clear out / initialize all complaint counters that have ever been
5ca8c39f
TT
47 incremented. */
48
49extern void clear_complaints ();
b9caf505 50
da632297
TT
51/* A class that can handle calls to complaint from multiple threads.
52 When this is instantiated, it hooks into the complaint mechanism,
53 so the 'complaint' macro can continue to be used. When it is
54 destroyed, it issues all the complaints that have been stored. It
55 should only be instantiated in the main thread. */
56
57class complaint_interceptor
58{
59public:
60
61 complaint_interceptor ();
62 ~complaint_interceptor ();
63
64 DISABLE_COPY_AND_ASSIGN (complaint_interceptor);
65
66private:
67
68 /* The issued complaints. */
69 std::unordered_set<std::string> m_complaints;
70
71 /* The saved value of deprecated_warning_hook. */
72 void (*m_saved_warning_hook) (const char *, va_list)
73 ATTRIBUTE_FPTR_PRINTF(1,0);
74
75 /* A helper function that is used by the 'complaint' implementation
76 to issue a complaint. */
77 static void issue_complaint (const char *, va_list);
78
79 /* This object. Used by the static callback function. */
80 static complaint_interceptor *g_complaint_interceptor;
81};
c906108c 82
c5aa993b 83#endif /* !defined (COMPLAINTS_H) */