diff options
Diffstat (limited to 'gcc/sarif-replay.cc')
-rw-r--r-- | gcc/sarif-replay.cc | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/gcc/sarif-replay.cc b/gcc/sarif-replay.cc index 1523d87..a96c97b 100644 --- a/gcc/sarif-replay.cc +++ b/gcc/sarif-replay.cc @@ -19,6 +19,7 @@ along with GCC; see the file COPYING3. If not see <http://www.gnu.org/licenses/>. */ #include "config.h" +#define INCLUDE_STRING #define INCLUDE_VECTOR #include "system.h" #include "coretypes.h" @@ -48,6 +49,7 @@ struct options replay_options m_replay_opts; std::vector<const char *> m_sarif_filenames; + std::vector<std::string> m_extra_output_specs; }; static void @@ -70,6 +72,10 @@ static const char *const usage_msg = ( "\n" "Options:\n" "\n" +" -fdiagnostics-add-output=SCHEME\n" +" Add an additional output sink when replaying diagnostics, as\n" +" per the gcc option\n" +"\n" " -fdiagnostics-color={never|always|auto}\n" " Control colorization of diagnostics. Default: auto.\n" "\n" @@ -95,6 +101,19 @@ print_usage () fprintf (stderr, usage_msg); } +/* If STR starts with PREFIX, return the rest of STR. + Otherwise return nullptr. */ + +static const char * +str_starts_with (const char *str, const char *prefix) +{ + size_t prefix_len = strlen (prefix); + if (0 == strncmp (str, prefix, prefix_len)) + return str + prefix_len; + else + return nullptr; +} + static bool parse_options (int argc, char **argv, options &opts, @@ -128,6 +147,13 @@ parse_options (int argc, char **argv, opts.m_replay_opts.m_echo_file = true; handled = true; } +#define ADD_OUTPUT_OPTION "-fdiagnostics-add-output=" + else if (const char *arg + = str_starts_with (option, ADD_OUTPUT_OPTION)) + { + opts.m_extra_output_specs.push_back (std::string (arg)); + handled = true; + } else if (strcmp (option, "-fdiagnostics-color=never") == 0) { opts.m_replay_opts.m_diagnostics_colorize = DIAGNOSTIC_COLORIZE_NO; @@ -221,6 +247,12 @@ main (int argc, char **argv) libgdiagnostics::manager playback_mgr; playback_mgr.add_text_sink (stderr, opts.m_replay_opts.m_diagnostics_colorize); + for (auto spec : opts.m_extra_output_specs) + if (playback_mgr.add_sink_from_spec + (ADD_OUTPUT_OPTION, + spec.c_str (), + libgdiagnostics::manager (control_mgr.m_inner, false))) + return -1; int result = sarif_replay_path (filename, playback_mgr.m_inner, |