On Sat, 2014-12-06 at 15:29 -0500, Ulrich Drepper wrote: > 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?
Thanks. Overall this is good, a few nitpicks inline below: > 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); > } If the user repeatedly calls set_str_option on the same opt, this will be a leak. So something like: /* Free any existing value. */ free (m_str_options[opt]); 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, Perhaps reword the comment to: The context takes a copy of the string, so the (const char *) buffer is not needed anymore after the call returns. */ Also, elsewhere in the header, there's a comment: All (const char *) string arguments passed to these functions are copied, so you don't need to keep them around. Note that this *isn't* the case for other parts of the API. I believe that your fix removes the last place where the API relies on a const char * outliving the context, so the last sentence of that comment can be dropped. OK with these fixes. Thanks Dave