+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>
* gdbhooks.py (class DWDieRefPrinter): New class.
playback::lvalue *
playback::context::
new_global (location *loc,
- type *type,
- const char *name)
+ type *type,
+ const char *name)
{
gcc_assert (type);
gcc_assert (name);
tree t_result = build4 (ARRAY_REF, t_type_star_ptr, t_ptr, t_index,
NULL_TREE, NULL_TREE);
if (loc)
- set_tree_location (t_result, loc);
+ set_tree_location (t_result, loc);
return new lvalue (this, t_result);
}
else
tree t_indirection = build1 (INDIRECT_REF, t_type_star_ptr, t_address);
if (loc)
- {
- set_tree_location (t_sizeof, loc);
- set_tree_location (t_offset, loc);
- set_tree_location (t_address, loc);
- set_tree_location (t_indirection, loc);
- }
+ {
+ set_tree_location (t_sizeof, loc);
+ set_tree_location (t_offset, loc);
+ set_tree_location (t_address, loc);
+ set_tree_location (t_indirection, loc);
+ }
return new lvalue (this, t_indirection);
}
if (TREE_TYPE (t_rvalue) != TREE_TYPE (t_lvalue))
{
t_rvalue = build1 (CONVERT_EXPR,
- TREE_TYPE (t_lvalue),
- t_rvalue);
+ TREE_TYPE (t_lvalue),
+ t_rvalue);
if (loc)
set_tree_location (t_rvalue, loc);
}
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_tempdir->get_path_s_file ();
+ ADD_ARG (m_tempdir->get_path_s_file ());
/* The output: shared library. */
- argv[3] = "-o";
- argv[4] = m_tempdir->get_path_so_file ();
+ ADD_ARG ("-o");
+ ADD_ARG (m_tempdir->get_path_so_file ());
/* Don't use the linker plugin.
If running with just a "make" and not a "make install", then we'd
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 */
getenv ("PATH"));
return;
}
+#undef ADD_ARG
}
/* Dynamically-link the built DSO file into this process, using dlopen.
if (parent_ctxt)
{
/* 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,
- parent_ctxt->m_str_options,
- sizeof (m_str_options));
+ parent_ctxt->m_str_options,
+ sizeof (m_str_options));
memcpy (m_int_options,
- parent_ctxt->m_int_options,
- sizeof (m_int_options));
+ parent_ctxt->m_int_options,
+ sizeof (m_int_options));
memcpy (m_bool_options,
- parent_ctxt->m_bool_options,
- sizeof (m_bool_options));
+ parent_ctxt->m_bool_options,
+ sizeof (m_bool_options));
}
else
{
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;
"unrecognized (enum gcc_jit_str_option) value: %i", opt);
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
declaration of this form:
struct/union NAME {
- TYPE_1 NAME_1;
- TYPE_2 NAME_2;
+ TYPE_1 NAME_1;
+ TYPE_2 NAME_2;
....
- TYPE_N NAME_N;
+ TYPE_N NAME_N;
};
to the dump. */
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];
} // namespace gcc
#endif /* JIT_RECORDING_H */
-
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);
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
context::set_int_option (enum gcc_jit_int_option opt,
int value)
The class hierarchy looks like this:
+- gcc_jit_object
- +- gcc_jit_location
- +- gcc_jit_type
+ +- gcc_jit_location
+ +- gcc_jit_type
+- gcc_jit_struct
- +- gcc_jit_field
- +- gcc_jit_function
- +- gcc_jit_block
- +- gcc_jit_rvalue
- +- gcc_jit_lvalue
- +- gcc_jit_param
+ +- gcc_jit_field
+ +- gcc_jit_function
+ +- gcc_jit_block
+ +- gcc_jit_rvalue
+ +- gcc_jit_lvalue
+ +- gcc_jit_param
*/
typedef struct gcc_jit_object gcc_jit_object;
/* Set a string option on the given context.
- The context directly stores the (const char *), so the passed string
- must outlive the context. */
+ The context takes a copy of the string, so the
+ (const char *) buffer 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,
released their context.
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.
+ copied, so you don't need to keep them around.
You create code by adding a sequence of statements to blocks.
**********************************************************************/