mirror of git://gcc.gnu.org/git/gcc.git
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
This commit is contained in:
parent
67dab5e0a3
commit
c168eab92c
|
|
@ -1,3 +1,21 @@
|
||||||
|
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,
|
||||||
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,
|
||||||
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,
|
||||||
|
|
||||||
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,
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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 ()
|
||||||
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,
|
||||||
"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 *)
|
||||||
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:
|
||||||
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:
|
||||||
} // namespace gcc
|
} // namespace gcc
|
||||||
|
|
||||||
#endif /* JIT_RECORDING_H */
|
#endif /* JIT_RECORDING_H */
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
||||||
|
|
@ -537,6 +540,14 @@ context::dump_to_file (const std::string &path,
|
||||||
update_locations);
|
update_locations);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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
|
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;
|
||||||
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
|
||||||
|
|
||||||
/* 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);
|
||||||
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.
|
||||||
**********************************************************************/
|
**********************************************************************/
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue