This patch broken out of one I sent earlier with some extensions. It contains only little cleanups to the libgccjit code.
When creating the linker command line the code now uses an auto_vec instead of the fixed size array. The second change adds the missing context::set_str_option member function to the C++ interface. The third change it to the string option handling. Instead of just using the pointer passed to the function the code now makes a copy of the string. OK? gcc/ChangeLog: 2014-12-06 Ulrich Drepper <drep...@gmail.com> * jit/jit-playback.c (convert_to_dso): Use auto_vec instead of automatic array to build up command line. * jit/jit-recording.c (recording::context::set_str_option): Make copy of the string. (recording::context::~context): Free string options. * jit/jit-recording.h (recording::context): Adjust type of m_str_options member. * jit/libgccjit.h: Adjust comment about gcc_jit_context_set_str_option parameter begin used after the call. * jit/libgccjit++.h (gccjit::context): Add set_str_option member function. diff --git a/gcc/jit/jit-playback.c b/gcc/jit/jit-playback.c index ecdae80..6d1eb8a 100644 --- a/gcc/jit/jit-playback.c +++ b/gcc/jit/jit-playback.c @@ -1726,18 +1726,19 @@ convert_to_dso (const char *ctxt_progname) TV_ASSEMBLE. */ auto_timevar assemble_timevar (TV_ASSEMBLE); const char *errmsg; - const char *argv[7]; + auto_vec <const char *> argvec; +#define ADD_ARG(arg) argvec.safe_push (arg) int exit_status = 0; int err = 0; const char *gcc_driver_name = GCC_DRIVER_NAME; - argv[0] = gcc_driver_name; - argv[1] = "-shared"; + ADD_ARG (gcc_driver_name); + ADD_ARG ("-shared"); /* The input: assembler. */ - argv[2] = m_path_s_file; + ADD_ARG (m_path_s_file); /* The output: shared library. */ - argv[3] = "-o"; - argv[4] = m_path_so_file; + ADD_ARG ("-o"); + ADD_ARG (m_path_so_file); /* Don't use the linker plugin. If running with just a "make" and not a "make install", then we'd @@ -1746,17 +1747,17 @@ convert_to_dso (const char *ctxt_progname) libto_plugin is a .la at build time, with it becoming installed with ".so" suffix: i.e. it doesn't exist with a .so suffix until install time. */ - argv[5] = "-fno-use-linker-plugin"; + ADD_ARG ("-fno-use-linker-plugin"); /* pex argv arrays are NULL-terminated. */ - argv[6] = NULL; + ADD_ARG (NULL); /* pex_one's error-handling requires pname to be non-NULL. */ gcc_assert (ctxt_progname); errmsg = pex_one (PEX_SEARCH, /* int flags, */ gcc_driver_name, - const_cast<char * const *> (argv), + const_cast <char *const *> (argvec.address ()), ctxt_progname, /* const char *pname */ NULL, /* const char *outname */ NULL, /* const char *errname */ @@ -1783,6 +1784,7 @@ convert_to_dso (const char *ctxt_progname) getenv ("PATH")); return; } +#undef ADD_ARG } /* Top-level hook for playing back a recording context. diff --git a/gcc/jit/jit-recording.c b/gcc/jit/jit-recording.c --- a/gcc/jit/jit-recording.c +++ b/gcc/jit/jit-recording.c @@ -215,6 +215,9 @@ recording::context::~context () delete m; } + for (i = 0; i < GCC_JIT_NUM_STR_OPTIONS; ++i) + free (m_str_options[i]); + if (m_builtins_manager) delete m_builtins_manager; @@ -827,7 +830,7 @@ recording::context::set_str_option (enum gcc_jit_str_option opt, "unrecognized (enum gcc_jit_str_option) value: %i", opt); return; } - m_str_options[opt] = value; + m_str_options[opt] = xstrdup (value); } /* Set the given integer option for this context, or add an error if diff --git a/gcc/jit/jit-recording.h b/gcc/jit/jit-recording.h --- a/gcc/jit/jit-recording.h +++ b/gcc/jit/jit-recording.h @@ -246,7 +246,7 @@ private: char *m_first_error_str; bool m_owns_first_error_str; - const char *m_str_options[GCC_JIT_NUM_STR_OPTIONS]; + char *m_str_options[GCC_JIT_NUM_STR_OPTIONS]; int m_int_options[GCC_JIT_NUM_INT_OPTIONS]; bool m_bool_options[GCC_JIT_NUM_BOOL_OPTIONS]; diff --git a/gcc/jit/libgccjit++.h b/gcc/jit/libgccjit++.h --- a/gcc/jit/libgccjit++.h +++ b/gcc/jit/libgccjit++.h @@ -99,6 +99,9 @@ namespace gccjit void dump_to_file (const std::string &path, bool update_locations); + void set_str_option (enum gcc_jit_str_option opt, + const char *value); + void set_int_option (enum gcc_jit_int_option opt, int value); @@ -535,6 +538,14 @@ context::dump_to_file (const std::string &path, } inline void +context::set_str_option (enum gcc_jit_str_option opt, + const char *value) +{ + gcc_jit_context_set_str_option (m_inner_ctxt, opt, value); + +} + +inline void context::set_int_option (enum gcc_jit_int_option opt, int value) { diff --git a/gcc/jit/libgccjit.h b/gcc/jit/libgccjit.h --- a/gcc/jit/libgccjit.h +++ b/gcc/jit/libgccjit.h @@ -213,8 +213,8 @@ enum gcc_jit_bool_option /* Set a string option on the given context. - The context directly stores the (const char *), so the passed string - must outlive the context. */ + The (const char *) value is not needed anymore after the call + returns. */ extern void gcc_jit_context_set_str_option (gcc_jit_context *ctxt, enum gcc_jit_str_option opt,