libcc1: unify compiler handling
Both libcc1 plugins have nearly identical copies of code to find the
underlying compiler. This seemed wasteful to me, so this patch
unifies the copies.
Two minor API changes were needed.
First, the old code used a back-link from the compiler object to the
plugin object to check the 'verbose' setting. This patch adds a
'verbose' setting directly to the compiler object instead.
Second, the 'find' method implicitly knew which compiler base name
("gcc" or "g++") to use. This patch makes this a parameter that is
passed in by the plugin.
libcc1
* libcp1.cc (compiler, compiler_triplet_regexp)
(compiler_driver_filename): Remove.
(libcp1::libcp1): Update.
(make_regexp, libcp1::compiler::find)
(libcp1::compiler_triplet_regexp::find)
(libcp1::compiler_driver_filename::find): Remove.
(libcp1_set_verbose, libcp1_set_arguments)
(libcp1_set_triplet_regexp, libcp1_set_driver_filename): Update.
* libcc1.cc (compiler, compiler_triplet_regexp)
(compiler_driver_filename): Remove.
(libcc1::libcc1): Update.
(make_regexp, libcc1::compiler::find)
(libcc1::compiler_triplet_regexp::find)
(libcc1::compiler_driver_filename::find): Remove.
(libcc1_set_verbose, libcc1_set_arguments)
(libcc1_set_triplet_regexp, libcc1_set_driver_filename): Update.
* compiler.cc: New file.
* compiler.hh: New file.
* Makefile.in: Rebuild.
* Makefile.am (libcc1_la_SOURCES): Add compiler.hh, compiler.cc.
2021-05-04 23:26:58 +02:00
|
|
|
/* Compiler handling for plugin
|
|
|
|
Copyright (C) 2014-2021 Free Software Foundation, Inc.
|
|
|
|
|
|
|
|
This file is part of GCC.
|
|
|
|
|
|
|
|
GCC 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, or (at your option) any later
|
|
|
|
version.
|
|
|
|
|
|
|
|
GCC 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 GCC; see the file COPYING3. If not see
|
|
|
|
<http://www.gnu.org/licenses/>. */
|
|
|
|
|
|
|
|
#include <cc1plugin-config.h>
|
|
|
|
#include <string>
|
|
|
|
#include <sstream>
|
|
|
|
#include "libiberty.h"
|
|
|
|
#include "compiler.hh"
|
|
|
|
#include "xregex.h"
|
|
|
|
#include "findcomp.hh"
|
|
|
|
#include "intl.h"
|
|
|
|
|
|
|
|
// Construct an appropriate regexp to match the compiler name.
|
|
|
|
static std::string
|
2021-05-04 23:26:58 +02:00
|
|
|
make_regexp (const std::string &triplet_regexp, const char *compiler)
|
libcc1: unify compiler handling
Both libcc1 plugins have nearly identical copies of code to find the
underlying compiler. This seemed wasteful to me, so this patch
unifies the copies.
Two minor API changes were needed.
First, the old code used a back-link from the compiler object to the
plugin object to check the 'verbose' setting. This patch adds a
'verbose' setting directly to the compiler object instead.
Second, the 'find' method implicitly knew which compiler base name
("gcc" or "g++") to use. This patch makes this a parameter that is
passed in by the plugin.
libcc1
* libcp1.cc (compiler, compiler_triplet_regexp)
(compiler_driver_filename): Remove.
(libcp1::libcp1): Update.
(make_regexp, libcp1::compiler::find)
(libcp1::compiler_triplet_regexp::find)
(libcp1::compiler_driver_filename::find): Remove.
(libcp1_set_verbose, libcp1_set_arguments)
(libcp1_set_triplet_regexp, libcp1_set_driver_filename): Update.
* libcc1.cc (compiler, compiler_triplet_regexp)
(compiler_driver_filename): Remove.
(libcc1::libcc1): Update.
(make_regexp, libcc1::compiler::find)
(libcc1::compiler_triplet_regexp::find)
(libcc1::compiler_driver_filename::find): Remove.
(libcc1_set_verbose, libcc1_set_arguments)
(libcc1_set_triplet_regexp, libcc1_set_driver_filename): Update.
* compiler.cc: New file.
* compiler.hh: New file.
* Makefile.in: Rebuild.
* Makefile.am (libcc1_la_SOURCES): Add compiler.hh, compiler.cc.
2021-05-04 23:26:58 +02:00
|
|
|
{
|
|
|
|
std::stringstream buf;
|
|
|
|
|
|
|
|
buf << "^" << triplet_regexp << "-";
|
|
|
|
|
|
|
|
// Quote the compiler name in case it has something funny in it.
|
|
|
|
for (const char *p = compiler; *p; ++p)
|
|
|
|
{
|
|
|
|
switch (*p)
|
|
|
|
{
|
|
|
|
case '.':
|
|
|
|
case '^':
|
|
|
|
case '$':
|
|
|
|
case '*':
|
|
|
|
case '+':
|
|
|
|
case '?':
|
|
|
|
case '(':
|
|
|
|
case ')':
|
|
|
|
case '[':
|
|
|
|
case '{':
|
|
|
|
case '\\':
|
|
|
|
case '|':
|
|
|
|
buf << '\\';
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
buf << *p;
|
|
|
|
}
|
|
|
|
buf << "$";
|
|
|
|
|
|
|
|
return buf.str ();
|
|
|
|
}
|
|
|
|
|
|
|
|
char *
|
|
|
|
cc1_plugin::compiler::find (const char *, std::string &) const
|
|
|
|
{
|
|
|
|
return xstrdup (_("Compiler has not been specified"));
|
|
|
|
}
|
|
|
|
|
|
|
|
char *
|
|
|
|
cc1_plugin::compiler_triplet_regexp::find (const char *base,
|
|
|
|
std::string &compiler) const
|
|
|
|
{
|
2021-05-04 23:26:58 +02:00
|
|
|
std::string rx = make_regexp (triplet_regexp_, base);
|
libcc1: unify compiler handling
Both libcc1 plugins have nearly identical copies of code to find the
underlying compiler. This seemed wasteful to me, so this patch
unifies the copies.
Two minor API changes were needed.
First, the old code used a back-link from the compiler object to the
plugin object to check the 'verbose' setting. This patch adds a
'verbose' setting directly to the compiler object instead.
Second, the 'find' method implicitly knew which compiler base name
("gcc" or "g++") to use. This patch makes this a parameter that is
passed in by the plugin.
libcc1
* libcp1.cc (compiler, compiler_triplet_regexp)
(compiler_driver_filename): Remove.
(libcp1::libcp1): Update.
(make_regexp, libcp1::compiler::find)
(libcp1::compiler_triplet_regexp::find)
(libcp1::compiler_driver_filename::find): Remove.
(libcp1_set_verbose, libcp1_set_arguments)
(libcp1_set_triplet_regexp, libcp1_set_driver_filename): Update.
* libcc1.cc (compiler, compiler_triplet_regexp)
(compiler_driver_filename): Remove.
(libcc1::libcc1): Update.
(make_regexp, libcc1::compiler::find)
(libcc1::compiler_triplet_regexp::find)
(libcc1::compiler_driver_filename::find): Remove.
(libcc1_set_verbose, libcc1_set_arguments)
(libcc1_set_triplet_regexp, libcc1_set_driver_filename): Update.
* compiler.cc: New file.
* compiler.hh: New file.
* Makefile.in: Rebuild.
* Makefile.am (libcc1_la_SOURCES): Add compiler.hh, compiler.cc.
2021-05-04 23:26:58 +02:00
|
|
|
if (verbose)
|
|
|
|
fprintf (stderr, _("searching for compiler matching regex %s\n"),
|
|
|
|
rx.c_str());
|
|
|
|
regex_t triplet;
|
|
|
|
int code = regcomp (&triplet, rx.c_str (), REG_EXTENDED | REG_NOSUB);
|
|
|
|
if (code != 0)
|
|
|
|
{
|
|
|
|
size_t len = regerror (code, &triplet, NULL, 0);
|
|
|
|
char err[len];
|
|
|
|
|
|
|
|
regerror (code, &triplet, err, len);
|
|
|
|
|
|
|
|
return concat ("Could not compile regexp \"",
|
|
|
|
rx.c_str (),
|
|
|
|
"\": ",
|
|
|
|
err,
|
|
|
|
(char *) NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!find_compiler (triplet, &compiler))
|
|
|
|
{
|
|
|
|
regfree (&triplet);
|
|
|
|
return concat ("Could not find a compiler matching \"",
|
|
|
|
rx.c_str (),
|
|
|
|
"\"",
|
|
|
|
(char *) NULL);
|
|
|
|
}
|
|
|
|
regfree (&triplet);
|
|
|
|
if (verbose)
|
|
|
|
fprintf (stderr, _("found compiler %s\n"), compiler.c_str());
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
char *
|
|
|
|
cc1_plugin::compiler_driver_filename::find (const char *,
|
|
|
|
std::string &compiler) const
|
|
|
|
{
|
|
|
|
// Simulate fnotice by fprintf.
|
|
|
|
if (verbose)
|
|
|
|
fprintf (stderr, _("using explicit compiler filename %s\n"),
|
|
|
|
driver_filename_.c_str());
|
|
|
|
compiler = driver_filename_;
|
|
|
|
return NULL;
|
|
|
|
}
|