aboutsummaryrefslogtreecommitdiff
path: root/gdb/compile/compile.c
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/compile/compile.c')
-rw-r--r--gdb/compile/compile.c65
1 files changed, 34 insertions, 31 deletions
diff --git a/gdb/compile/compile.c b/gdb/compile/compile.c
index 74ffa64..7c8fe15 100644
--- a/gdb/compile/compile.c
+++ b/gdb/compile/compile.c
@@ -39,6 +39,8 @@
#include "osabi.h"
#include "gdb_wait.h"
#include "valprint.h"
+#include "common/gdb_optional.h"
+#include "common/gdb_unlinker.h"
@@ -283,15 +285,17 @@ get_expr_block_and_pc (CORE_ADDR *pc)
return block;
}
-/* Call gdb_buildargv, set its result for S into *ARGVP but calculate also the
- number of parsed arguments into *ARGCP. If gdb_buildargv has returned NULL
- then *ARGCP is set to zero. */
+/* Call buildargv (via gdb_argv), set its result for S into *ARGVP but
+ calculate also the number of parsed arguments into *ARGCP. If
+ buildargv has returned NULL then *ARGCP is set to zero. */
static void
build_argc_argv (const char *s, int *argcp, char ***argvp)
{
- *argvp = gdb_buildargv (s);
- *argcp = countargv (*argvp);
+ gdb_argv args (s);
+
+ *argcp = args.count ();
+ *argvp = args.release ();
}
/* String for 'set compile-args' and 'show compile-args'. */
@@ -457,16 +461,6 @@ cleanup_compile_instance (void *arg)
delete inst;
}
-/* A cleanup function to unlink a file. */
-
-static void
-cleanup_unlink_file (void *arg)
-{
- const char *filename = (const char *) arg;
-
- unlink (filename);
-}
-
/* A helper function suitable for use as the "print_callback" in the
compiler object. */
@@ -485,7 +479,7 @@ compile_to_object (struct command_line *cmd, const char *cmd_string,
enum compile_i_scope_types scope)
{
compile::compile_instance *compiler;
- struct cleanup *cleanup, *inner_cleanup;
+ struct cleanup *cleanup;
const struct block *expr_block;
CORE_ADDR trash_pc, expr_pc;
int argc;
@@ -569,7 +563,7 @@ compile_to_object (struct command_line *cmd, const char *cmd_string,
/* Set compiler command-line arguments. */
get_args (compiler, gdbarch, &argc, &argv);
- make_cleanup_freeargv (argv);
+ gdb_argv argv_holder (argv);
if (compiler->version ()>= GCC_FE_VERSION_1)
error_message = compiler->set_arguments (argc, argv);
@@ -593,14 +587,18 @@ compile_to_object (struct command_line *cmd, const char *cmd_string,
compile_file_names fnames = get_new_file_names ();
- src = gdb_fopen_cloexec (fnames.source_file (), "w");
- if (src == NULL)
- perror_with_name (_("Could not open source file for writing"));
- inner_cleanup = make_cleanup (cleanup_unlink_file,
- (void *) fnames.source_file ());
- if (fputs (code.c_str (), src) == EOF)
- perror_with_name (_("Could not write to source file"));
- fclose (src);
+ gdb::optional<gdb::unlinker> source_remover;
+
+ {
+ gdb_file_up src = gdb_fopen_cloexec (fnames.source_file (), "w");
+ if (src == NULL)
+ perror_with_name (_("Could not open source file for writing"));
+
+ source_remover.emplace (fnames.source_file ());
+
+ if (fputs (code.c_str (), src.get ()) == EOF)
+ perror_with_name (_("Could not write to source file"));
+ }
if (compile_debug)
fprintf_unfiltered (gdb_stdlog, "source file produced: %s\n\n",
@@ -620,7 +618,9 @@ compile_to_object (struct command_line *cmd, const char *cmd_string,
fprintf_unfiltered (gdb_stdlog, "object file produced: %s\n\n",
fnames.object_file ());
- discard_cleanups (inner_cleanup);
+ /* Keep the source file. */
+ source_remover->keep ();
+
do_cleanups (cleanup);
return fnames;
@@ -642,14 +642,13 @@ void
eval_compile_command (struct command_line *cmd, const char *cmd_string,
enum compile_i_scope_types scope, void *scope_data)
{
- struct cleanup *cleanup_unlink;
struct compile_module *compile_module;
compile_file_names fnames = compile_to_object (cmd, cmd_string, scope);
- cleanup_unlink = make_cleanup (cleanup_unlink_file,
- (void *) fnames.object_file ());
- make_cleanup (cleanup_unlink_file, (void *) fnames.source_file ());
+ gdb::unlinker object_remover (fnames.object_file ());
+ gdb::unlinker source_remover (fnames.source_file ());
+
compile_module = compile_object_load (fnames, scope, scope_data);
if (compile_module == NULL)
{
@@ -658,7 +657,11 @@ eval_compile_command (struct command_line *cmd, const char *cmd_string,
COMPILE_I_PRINT_VALUE_SCOPE, scope_data);
return;
}
- discard_cleanups (cleanup_unlink);
+
+ /* Keep the files. */
+ source_remover.keep ();
+ object_remover.keep ();
+
compile_object_run (compile_module);
}