GCC Middle and Back End API Reference
output-spec.h
Go to the documentation of this file.
1/* Support for the DSL of -fdiagnostics-add-output= and
2 -fdiagnostics-set-output=.
3 Copyright (C) 2024-2025 Free Software Foundation, Inc.
4
5This file is part of GCC.
6
7GCC is free software; you can redistribute it and/or modify it under
8the terms of the GNU General Public License as published by the Free
9Software Foundation; either version 3, or (at your option) any later
10version.
11
12GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or
14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15for more details.
16
17You should have received a copy of the GNU General Public License
18along with GCC; see the file COPYING3. If not see
19<http://www.gnu.org/licenses/>. */
20
21#ifndef GCC_DIAGNOSTICS_OUTPUT_SPEC_H
22#define GCC_DIAGNOSTICS_OUTPUT_SPEC_H
23
24#include "diagnostics/sink.h"
26
27namespace diagnostics {
28namespace output_spec {
29
30class context;
31
32/* An abstract base class for schemes, and for client-specific keys. */
33
35{
36public:
43
44 /* Attempt to decode KEY and VALUE, storing the decoded value. */
45 virtual enum result
47 const std::string &key,
48 const std::string &value) = 0;
49
50 virtual void
52
53 enum result
54 parse_bool_value (const context &ctxt,
55 const std::string &key,
56 const std::string &value,
57 bool &out) const;
58
59 template <typename EnumType, size_t NumValues>
60 enum result
62 const std::string &key,
63 const std::string &value,
64 const std::array<std::pair<const char *, EnumType>,
65 NumValues> &value_names,
66 EnumType &out) const;
67};
68
69/* Abstract subclass for handling particular schemes and their keys. */
70
72{
73public:
74 scheme_handler (std::string scheme_name)
75 : m_scheme_name (std::move (scheme_name))
76 {}
77 virtual ~scheme_handler () {}
78
79 const std::string &get_scheme_name () const { return m_scheme_name; }
80
81 virtual std::unique_ptr<sink>
82 make_sink (const context &ctxt,
83 diagnostics::context &dc) = 0;
84
85private:
86 const std::string m_scheme_name;
87};
88
89/* An abstract base class for handling the DSL of -fdiagnostics-add-output=
90 and -fdiagnostics-set-output=. */
91
93{
94public:
95 std::unique_ptr<sink>
97
98 void
99 report_error (const char *gmsgid, ...) const
101
102 void
103 report_unknown_key (const std::string &key,
104 const scheme_handler &scheme) const;
105
106 void
107 report_missing_key (const std::string &key,
108 const std::string &scheme_name,
109 const char *metavar) const;
110
112 open_output_file (label_text &&filename) const;
113
114 const char *
115 get_option_name () const { return m_option_name; }
116
117 const char *
119
120 line_maps *
122
123 virtual ~context () {}
124
125 virtual void
126 report_error_va (const char *gmsgid, va_list *ap) const = 0;
127
128 virtual const char *
129 get_base_filename () const = 0;
130
131 bool
132 handle_kv (const std::string &key,
133 const std::string &value,
134 scheme_handler &scheme) const;
135
136protected:
137 context (const char *option_name,
138 const char *unparsed_spec,
139 key_handler *client_keys,
140 line_maps *affected_location_mgr)
141 : m_option_name (option_name),
142 m_unparsed_spec (unparsed_spec),
143 m_client_keys (client_keys),
144 m_affected_location_mgr (affected_location_mgr)
145 {
146 }
147
148 // e.g. "-fdiagnostics-add-output="
149 const char *m_option_name;
150
151 // e.g. "scheme:foo=bar,key=value"
152 const char *m_unparsed_spec;
153
154 // Optional borrowed ptr to client-specific keys
156
158};
159
160/* A subclass that implements reporting errors via a diagnostics::context. */
161
163{
164public:
165 dc_spec_context (const char *option_name,
166 const char *unparsed_spec,
167 key_handler *client_keys,
168 line_maps *affected_location_mgr,
170 line_maps *control_location_mgr,
171 location_t loc)
172 : context (option_name,
173 unparsed_spec,
174 client_keys,
175 affected_location_mgr),
176 m_dc (dc),
177 m_control_location_mgr (control_location_mgr),
178 m_loc (loc)
179 {}
180
181 void report_error_va (const char *gmsgid, va_list *ap) const final override
183 {
184 m_dc.begin_group ();
186 m_dc.diagnostic_impl (&richloc, nullptr, -1, gmsgid, ap, kind::error);
187 m_dc.end_group ();
188 }
189
192 location_t m_loc;
193};
194
195} // namespace output_spec
196} // namespace diagnostics
197
198#endif // #ifndef GCC_DIAGNOSTICS_OUTPUT_SPEC_H
Definition vec.h:1667
Definition diagnostics/context.h:254
Definition output-file.h:32
Definition output-spec.h:93
virtual const char * get_base_filename() const =0
key_handler * m_client_keys
Definition output-spec.h:155
void report_missing_key(const std::string &key, const std::string &scheme_name, const char *metavar) const
Definition output-spec.cc:280
const char * get_unparsed_spec() const
Definition output-spec.h:118
line_maps * m_affected_location_mgr
Definition output-spec.h:157
line_maps * get_affected_location_mgr() const
Definition output-spec.h:121
const char * m_unparsed_spec
Definition output-spec.h:152
const char * get_option_name() const
Definition output-spec.h:115
std::unique_ptr< sink > parse_and_make_sink(diagnostics::context &dc)
Definition output-spec.cc:357
virtual void report_error_va(const char *gmsgid, va_list *ap) const =0
void report_error(const char *gmsgid,...) const ATTRIBUTE_GCC_DIAG(2
Definition output-spec.cc:235
context(const char *option_name, const char *unparsed_spec, key_handler *client_keys, line_maps *affected_location_mgr)
Definition output-spec.h:137
virtual ~context()
Definition output-spec.h:123
void void report_unknown_key(const std::string &key, const scheme_handler &scheme) const
Definition output-spec.cc:244
const char * m_option_name
Definition output-spec.h:149
bool handle_kv(const std::string &key, const std::string &value, scheme_handler &scheme) const
Definition output-spec.cc:419
output_file open_output_file(label_text &&filename) const
Definition output-spec.cc:294
Definition output-spec.h:35
result
Definition output-spec.h:38
@ unrecognized
Definition output-spec.h:40
@ malformed_value
Definition output-spec.h:41
enum result parse_enum_value(const context &ctxt, const std::string &key, const std::string &value, const std::array< std::pair< const char *, EnumType >, NumValues > &value_names, EnumType &out) const
virtual void get_keys(auto_vec< const char * > &out) const =0
virtual enum result maybe_handle_kv(const context &ctxt, const std::string &key, const std::string &value)=0
enum result parse_bool_value(const context &ctxt, const std::string &key, const std::string &value, bool &out) const
Definition output-spec.cc:90
Definition output-spec.h:72
const std::string & get_scheme_name() const
Definition output-spec.h:79
const std::string m_scheme_name
Definition output-spec.h:86
scheme_handler(std::string scheme_name)
Definition output-spec.h:74
virtual ~scheme_handler()
Definition output-spec.h:77
virtual std::unique_ptr< sink > make_sink(const context &ctxt, diagnostics::context &dc)=0
#define ATTRIBUTE_GCC_DIAG(m, n)
Definition diagnostic-core.h:71
Definition output-spec.cc:51
Definition coretypes.h:167
static void const char va_list ap
Definition read-md.cc:205
void report_error_va(const char *gmsgid, va_list *ap) const final override ATTRIBUTE_GCC_DIAG(2
dc_spec_context(const char *option_name, const char *unparsed_spec, key_handler *client_keys, line_maps *affected_location_mgr, diagnostics::context &dc, line_maps *control_location_mgr, location_t loc)
Definition output-spec.h:165
m_dc diagnostic_impl & richloc
Definition output-spec.h:186
void rich_location richloc(m_control_location_mgr, m_loc)
line_maps * m_control_location_mgr
Definition output-spec.h:191
location_t m_loc
Definition output-spec.h:192
diagnostics::context & m_dc
Definition output-spec.h:190
Definition ira-emit.cc:158