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
|
@ -1,3 +1,12 @@
|
||||||
|
2017-08-23 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||||
|
|
||||||
|
* NEWS (Changes since GDB 8.0): 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.
|
||||||
|
|
||||||
2017-08-23 Jan Kratochvil <jan.kratochvil@redhat.com>
|
2017-08-23 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||||
|
|
||||||
* compile/compile.c (compile_to_object): Conditionally call
|
* compile/compile.c (compile_to_object): Conditionally call
|
||||||
|
|
4
gdb/NEWS
4
gdb/NEWS
|
@ -27,6 +27,10 @@ QStartupWithShell
|
||||||
|
|
||||||
* New commands
|
* New commands
|
||||||
|
|
||||||
|
set|show compile-gcc
|
||||||
|
Set and show compilation command used for compiling and injecting code
|
||||||
|
with the 'compile' commands.
|
||||||
|
|
||||||
set debug separate-debug-file
|
set debug separate-debug-file
|
||||||
show debug separate-debug-file
|
show debug separate-debug-file
|
||||||
Control the display of debug output about separate debug file search.
|
Control the display of debug output about separate debug file search.
|
||||||
|
|
|
@ -335,6 +335,19 @@ append_args (int *argcp, char ***argvp, int argc, char **argv)
|
||||||
(*argvp)[(*argcp)] = NULL;
|
(*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 DW_AT_producer parsed for get_selected_frame () (if any).
|
||||||
Return NULL otherwise.
|
Return NULL otherwise.
|
||||||
|
|
||||||
|
@ -452,8 +465,6 @@ compile_to_object (struct command_line *cmd, const char *cmd_string,
|
||||||
int ok;
|
int ok;
|
||||||
FILE *src;
|
FILE *src;
|
||||||
struct gdbarch *gdbarch = get_current_arch ();
|
struct gdbarch *gdbarch = get_current_arch ();
|
||||||
const char *os_rx;
|
|
||||||
const char *arch_rx;
|
|
||||||
char *triplet_rx;
|
char *triplet_rx;
|
||||||
char *error_message;
|
char *error_message;
|
||||||
|
|
||||||
|
@ -505,22 +516,39 @@ compile_to_object (struct command_line *cmd, const char *cmd_string,
|
||||||
if (compile_debug)
|
if (compile_debug)
|
||||||
fprintf_unfiltered (gdb_stdlog, "debug output:\n\n%s", code.c_str ());
|
fprintf_unfiltered (gdb_stdlog, "debug output:\n\n%s", code.c_str ());
|
||||||
|
|
||||||
os_rx = osabi_triplet_regexp (gdbarch_osabi (gdbarch));
|
if (compiler->fe->ops->version >= GCC_FE_VERSION_1)
|
||||||
arch_rx = gdbarch_gnu_triplet_regexp (gdbarch);
|
compiler->fe->ops->set_verbose (compiler->fe, compile_debug);
|
||||||
|
|
||||||
/* Allow triplets with or without vendor set. */
|
if (compile_gcc[0] != 0)
|
||||||
triplet_rx = concat (arch_rx, "(-[^-]*)?-", os_rx, (char *) NULL);
|
{
|
||||||
make_cleanup (xfree, triplet_rx);
|
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. */
|
/* Set compiler command-line arguments. */
|
||||||
get_args (compiler, gdbarch, &argc, &argv);
|
get_args (compiler, gdbarch, &argc, &argv);
|
||||||
gdb_argv argv_holder (argv);
|
gdb_argv argv_holder (argv);
|
||||||
|
|
||||||
if (compiler->fe->ops->version >= GCC_FE_VERSION_1)
|
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, argc, argv);
|
||||||
|
else
|
||||||
error_message = compiler->fe->ops->set_arguments (compiler->fe, triplet_rx,
|
error_message = compiler->fe->ops->set_arguments_v0 (compiler->fe, triplet_rx,
|
||||||
argc, argv);
|
argc, argv);
|
||||||
if (error_message != NULL)
|
if (error_message != NULL)
|
||||||
{
|
{
|
||||||
make_cleanup (xfree, error_message);
|
make_cleanup (xfree, error_message);
|
||||||
|
@ -742,4 +770,17 @@ String quoting is parsed like in shell, for example:\n\
|
||||||
" -fno-stack-protector"
|
" -fno-stack-protector"
|
||||||
);
|
);
|
||||||
set_compile_args (compile_args, 0, NULL);
|
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 ("");
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,9 @@
|
||||||
|
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.
|
||||||
|
|
||||||
2017-08-07 Weimin Pan <weimin.pan@oracle.com>
|
2017-08-07 Weimin Pan <weimin.pan@oracle.com>
|
||||||
|
|
||||||
* gdb.texinfo (Architectures): Add new Sparc64 section to document
|
* gdb.texinfo (Architectures): Add new Sparc64 section to document
|
||||||
|
|
|
@ -18154,13 +18154,15 @@ will print to the console.
|
||||||
|
|
||||||
@subsection Compiler search for the @code{compile} command
|
@subsection Compiler search for the @code{compile} command
|
||||||
|
|
||||||
@value{GDBN} needs to find @value{NGCC} for the inferior being debugged which
|
@value{GDBN} needs to find @value{NGCC} for the inferior being debugged
|
||||||
may not be obvious for remote targets of different architecture than where
|
which may not be obvious for remote targets of different architecture
|
||||||
@value{GDBN} is running. Environment variable @code{PATH} (@code{PATH} from
|
than where @value{GDBN} is running. Environment variable @code{PATH} on
|
||||||
shell that executed @value{GDBN}, not the one set by @value{GDBN}
|
|
||||||
command @code{set environment}). @xref{Environment}. @code{PATH} on
|
|
||||||
@value{GDBN} host is searched for @value{NGCC} binary matching the
|
@value{GDBN} host is searched for @value{NGCC} binary matching the
|
||||||
target architecture and operating system.
|
target architecture and operating system. This search can be overriden
|
||||||
|
by @code{set compile-gcc} @value{GDBN} command below. @code{PATH} is
|
||||||
|
taken from shell that executed @value{GDBN}, it is not the value set by
|
||||||
|
@value{GDBN} command @code{set environment}). @xref{Environment}.
|
||||||
|
|
||||||
|
|
||||||
Specifically @code{PATH} is searched for binaries matching regular expression
|
Specifically @code{PATH} is searched for binaries matching regular expression
|
||||||
@code{@var{arch}(-[^-]*)?-@var{os}-gcc} according to the inferior target being
|
@code{@var{arch}(-[^-]*)?-@var{os}-gcc} according to the inferior target being
|
||||||
|
@ -18170,6 +18172,28 @@ example both @code{i386} and @code{x86_64} targets look for pattern
|
||||||
for pattern @code{s390x?}. @var{os} is currently supported only for
|
for pattern @code{s390x?}. @var{os} is currently supported only for
|
||||||
pattern @code{linux(-gnu)?}.
|
pattern @code{linux(-gnu)?}.
|
||||||
|
|
||||||
|
On Posix hosts the compiler driver @value{GDBN} needs to find also
|
||||||
|
shared library @file{libcc1.so} from the compiler. It is searched in
|
||||||
|
default shared library search path (overridable with usual environment
|
||||||
|
variable @code{LD_LIBRARY_PATH}), unrelated to @code{PATH} or @code{set
|
||||||
|
compile-gcc} settings. Contrary to it @file{libcc1plugin.so} is found
|
||||||
|
according to the installation of the found compiler --- as possibly
|
||||||
|
specified by the @code{set compile-gcc} command.
|
||||||
|
|
||||||
|
@table @code
|
||||||
|
@item set compile-gcc
|
||||||
|
@cindex compile command driver filename override
|
||||||
|
Set compilation command used for compiling and injecting code with the
|
||||||
|
@code{compile} commands. If this option is not set (it is set to
|
||||||
|
an empty string), the search described above will occur --- that is the
|
||||||
|
default.
|
||||||
|
|
||||||
|
@item show compile-gcc
|
||||||
|
Displays the current compile command @value{NGCC} driver filename.
|
||||||
|
If set, it is the main command @command{gcc}, found usually for example
|
||||||
|
under name @file{x86_64-linux-gnu-gcc}.
|
||||||
|
@end table
|
||||||
|
|
||||||
@node GDB Files
|
@node GDB Files
|
||||||
@chapter @value{GDBN} Files
|
@chapter @value{GDBN} Files
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,10 @@
|
||||||
|
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.
|
||||||
|
|
||||||
2017-08-23 Jan Kratochvil <jan.kratochvil@redhat.com>
|
2017-08-23 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||||
|
|
||||||
* gcc-interface.h (enum gcc_base_api_version): Add
|
* gcc-interface.h (enum gcc_base_api_version): Add
|
||||||
|
|
|
@ -46,7 +46,9 @@ enum gcc_base_api_version
|
||||||
{
|
{
|
||||||
GCC_FE_VERSION_0 = 0,
|
GCC_FE_VERSION_0 = 0,
|
||||||
|
|
||||||
/* Deprecated method compile_v0. Added method set_verbose and compile. */
|
/* Deprecated methods set_arguments_v0 and compile_v0. Added methods
|
||||||
|
set_arguments, set_triplet_regexp, set_driver_filename, set_verbose and
|
||||||
|
compile. */
|
||||||
GCC_FE_VERSION_1 = 1,
|
GCC_FE_VERSION_1 = 1,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -67,20 +69,12 @@ struct gcc_base_vtable
|
||||||
|
|
||||||
unsigned int version;
|
unsigned int version;
|
||||||
|
|
||||||
/* Set the compiler's command-line options for the next compilation.
|
/* Deprecated GCC_FE_VERSION_0 variant of the GCC_FE_VERSION_1
|
||||||
TRIPLET_REGEXP is a regular expression that is used to match the
|
methods set_triplet_regexp and set_arguments. */
|
||||||
configury triplet prefix to the compiler.
|
|
||||||
The arguments are copied by GCC. ARGV need not be
|
|
||||||
NULL-terminated. The arguments must be set separately for each
|
|
||||||
compilation; that is, after a compile is requested, the
|
|
||||||
previously-set arguments cannot be reused.
|
|
||||||
|
|
||||||
This returns NULL on success. On failure, returns a malloc()d
|
char *(*set_arguments_v0) (struct gcc_base_context *self,
|
||||||
error message. The caller is responsible for freeing it. */
|
const char *triplet_regexp,
|
||||||
|
int argc, char **argv);
|
||||||
char *(*set_arguments) (struct gcc_base_context *self,
|
|
||||||
const char *triplet_regexp,
|
|
||||||
int argc, char **argv);
|
|
||||||
|
|
||||||
/* Set the file name of the program to compile. The string is
|
/* Set the file name of the program to compile. The string is
|
||||||
copied by the method implementation, but the caller must
|
copied by the method implementation, but the caller must
|
||||||
|
@ -125,6 +119,45 @@ struct gcc_base_vtable
|
||||||
|
|
||||||
int /* bool */ (*compile) (struct gcc_base_context *self,
|
int /* bool */ (*compile) (struct gcc_base_context *self,
|
||||||
const char *filename);
|
const char *filename);
|
||||||
|
|
||||||
|
/* Set the compiler's command-line options for the next compilation.
|
||||||
|
The arguments are copied by GCC. ARGV need not be
|
||||||
|
NULL-terminated. The arguments must be set separately for each
|
||||||
|
compilation; that is, after a compile is requested, the
|
||||||
|
previously-set arguments cannot be reused.
|
||||||
|
|
||||||
|
This returns NULL on success. On failure, returns a malloc()d
|
||||||
|
error message. The caller is responsible for freeing it.
|
||||||
|
|
||||||
|
This method is only available since GCC_FE_VERSION_1. */
|
||||||
|
|
||||||
|
char *(*set_arguments) (struct gcc_base_context *self,
|
||||||
|
int argc, char **argv);
|
||||||
|
|
||||||
|
/* Set TRIPLET_REGEXP as a regular expression that is used to match
|
||||||
|
the configury triplet prefix to the compiler. Calling this method
|
||||||
|
overrides possible previous call of itself or set_driver_filename.
|
||||||
|
|
||||||
|
This returns NULL on success. On failure, returns a malloc()d
|
||||||
|
error message. The caller is responsible for freeing it.
|
||||||
|
|
||||||
|
This method is only available since GCC_FE_VERSION_1. */
|
||||||
|
|
||||||
|
char *(*set_triplet_regexp) (struct gcc_base_context *self,
|
||||||
|
const char *triplet_regexp);
|
||||||
|
|
||||||
|
/* DRIVER_FILENAME should be filename of the gcc compiler driver
|
||||||
|
program. It will be searched in PATH components like
|
||||||
|
TRIPLET_REGEXP. Calling this method overrides possible previous
|
||||||
|
call of itself or set_triplet_regexp.
|
||||||
|
|
||||||
|
This returns NULL on success. On failure, returns a malloc()d
|
||||||
|
error message. The caller is responsible for freeing it.
|
||||||
|
|
||||||
|
This method is only available since GCC_FE_VERSION_1. */
|
||||||
|
|
||||||
|
char *(*set_driver_filename) (struct gcc_base_context *self,
|
||||||
|
const char *driver_filename);
|
||||||
};
|
};
|
||||||
|
|
||||||
/* The GCC object. */
|
/* The GCC object. */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue