compile: New 'compile print'

It is planned the existing GDB command 'print' will be able to evaluate its
expressions using the compiler.  There will be some option to choose between
the existing GDB evaluation and the compiler evaluation.  But as an
intermediate step this patch provides the expression printing feature as a new
command.

I can imagine it could be also called 'maintenance compile print' as in the
future one should be able to use its functionality by the normal 'print'
command.

There was a discussion with Eli about the command name:
	https://sourceware.org/ml/gdb-patches/2015-03/msg00880.html
As there were no other comments yet I haven't renamed it yet, before there is
some confirmation about settlement on the final name.

Support for the GDB '@' operator to create arrays has been submitted for GCC:
	[gcc patch] libcc1: '@' GDB array operator
	https://gcc.gnu.org/ml/gcc-patches/2015-03/msg01451.html


gdb/ChangeLog
2015-05-16  Jan Kratochvil  <jan.kratochvil@redhat.com>
	    Phil Muldoon  <pmuldoon@redhat.com>

	* NEWS (Changes since GDB 7.9): Add compile print.
	* compile/compile-c-support.c (add_code_header, add_code_footer)
	(c_compute_program): Add COMPILE_I_PRINT_ADDRESS_SCOPE and
	COMPILE_I_PRINT_VALUE_SCOPE.
	* compile/compile-internal.h (COMPILE_I_PRINT_OUT_ARG_TYPE)
	(COMPILE_I_PRINT_OUT_ARG, COMPILE_I_EXPR_VAL, COMPILE_I_EXPR_PTR_TYPE):
	New.
	* compile/compile-object-load.c: Include block.h.
	(get_out_value_type): New function.
	(compile_object_load): Handle COMPILE_I_PRINT_ADDRESS_SCOPE and
	COMPILE_I_PRINT_VALUE_SCOPE.  Set compile_module's OUT_VALUE_ADDR and
	OUT_VALUE_TYPE.
	* compile/compile-object-load.h (struct compile_module): Add fields
	out_value_addr and out_value_type.
	* compile/compile-object-run.c: Include valprint.h and compile.h.
	(struct do_module_cleanup): Add fields out_value_addr and
	out_value_type.
	(do_module_cleanup): Handle COMPILE_I_PRINT_ADDRESS_SCOPE and
	COMPILE_I_PRINT_VALUE_SCOPE.
	(compile_object_run): Propagate out_value_addr and out_value_type.
	Pass OUT_VALUE_ADDR.
	* compile/compile.c: Include valprint.h.
	(compile_print_value, compile_print_command): New functions.
	(eval_compile_command): Handle failed COMPILE_I_PRINT_ADDRESS_SCOPE.
	(_initialize_compile): Update compile code help text.  Install
	compile_print_command.
	* compile/compile.h (compile_print_value): New prototype.
	* defs.h (enum compile_i_scope_types): Add
	COMPILE_I_PRINT_ADDRESS_SCOPE and COMPILE_I_PRINT_VALUE_SCOPE.

gdb/doc/ChangeLog
2015-05-16  Jan Kratochvil  <jan.kratochvil@redhat.com>

	* gdb.texinfo (Compiling and Injecting Code): Add compile print.

gdb/testsuite/ChangeLog
2015-05-16  Jan Kratochvil  <jan.kratochvil@redhat.com>

	* gdb.compile/compile-print.c: New file.
	* gdb.compile/compile-print.exp: New file.
This commit is contained in:
Jan Kratochvil
2015-05-16 14:20:46 +02:00
parent 83d3415ef5
commit 36de76f9cc
15 changed files with 473 additions and 12 deletions

View File

@ -38,6 +38,7 @@
#include "target.h"
#include "osabi.h"
#include "gdb_wait.h"
#include "valprint.h"
@ -163,6 +164,51 @@ compile_code_command (char *arg, int from_tty)
do_cleanups (cleanup);
}
/* Callback for compile_print_command. */
void
compile_print_value (struct value *val, void *data_voidp)
{
const struct format_data *fmtp = data_voidp;
print_value (val, fmtp);
}
/* Handle the input from the 'compile print' command. The "compile
print" command is used to evaluate and print an expression that may
contain calls to the GCC compiler. The language expected in this
compile command is the language currently set in GDB. */
static void
compile_print_command (char *arg_param, int from_tty)
{
const char *arg = arg_param;
struct cleanup *cleanup;
enum compile_i_scope_types scope = COMPILE_I_PRINT_ADDRESS_SCOPE;
struct format_data fmt;
cleanup = make_cleanup_restore_integer (&interpreter_async);
interpreter_async = 0;
/* Passing &FMT as SCOPE_DATA is safe as do_module_cleanup will not
touch the stale pointer if compile_object_run has already quit. */
print_command_parse_format (&arg, "compile print", &fmt);
if (arg && *arg)
eval_compile_command (NULL, arg, scope, &fmt);
else
{
struct command_line *l = get_command_line (compile_control, "");
make_cleanup_free_command_lines (&l);
l->control_u.compile.scope = scope;
l->control_u.compile.scope_data = &fmt;
execute_control_command_untraced (l);
}
do_cleanups (cleanup);
}
/* A cleanup function to remove a directory and all its contents. */
static void
@ -576,6 +622,14 @@ eval_compile_command (struct command_line *cmd, const char *cmd_string,
make_cleanup (cleanup_unlink_file, source_file);
compile_module = compile_object_load (object_file, source_file,
scope, scope_data);
if (compile_module == NULL)
{
gdb_assert (scope == COMPILE_I_PRINT_ADDRESS_SCOPE);
do_cleanups (cleanup_xfree);
eval_compile_command (cmd, cmd_string,
COMPILE_I_PRINT_VALUE_SCOPE, scope_data);
return;
}
discard_cleanups (cleanup_unlink);
do_cleanups (cleanup_xfree);
compile_object_run (compile_module);
@ -637,12 +691,10 @@ The source code may be specified as a simple one line expression, e.g.:\n\
\n\
compile code printf(\"Hello world\\n\");\n\
\n\
Alternatively, you can type the source code interactively.\n\
You can invoke this mode when no argument is given to the command\n\
(i.e.,\"compile code\" is typed with nothing after it). An\n\
interactive prompt will be shown allowing you to enter multiple\n\
lines of source code. Type a line containing \"end\" to indicate\n\
the end of the source code."),
Alternatively, you can type a multiline expression by invoking\n\
this command with no argument. GDB will then prompt for the\n\
expression interactively; type a line containing \"end\" to\n\
indicate the end of the expression."),
&compile_command_list);
c = add_cmd ("file", class_obscure, compile_file_command,
@ -654,6 +706,25 @@ Usage: compile file [-r|-raw] [filename]\n\
&compile_command_list);
set_cmd_completer (c, filename_completer);
add_cmd ("print", class_obscure, compile_print_command,
_("\
Evaluate EXPR by using the compiler and print result.\n\
\n\
Usage: compile print[/FMT] [EXPR]\n\
\n\
The expression may be specified on the same line as the command, e.g.:\n\
\n\
compile print i\n\
\n\
Alternatively, you can type a multiline expression by invoking\n\
this command with no argument. GDB will then prompt for the\n\
expression interactively; type a line containing \"end\" to\n\
indicate the end of the expression.\n\
\n\
EXPR may be preceded with /FMT, where FMT is a format letter\n\
but no count or size letter (see \"x\" command)."),
&compile_command_list);
add_setshow_boolean_cmd ("compile", class_maintenance, &compile_debug, _("\
Set compile command debugging."), _("\
Show compile command debugging."), _("\