Commit c168eab9 by Ulrich Drepper Committed by Ulrich Drepper

Minor interface cleanups of libgccjit

        Minor interface cleanups of libgccjit
        * 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.
        Update comment now that all interfaces are copy strings
        if necessary.
        * jit/libgccjit++.h (gccjit::context): Add set_str_option
        member function.

From-SVN: r218617
parent 67dab5e0
2014-12-10 Ulrich Drepper <drepper@gmail.com>
Minor interface cleanups of libgccjit
* 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.
Update comment now that all interfaces are copy strings
if necessary.
* jit/libgccjit++.h (gccjit::context): Add set_str_option
member function.
2014-12-10 Aldy Hernandez <aldyh@redhat.com> 2014-12-10 Aldy Hernandez <aldyh@redhat.com>
* gdbhooks.py (class DWDieRefPrinter): New class. * gdbhooks.py (class DWDieRefPrinter): New class.
...@@ -454,8 +454,8 @@ new_function (location *loc, ...@@ -454,8 +454,8 @@ new_function (location *loc,
playback::lvalue * playback::lvalue *
playback::context:: playback::context::
new_global (location *loc, new_global (location *loc,
type *type, type *type,
const char *name) const char *name)
{ {
gcc_assert (type); gcc_assert (type);
gcc_assert (name); gcc_assert (name);
...@@ -943,7 +943,7 @@ new_array_access (location *loc, ...@@ -943,7 +943,7 @@ new_array_access (location *loc,
tree t_result = build4 (ARRAY_REF, t_type_star_ptr, t_ptr, t_index, tree t_result = build4 (ARRAY_REF, t_type_star_ptr, t_ptr, t_index,
NULL_TREE, NULL_TREE); NULL_TREE, NULL_TREE);
if (loc) if (loc)
set_tree_location (t_result, loc); set_tree_location (t_result, loc);
return new lvalue (this, t_result); return new lvalue (this, t_result);
} }
else else
...@@ -958,12 +958,12 @@ new_array_access (location *loc, ...@@ -958,12 +958,12 @@ new_array_access (location *loc,
tree t_indirection = build1 (INDIRECT_REF, t_type_star_ptr, t_address); tree t_indirection = build1 (INDIRECT_REF, t_type_star_ptr, t_address);
if (loc) if (loc)
{ {
set_tree_location (t_sizeof, loc); set_tree_location (t_sizeof, loc);
set_tree_location (t_offset, loc); set_tree_location (t_offset, loc);
set_tree_location (t_address, loc); set_tree_location (t_address, loc);
set_tree_location (t_indirection, loc); set_tree_location (t_indirection, loc);
} }
return new lvalue (this, t_indirection); return new lvalue (this, t_indirection);
} }
...@@ -1331,8 +1331,8 @@ add_assignment (location *loc, ...@@ -1331,8 +1331,8 @@ add_assignment (location *loc,
if (TREE_TYPE (t_rvalue) != TREE_TYPE (t_lvalue)) if (TREE_TYPE (t_rvalue) != TREE_TYPE (t_lvalue))
{ {
t_rvalue = build1 (CONVERT_EXPR, t_rvalue = build1 (CONVERT_EXPR,
TREE_TYPE (t_lvalue), TREE_TYPE (t_lvalue),
t_rvalue); t_rvalue);
if (loc) if (loc)
set_tree_location (t_rvalue, loc); set_tree_location (t_rvalue, loc);
} }
...@@ -1818,18 +1818,19 @@ convert_to_dso (const char *ctxt_progname) ...@@ -1818,18 +1818,19 @@ convert_to_dso (const char *ctxt_progname)
TV_ASSEMBLE. */ TV_ASSEMBLE. */
auto_timevar assemble_timevar (TV_ASSEMBLE); auto_timevar assemble_timevar (TV_ASSEMBLE);
const char *errmsg; 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 exit_status = 0;
int err = 0; int err = 0;
const char *gcc_driver_name = GCC_DRIVER_NAME; const char *gcc_driver_name = GCC_DRIVER_NAME;
argv[0] = gcc_driver_name; ADD_ARG (gcc_driver_name);
argv[1] = "-shared"; ADD_ARG ("-shared");
/* The input: assembler. */ /* The input: assembler. */
argv[2] = m_tempdir->get_path_s_file (); ADD_ARG (m_tempdir->get_path_s_file ());
/* The output: shared library. */ /* The output: shared library. */
argv[3] = "-o"; ADD_ARG ("-o");
argv[4] = m_tempdir->get_path_so_file (); ADD_ARG (m_tempdir->get_path_so_file ());
/* Don't use the linker plugin. /* Don't use the linker plugin.
If running with just a "make" and not a "make install", then we'd If running with just a "make" and not a "make install", then we'd
...@@ -1838,17 +1839,17 @@ convert_to_dso (const char *ctxt_progname) ...@@ -1838,17 +1839,17 @@ convert_to_dso (const char *ctxt_progname)
libto_plugin is a .la at build time, with it becoming installed with 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 ".so" suffix: i.e. it doesn't exist with a .so suffix until install
time. */ time. */
argv[5] = "-fno-use-linker-plugin"; ADD_ARG ("-fno-use-linker-plugin");
/* pex argv arrays are NULL-terminated. */ /* pex argv arrays are NULL-terminated. */
argv[6] = NULL; ADD_ARG (NULL);
/* pex_one's error-handling requires pname to be non-NULL. */ /* pex_one's error-handling requires pname to be non-NULL. */
gcc_assert (ctxt_progname); gcc_assert (ctxt_progname);
errmsg = pex_one (PEX_SEARCH, /* int flags, */ errmsg = pex_one (PEX_SEARCH, /* int flags, */
gcc_driver_name, gcc_driver_name,
const_cast<char * const *> (argv), const_cast <char *const *> (argvec.address ()),
ctxt_progname, /* const char *pname */ ctxt_progname, /* const char *pname */
NULL, /* const char *outname */ NULL, /* const char *outname */
NULL, /* const char *errname */ NULL, /* const char *errname */
...@@ -1875,6 +1876,7 @@ convert_to_dso (const char *ctxt_progname) ...@@ -1875,6 +1876,7 @@ convert_to_dso (const char *ctxt_progname)
getenv ("PATH")); getenv ("PATH"));
return; return;
} }
#undef ADD_ARG
} }
/* Dynamically-link the built DSO file into this process, using dlopen. /* Dynamically-link the built DSO file into this process, using dlopen.
......
...@@ -182,16 +182,16 @@ recording::context::context (context *parent_ctxt) ...@@ -182,16 +182,16 @@ recording::context::context (context *parent_ctxt)
if (parent_ctxt) if (parent_ctxt)
{ {
/* Inherit options from parent. /* Inherit options from parent.
Note that the first memcpy means copying pointers to strings. */ Note that the first memcpy means copying pointers to strings. */
memcpy (m_str_options, memcpy (m_str_options,
parent_ctxt->m_str_options, parent_ctxt->m_str_options,
sizeof (m_str_options)); sizeof (m_str_options));
memcpy (m_int_options, memcpy (m_int_options,
parent_ctxt->m_int_options, parent_ctxt->m_int_options,
sizeof (m_int_options)); sizeof (m_int_options));
memcpy (m_bool_options, memcpy (m_bool_options,
parent_ctxt->m_bool_options, parent_ctxt->m_bool_options,
sizeof (m_bool_options)); sizeof (m_bool_options));
} }
else else
{ {
...@@ -215,6 +215,9 @@ recording::context::~context () ...@@ -215,6 +215,9 @@ recording::context::~context ()
delete m; delete m;
} }
for (i = 0; i < GCC_JIT_NUM_STR_OPTIONS; ++i)
free (m_str_options[i]);
if (m_builtins_manager) if (m_builtins_manager)
delete m_builtins_manager; delete m_builtins_manager;
...@@ -827,7 +830,8 @@ recording::context::set_str_option (enum gcc_jit_str_option opt, ...@@ -827,7 +830,8 @@ recording::context::set_str_option (enum gcc_jit_str_option opt,
"unrecognized (enum gcc_jit_str_option) value: %i", opt); "unrecognized (enum gcc_jit_str_option) value: %i", opt);
return; return;
} }
m_str_options[opt] = 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 /* Set the given integer option for this context, or add an error if
...@@ -1950,10 +1954,10 @@ recording::fields::replay_into (replayer *) ...@@ -1950,10 +1954,10 @@ recording::fields::replay_into (replayer *)
declaration of this form: declaration of this form:
struct/union NAME { struct/union NAME {
TYPE_1 NAME_1; TYPE_1 NAME_1;
TYPE_2 NAME_2; TYPE_2 NAME_2;
.... ....
TYPE_N NAME_N; TYPE_N NAME_N;
}; };
to the dump. */ to the dump. */
......
...@@ -260,7 +260,7 @@ private: ...@@ -260,7 +260,7 @@ private:
char *m_first_error_str; char *m_first_error_str;
bool m_owns_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]; int m_int_options[GCC_JIT_NUM_INT_OPTIONS];
bool m_bool_options[GCC_JIT_NUM_BOOL_OPTIONS]; bool m_bool_options[GCC_JIT_NUM_BOOL_OPTIONS];
...@@ -1601,4 +1601,3 @@ private: ...@@ -1601,4 +1601,3 @@ private:
} // namespace gcc } // namespace gcc
#endif /* JIT_RECORDING_H */ #endif /* JIT_RECORDING_H */
...@@ -102,6 +102,9 @@ namespace gccjit ...@@ -102,6 +102,9 @@ namespace gccjit
void dump_to_file (const std::string &path, void dump_to_file (const std::string &path,
bool update_locations); 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, void set_int_option (enum gcc_jit_int_option opt,
int value); int value);
...@@ -538,6 +541,14 @@ context::dump_to_file (const std::string &path, ...@@ -538,6 +541,14 @@ context::dump_to_file (const std::string &path,
} }
inline void 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, context::set_int_option (enum gcc_jit_int_option opt,
int value) int value)
{ {
......
...@@ -50,15 +50,15 @@ typedef struct gcc_jit_result gcc_jit_result; ...@@ -50,15 +50,15 @@ typedef struct gcc_jit_result gcc_jit_result;
The class hierarchy looks like this: The class hierarchy looks like this:
+- gcc_jit_object +- gcc_jit_object
+- gcc_jit_location +- gcc_jit_location
+- gcc_jit_type +- gcc_jit_type
+- gcc_jit_struct +- gcc_jit_struct
+- gcc_jit_field +- gcc_jit_field
+- gcc_jit_function +- gcc_jit_function
+- gcc_jit_block +- gcc_jit_block
+- gcc_jit_rvalue +- gcc_jit_rvalue
+- gcc_jit_lvalue +- gcc_jit_lvalue
+- gcc_jit_param +- gcc_jit_param
*/ */
typedef struct gcc_jit_object gcc_jit_object; typedef struct gcc_jit_object gcc_jit_object;
...@@ -213,8 +213,9 @@ enum gcc_jit_bool_option ...@@ -213,8 +213,9 @@ enum gcc_jit_bool_option
/* Set a string option on the given context. /* Set a string option on the given context.
The context directly stores the (const char *), so the passed string The context takes a copy of the string, so the
must outlive the context. */ (const char *) buffer is not needed anymore after the call
returns. */
extern void extern void
gcc_jit_context_set_str_option (gcc_jit_context *ctxt, gcc_jit_context_set_str_option (gcc_jit_context *ctxt,
enum gcc_jit_str_option opt, enum gcc_jit_str_option opt,
...@@ -288,8 +289,7 @@ gcc_jit_result_release (gcc_jit_result *result); ...@@ -288,8 +289,7 @@ gcc_jit_result_release (gcc_jit_result *result);
released their context. released their context.
All (const char *) string arguments passed to these functions are 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* copied, so you don't need to keep them around.
the case for other parts of the API.
You create code by adding a sequence of statements to blocks. You create code by adding a sequence of statements to blocks.
**********************************************************************/ **********************************************************************/
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment