compile: Add 'set compile-gcc'
As discussed in How to use compile & execute function in GDB https://sourceware.org/ml/gdb/2015-04/msg00026.html GDB currently searches for compilers on /usr/bin/ARCH-OS-gcc and chooses a match from there. However, it is not currently possible for the user to override which compiler to use. This is what this patch implements. It is also a sync between GCC's and GDB's interfaces. gdb/ChangeLog 2017-08-23 Jan Kratochvil <jan.kratochvil@redhat.com> * NEWS (Changes since GDB 7.9): Add set compile-gcc and show compile-gcc. * compile/compile.c (compile_gcc, show_compile_gcc): New. (compile_to_object): Implement compile_gcc. (_initialize_compile): Install "set compile-gcc". Initialize compile_gcc. gdb/doc/ChangeLog 2017-08-23 Jan Kratochvil <jan.kratochvil@redhat.com> * gdb.texinfo (Compiling and Injecting Code): Add to subsection "Compiler search for the compile command" descriptions of set compile-gcc and show compile-gcc. include/ChangeLog 2017-08-23 Jan Kratochvil <jan.kratochvil@redhat.com> * gcc-interface.h (enum gcc_base_api_version): Update comment for GCC_FE_VERSION_1. (struct gcc_base_vtable): Rename set_arguments to set_arguments_v0. Add set_arguments, set_triplet_regexp and set_driver_filename.
This commit is contained in:
parent
e68c32d53e
commit
6e41ddec97
7 changed files with 155 additions and 31 deletions
|
@ -335,6 +335,19 @@ append_args (int *argcp, char ***argvp, int argc, char **argv)
|
|||
(*argvp)[(*argcp)] = NULL;
|
||||
}
|
||||
|
||||
/* String for 'set compile-gcc' and 'show compile-gcc'. */
|
||||
static char *compile_gcc;
|
||||
|
||||
/* Implement 'show compile-gcc'. */
|
||||
|
||||
static void
|
||||
show_compile_gcc (struct ui_file *file, int from_tty,
|
||||
struct cmd_list_element *c, const char *value)
|
||||
{
|
||||
fprintf_filtered (file, _("Compile command GCC driver filename is \"%s\".\n"),
|
||||
value);
|
||||
}
|
||||
|
||||
/* Return DW_AT_producer parsed for get_selected_frame () (if any).
|
||||
Return NULL otherwise.
|
||||
|
||||
|
@ -452,8 +465,6 @@ compile_to_object (struct command_line *cmd, const char *cmd_string,
|
|||
int ok;
|
||||
FILE *src;
|
||||
struct gdbarch *gdbarch = get_current_arch ();
|
||||
const char *os_rx;
|
||||
const char *arch_rx;
|
||||
char *triplet_rx;
|
||||
char *error_message;
|
||||
|
||||
|
@ -505,22 +516,39 @@ compile_to_object (struct command_line *cmd, const char *cmd_string,
|
|||
if (compile_debug)
|
||||
fprintf_unfiltered (gdb_stdlog, "debug output:\n\n%s", code.c_str ());
|
||||
|
||||
os_rx = osabi_triplet_regexp (gdbarch_osabi (gdbarch));
|
||||
arch_rx = gdbarch_gnu_triplet_regexp (gdbarch);
|
||||
if (compiler->fe->ops->version >= GCC_FE_VERSION_1)
|
||||
compiler->fe->ops->set_verbose (compiler->fe, compile_debug);
|
||||
|
||||
/* Allow triplets with or without vendor set. */
|
||||
triplet_rx = concat (arch_rx, "(-[^-]*)?-", os_rx, (char *) NULL);
|
||||
make_cleanup (xfree, triplet_rx);
|
||||
if (compile_gcc[0] != 0)
|
||||
{
|
||||
if (compiler->fe->ops->version < GCC_FE_VERSION_1)
|
||||
error (_("Command 'set compile-gcc' requires GCC version 6 or higher "
|
||||
"(libcc1 interface version 1 or higher)"));
|
||||
|
||||
compiler->fe->ops->set_driver_filename (compiler->fe, compile_gcc);
|
||||
}
|
||||
else
|
||||
{
|
||||
const char *os_rx = osabi_triplet_regexp (gdbarch_osabi (gdbarch));
|
||||
const char *arch_rx = gdbarch_gnu_triplet_regexp (gdbarch);
|
||||
|
||||
/* Allow triplets with or without vendor set. */
|
||||
triplet_rx = concat (arch_rx, "(-[^-]*)?-", os_rx, (char *) NULL);
|
||||
make_cleanup (xfree, triplet_rx);
|
||||
|
||||
if (compiler->fe->ops->version >= GCC_FE_VERSION_1)
|
||||
compiler->fe->ops->set_triplet_regexp (compiler->fe, triplet_rx);
|
||||
}
|
||||
|
||||
/* Set compiler command-line arguments. */
|
||||
get_args (compiler, gdbarch, &argc, &argv);
|
||||
gdb_argv argv_holder (argv);
|
||||
|
||||
if (compiler->fe->ops->version >= GCC_FE_VERSION_1)
|
||||
compiler->fe->ops->set_verbose (compiler->fe, compile_debug);
|
||||
|
||||
error_message = compiler->fe->ops->set_arguments (compiler->fe, triplet_rx,
|
||||
argc, argv);
|
||||
error_message = compiler->fe->ops->set_arguments (compiler->fe, argc, argv);
|
||||
else
|
||||
error_message = compiler->fe->ops->set_arguments_v0 (compiler->fe, triplet_rx,
|
||||
argc, argv);
|
||||
if (error_message != NULL)
|
||||
{
|
||||
make_cleanup (xfree, error_message);
|
||||
|
@ -742,4 +770,17 @@ String quoting is parsed like in shell, for example:\n\
|
|||
" -fno-stack-protector"
|
||||
);
|
||||
set_compile_args (compile_args, 0, NULL);
|
||||
|
||||
add_setshow_optional_filename_cmd ("compile-gcc", class_support,
|
||||
&compile_gcc,
|
||||
_("Set compile command "
|
||||
"GCC driver filename"),
|
||||
_("Show compile command "
|
||||
"GCC driver filename"),
|
||||
_("\
|
||||
It should be absolute filename of the gcc executable.\n\
|
||||
If empty the default target triplet will be searched in $PATH."),
|
||||
NULL, show_compile_gcc, &setlist,
|
||||
&showlist);
|
||||
compile_gcc = xstrdup ("");
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue