Commit eeafb319 by David Malcolm Committed by David Malcolm

PR jit/64020: Fixes to handling of builtins

	PR jit/64020
	* docs/topics/types.rst (Standard types) Add new enum values to
	the table of enum gcc_jit_types: GCC_JIT_TYPE_COMPLEX_FLOAT,
	GCC_JIT_TYPE_COMPLEX_DOUBLE, GCC_JIT_TYPE_COMPLEX_LONG_DOUBLE.
	Widen the left-hand column so that
	GCC_JIT_TYPE_COMPLEX_LONG_DOUBLE will fit.
	* docs/_build/texinfo/libgccjit.texi: Regenerate.

	* jit-builtins.c: Include stringpool.h and jit-playback.h.
	Move everything out of the gcc::jit::recording namespace into
	just gcc::jit.
	(struct builtin_data): Add fields "fnclass", "attr", and
	"implicit_p".
	(DEF_BUILTIN): Update macro so populate the new fields.
	(builtins_manager::builtins_manager): Update for move out of
	recording namespace.  Initialize the m_attributes array.
	(builtins_manager::get_builtin_function): Likewise.
	(builtins_manager::get_builtin_function_by_id): New function.
	(builtins_manager::make_builtin_function): Update for move out of
	recording namespace.  Add fix for PR jit/64020 by detecting
	specific builtin ids and having them ensure that builtins for
	other ids are created as necessary.
	(builtins_manager::get_type): Update for move out of recording
	namespace.
	(builtins_manager::make_type): Likewise.  Add some missing
	#undefs.
	(builtins_manager::make_primitive_type): Update for move out of
	recording namespace.  Implement the three BT_COMPLEX_ cases and
	BT_DOUBLE_PTR.
	(builtins_manager::make_fn_type): Update for move out of recording
	namespace.
	(builtins_manager::make_ptr_type): Likewise.
	(builtins_manager::finish_playback): New function.
	(builtins_manager::get_class): New function.
	(builtins_manager::implicit_p): New function.
	(builtins_manager::get_attrs_tree): Two new functions.
	(builtins_manager::make_attrs_tree): New function.

	* jit-builtins.h: Move everything out of the gcc::jit::recording
	namespace into just gcc::jit.
	(enum built_in_attribute): New.
	(builtins_manager::builtins_manager): Update decl for namespace
	change.
	(builtins_manager::get_builtin_function): Likewise.
	(builtins_manager::get_class): New.
	(builtins_manager::implicit_p): New.
	(builtins_manager::get_attrs_tree): Two new functions.
	(builtins_manager::make_attrs_tree): New function.
	(builtins_manager::finish_playback): New.
	(builtins_manager::get_builtin_function_by_id): New.
	(builtins_manager::make_builtin_function): Update decl for
	namespace change.
	(builtins_manager::get_type): Likewise.
	(builtins_manager::make_type): Likewise.
	(builtins_manager::make_primitive_type): Likewise.
	(builtins_manager::make_fn_type): Likewise.
	(builtins_manager::make_ptr_type): Likewise.
	(builtins_manager): Likewise for fields.  Add new field
	"m_attributes".

	* jit-common.h (NUM_GCC_JIT_TYPES): Update.
	(builtins_manager): Update forward decl to reflect namespace
	change.

	* jit-playback.c: Include attribs.h and jit-builtins.h.
	(gcc::jit::playback::context::get_tree_node_for_type): Add cases
	for the new COMPLEX_ types.
	(gcc::jit::playback::context::new_function): If creating a
	builtin, set the DECL_BUILT_IN_CLASS and attributes on the fndecl,
	and call set_builtin_decl.
	(gcc::jit::playback::context::replay): If we have a
	builtins_manager, call its finish_playback method when we're done.

	* jit-playback.h:
	(gcc::jit::playback::context::get_builtins_manager): New function.

	* jit-recording.c
	(gcc::jit::recording::context::get_builtins_manager): New function.
	(gcc::jit::recording::get_builtin_function): Use
	get_builtins_manager, in case we're a child context.
	(gcc::jit::recording::memento_of_get_type::dereference): Add the
	COMPLEX_ types.
	(gcc::jit::recording::memento_of_get_type::is_int): Likewise.
	(gcc::jit::recording::memento_of_get_type::is_float): Likewise.
	(gcc::jit::recording::memento_of_get_type::is_bool): Likewise.
	(get_type_strings): Likewise.

	* jit-recording.h
	(gcc::jit::recording::context::get_builtins_manager): New.

	* libgccjit.h (enum gcc_jit_types): Add
	GCC_JIT_TYPE_COMPLEX_FLOAT, GCC_JIT_TYPE_COMPLEX_DOUBLE,
	GCC_JIT_TYPE_COMPLEX_LONG_DOUBLE.

From-SVN: r218240
parent 23844fd7
2014-12-01 David Malcolm <dmalcolm@redhat.com> 2014-12-01 David Malcolm <dmalcolm@redhat.com>
PR jit/64020
* docs/topics/types.rst (Standard types) Add new enum values to
the table of enum gcc_jit_types: GCC_JIT_TYPE_COMPLEX_FLOAT,
GCC_JIT_TYPE_COMPLEX_DOUBLE, GCC_JIT_TYPE_COMPLEX_LONG_DOUBLE.
Widen the left-hand column so that
GCC_JIT_TYPE_COMPLEX_LONG_DOUBLE will fit.
* docs/_build/texinfo/libgccjit.texi: Regenerate.
* jit-builtins.c: Include stringpool.h and jit-playback.h.
Move everything out of the gcc::jit::recording namespace into
just gcc::jit.
(struct builtin_data): Add fields "fnclass", "attr", and
"implicit_p".
(DEF_BUILTIN): Update macro so populate the new fields.
(builtins_manager::builtins_manager): Update for move out of
recording namespace. Initialize the m_attributes array.
(builtins_manager::get_builtin_function): Likewise.
(builtins_manager::get_builtin_function_by_id): New function.
(builtins_manager::make_builtin_function): Update for move out of
recording namespace. Add fix for PR jit/64020 by detecting
specific builtin ids and having them ensure that builtins for
other ids are created as necessary.
(builtins_manager::get_type): Update for move out of recording
namespace.
(builtins_manager::make_type): Likewise. Add some missing
#undefs.
(builtins_manager::make_primitive_type): Update for move out of
recording namespace. Implement the three BT_COMPLEX_ cases and
BT_DOUBLE_PTR.
(builtins_manager::make_fn_type): Update for move out of recording
namespace.
(builtins_manager::make_ptr_type): Likewise.
(builtins_manager::finish_playback): New function.
(builtins_manager::get_class): New function.
(builtins_manager::implicit_p): New function.
(builtins_manager::get_attrs_tree): Two new functions.
(builtins_manager::make_attrs_tree): New function.
* jit-builtins.h: Move everything out of the gcc::jit::recording
namespace into just gcc::jit.
(enum built_in_attribute): New.
(builtins_manager::builtins_manager): Update decl for namespace
change.
(builtins_manager::get_builtin_function): Likewise.
(builtins_manager::get_class): New.
(builtins_manager::implicit_p): New.
(builtins_manager::get_attrs_tree): Two new functions.
(builtins_manager::make_attrs_tree): New function.
(builtins_manager::finish_playback): New.
(builtins_manager::get_builtin_function_by_id): New.
(builtins_manager::make_builtin_function): Update decl for
namespace change.
(builtins_manager::get_type): Likewise.
(builtins_manager::make_type): Likewise.
(builtins_manager::make_primitive_type): Likewise.
(builtins_manager::make_fn_type): Likewise.
(builtins_manager::make_ptr_type): Likewise.
(builtins_manager): Likewise for fields. Add new field
"m_attributes".
* jit-common.h (NUM_GCC_JIT_TYPES): Update.
(builtins_manager): Update forward decl to reflect namespace
change.
* jit-playback.c: Include attribs.h and jit-builtins.h.
(gcc::jit::playback::context::get_tree_node_for_type): Add cases
for the new COMPLEX_ types.
(gcc::jit::playback::context::new_function): If creating a
builtin, set the DECL_BUILT_IN_CLASS and attributes on the fndecl,
and call set_builtin_decl.
(gcc::jit::playback::context::replay): If we have a
builtins_manager, call its finish_playback method when we're done.
* jit-playback.h:
(gcc::jit::playback::context::get_builtins_manager): New function.
* jit-recording.c
(gcc::jit::recording::context::get_builtins_manager): New function.
(gcc::jit::recording::get_builtin_function): Use
get_builtins_manager, in case we're a child context.
(gcc::jit::recording::memento_of_get_type::dereference): Add the
COMPLEX_ types.
(gcc::jit::recording::memento_of_get_type::is_int): Likewise.
(gcc::jit::recording::memento_of_get_type::is_float): Likewise.
(gcc::jit::recording::memento_of_get_type::is_bool): Likewise.
(get_type_strings): Likewise.
* jit-recording.h
(gcc::jit::recording::context::get_builtins_manager): New.
* libgccjit.h (enum gcc_jit_types): Add
GCC_JIT_TYPE_COMPLEX_FLOAT, GCC_JIT_TYPE_COMPLEX_DOUBLE,
GCC_JIT_TYPE_COMPLEX_LONG_DOUBLE.
2014-12-01 David Malcolm <dmalcolm@redhat.com>
* jit-builtins.c * jit-builtins.c
(gcc::jit::recording::builtins_manager::get_builtin_function): (gcc::jit::recording::builtins_manager::get_builtin_function):
Check for NULL return from make_builtin_function. Check for NULL return from make_builtin_function.
......
...@@ -57,9 +57,9 @@ Standard types ...@@ -57,9 +57,9 @@ Standard types
Access a specific type. The available types are: Access a specific type. The available types are:
========================================= ================================ ========================================== ================================
`enum gcc_jit_types` value Meaning `enum gcc_jit_types` value Meaning
========================================= ================================ ========================================== ================================
:c:data:`GCC_JIT_TYPE_VOID` C's ``void`` type. :c:data:`GCC_JIT_TYPE_VOID` C's ``void`` type.
:c:data:`GCC_JIT_TYPE_VOID_PTR` C's ``void *``. :c:data:`GCC_JIT_TYPE_VOID_PTR` C's ``void *``.
:c:data:`GCC_JIT_TYPE_BOOL` C++'s ``bool`` type; also C99's :c:data:`GCC_JIT_TYPE_BOOL` C++'s ``bool`` type; also C99's
...@@ -82,7 +82,10 @@ Standard types ...@@ -82,7 +82,10 @@ Standard types
:c:data:`GCC_JIT_TYPE_CONST_CHAR_PTR` C type: ``(const char *)`` :c:data:`GCC_JIT_TYPE_CONST_CHAR_PTR` C type: ``(const char *)``
:c:data:`GCC_JIT_TYPE_SIZE_T` C's ``size_t`` type :c:data:`GCC_JIT_TYPE_SIZE_T` C's ``size_t`` type
:c:data:`GCC_JIT_TYPE_FILE_PTR` C type: ``(FILE *)`` :c:data:`GCC_JIT_TYPE_FILE_PTR` C type: ``(FILE *)``
========================================= ================================ :c:data:`GCC_JIT_TYPE_COMPLEX_FLOAT` C99's ``_Complex float``
:c:data:`GCC_JIT_TYPE_COMPLEX_DOUBLE` C99's ``_Complex double``
:c:data:`GCC_JIT_TYPE_COMPLEX_LONG_DOUBLE` C99's ``_Complex long double``
========================================== ================================
.. function:: gcc_jit_type *\ .. function:: gcc_jit_type *\
gcc_jit_context_get_int_type (gcc_jit_context *ctxt, \ gcc_jit_context_get_int_type (gcc_jit_context *ctxt, \
......
...@@ -26,8 +26,6 @@ namespace gcc { ...@@ -26,8 +26,6 @@ namespace gcc {
namespace jit { namespace jit {
namespace recording {
/* Create an enum of the builtin types. */ /* Create an enum of the builtin types. */
enum jit_builtin_type enum jit_builtin_type
...@@ -71,43 +69,91 @@ enum jit_builtin_type ...@@ -71,43 +69,91 @@ enum jit_builtin_type
BT_LAST BT_LAST
}; /* enum jit_builtin_type */ }; /* enum jit_builtin_type */
/* Create an enum of the attributes that can be present on builtins. */
enum built_in_attribute
{
#define DEF_ATTR_NULL_TREE(ENUM) ENUM,
#define DEF_ATTR_INT(ENUM, VALUE) ENUM,
#define DEF_ATTR_STRING(ENUM, VALUE) ENUM,
#define DEF_ATTR_IDENT(ENUM, STRING) ENUM,
#define DEF_ATTR_TREE_LIST(ENUM, PURPOSE, VALUE, CHAIN) ENUM,
#include "builtin-attrs.def"
#undef DEF_ATTR_NULL_TREE
#undef DEF_ATTR_INT
#undef DEF_ATTR_STRING
#undef DEF_ATTR_IDENT
#undef DEF_ATTR_TREE_LIST
ATTR_LAST
};
/***********************************************************************/ /***********************************************************************/
class builtins_manager class builtins_manager
{ {
public: public:
builtins_manager (context *ctxt); builtins_manager (recording::context *ctxt);
function * recording::function *
get_builtin_function (const char *name); get_builtin_function (const char *name);
static enum built_in_class
get_class (enum built_in_function builtin_id);
static bool
implicit_p (enum built_in_function builtin_id);
tree
get_attrs_tree (enum built_in_function builtin_id);
tree
get_attrs_tree (enum built_in_attribute attr);
void
finish_playback (void);
private: private:
function *make_builtin_function (enum built_in_function builtin_id); recording::function *
get_builtin_function_by_id (enum built_in_function builtin_id);
recording::function *
make_builtin_function (enum built_in_function builtin_id);
type *get_type (enum jit_builtin_type type_id); recording::type *
get_type (enum jit_builtin_type type_id);
type *make_type (enum jit_builtin_type type_id); recording::type *
make_type (enum jit_builtin_type type_id);
type* recording::type*
make_primitive_type (enum jit_builtin_type type_id); make_primitive_type (enum jit_builtin_type type_id);
function_type* recording::function_type*
make_fn_type (enum jit_builtin_type type_id, make_fn_type (enum jit_builtin_type type_id,
enum jit_builtin_type return_type_id, enum jit_builtin_type return_type_id,
bool is_variadic, bool is_variadic,
int num_args, ...); int num_args, ...);
type* recording::type*
make_ptr_type (enum jit_builtin_type type_id, make_ptr_type (enum jit_builtin_type type_id,
enum jit_builtin_type other_type_id); enum jit_builtin_type other_type_id);
tree
make_attrs_tree (enum built_in_attribute attr);
private: private:
context *m_ctxt; /* Recording fields. */
type *m_types[BT_LAST]; recording::context *m_ctxt;
function *m_builtin_functions[END_BUILTINS]; recording::type *m_types[BT_LAST];
recording::function *m_builtin_functions[END_BUILTINS];
/* Playback fields. */
/* m_attributes is not GTY-marked, but is only ever used from within
the region of playback::context::replay () in which a GC can't
happen. */
tree m_attributes[ATTR_LAST];
}; };
} // namespace recording
} // namespace jit } // namespace jit
} // namespace gcc } // namespace gcc
......
...@@ -34,7 +34,7 @@ along with GCC; see the file COPYING3. If not see ...@@ -34,7 +34,7 @@ along with GCC; see the file COPYING3. If not see
#endif #endif
#endif #endif
const int NUM_GCC_JIT_TYPES = GCC_JIT_TYPE_FILE_PTR + 1; const int NUM_GCC_JIT_TYPES = GCC_JIT_TYPE_COMPLEX_LONG_DOUBLE + 1;
/* This comment is included by the docs. /* This comment is included by the docs.
...@@ -97,6 +97,7 @@ namespace jit { ...@@ -97,6 +97,7 @@ namespace jit {
class result; class result;
class dump; class dump;
class builtins_manager; // declared within jit-builtins.h
namespace recording { namespace recording {
...@@ -104,7 +105,6 @@ namespace recording { ...@@ -104,7 +105,6 @@ namespace recording {
/* Indentation indicates inheritance: */ /* Indentation indicates inheritance: */
class context; class context;
class builtins_manager; // declared within jit-builtins.h
class memento; class memento;
class string; class string;
class location; class location;
......
...@@ -46,10 +46,12 @@ along with GCC; see the file COPYING3. If not see ...@@ -46,10 +46,12 @@ along with GCC; see the file COPYING3. If not see
#include "print-tree.h" #include "print-tree.h"
#include "gimplify.h" #include "gimplify.h"
#include "gcc-driver-name.h" #include "gcc-driver-name.h"
#include "attribs.h"
#include "jit-common.h" #include "jit-common.h"
#include "jit-playback.h" #include "jit-playback.h"
#include "jit-result.h" #include "jit-result.h"
#include "jit-builtins.h"
/* gcc::jit::playback::context::build_cast uses the convert.h API, /* gcc::jit::playback::context::build_cast uses the convert.h API,
...@@ -198,6 +200,13 @@ get_tree_node_for_type (enum gcc_jit_types type_) ...@@ -198,6 +200,13 @@ get_tree_node_for_type (enum gcc_jit_types type_)
case GCC_JIT_TYPE_FILE_PTR: case GCC_JIT_TYPE_FILE_PTR:
return fileptr_type_node; return fileptr_type_node;
case GCC_JIT_TYPE_COMPLEX_FLOAT:
return complex_float_type_node;
case GCC_JIT_TYPE_COMPLEX_DOUBLE:
return complex_double_type_node;
case GCC_JIT_TYPE_COMPLEX_LONG_DOUBLE:
return complex_long_double_type_node;
} }
return NULL; return NULL;
...@@ -399,10 +408,21 @@ new_function (location *loc, ...@@ -399,10 +408,21 @@ new_function (location *loc,
if (builtin_id) if (builtin_id)
{ {
DECL_BUILT_IN_CLASS (fndecl) = BUILT_IN_NORMAL;
DECL_FUNCTION_CODE (fndecl) = builtin_id; DECL_FUNCTION_CODE (fndecl) = builtin_id;
gcc_assert (loc == NULL); gcc_assert (loc == NULL);
DECL_SOURCE_LOCATION (fndecl) = BUILTINS_LOCATION; DECL_SOURCE_LOCATION (fndecl) = BUILTINS_LOCATION;
DECL_BUILT_IN_CLASS (fndecl) =
builtins_manager::get_class (builtin_id);
set_builtin_decl (builtin_id, fndecl,
builtins_manager::implicit_p (builtin_id));
builtins_manager *bm = get_builtins_manager ();
tree attrs = bm->get_attrs_tree (builtin_id);
if (attrs)
decl_attributes (&fndecl, attrs, ATTR_FLAG_BUILT_IN);
else
decl_attributes (&fndecl, NULL_TREE, 0);
} }
if (kind != GCC_JIT_FUNCTION_IMPORTED) if (kind != GCC_JIT_FUNCTION_IMPORTED)
...@@ -1795,6 +1815,14 @@ replay () ...@@ -1795,6 +1815,14 @@ replay ()
refs. Hence we must stop using them before the GC can run. */ refs. Hence we must stop using them before the GC can run. */
m_recording_ctxt->disassociate_from_playback (); m_recording_ctxt->disassociate_from_playback ();
/* The builtins_manager, if any, is associated with the recording::context
and might be reused for future compiles on other playback::contexts,
but its m_attributes array is not GTY-labeled and hence will become
nonsense if the GC runs. Purge this state. */
builtins_manager *bm = get_builtins_manager ();
if (bm)
bm->finish_playback ();
timevar_pop (TV_JIT_REPLAY); timevar_pop (TV_JIT_REPLAY);
if (!errors_occurred ()) if (!errors_occurred ())
......
...@@ -175,6 +175,11 @@ public: ...@@ -175,6 +175,11 @@ public:
return m_recording_ctxt->get_bool_option (opt); return m_recording_ctxt->get_bool_option (opt);
} }
builtins_manager *get_builtins_manager () const
{
return m_recording_ctxt->get_builtins_manager ();
}
result * result *
compile (); compile ();
......
...@@ -580,6 +580,25 @@ recording::context::new_function (recording::location *loc, ...@@ -580,6 +580,25 @@ recording::context::new_function (recording::location *loc,
return result; return result;
} }
/* Locate the builtins_manager (if any) for this family of contexts,
creating it if it doesn't exist already.
All of the recording contexts in a family share one builtins_manager:
if we have a child context, follow the parent links to get the
ultimate ancestor context, and look for it/store it there. */
builtins_manager *
recording::context::get_builtins_manager ()
{
if (m_parent_ctxt)
return m_parent_ctxt->get_builtins_manager ();
if (!m_builtins_manager)
m_builtins_manager = new builtins_manager (this);
return m_builtins_manager;
}
/* Get a recording::function instance, which is lazily-created and added /* Get a recording::function instance, which is lazily-created and added
to the context's lists of mementos. to the context's lists of mementos.
...@@ -589,9 +608,8 @@ recording::context::new_function (recording::location *loc, ...@@ -589,9 +608,8 @@ recording::context::new_function (recording::location *loc,
recording::function * recording::function *
recording::context::get_builtin_function (const char *name) recording::context::get_builtin_function (const char *name)
{ {
if (!m_builtins_manager) builtins_manager *bm = get_builtins_manager ();
m_builtins_manager = new builtins_manager (this); return bm->get_builtin_function (name);
return m_builtins_manager->get_builtin_function (name);
} }
/* Create a recording::global instance and add it to this context's list /* Create a recording::global instance and add it to this context's list
...@@ -1248,6 +1266,9 @@ recording::memento_of_get_type::dereference () ...@@ -1248,6 +1266,9 @@ recording::memento_of_get_type::dereference ()
case GCC_JIT_TYPE_FLOAT: case GCC_JIT_TYPE_FLOAT:
case GCC_JIT_TYPE_DOUBLE: case GCC_JIT_TYPE_DOUBLE:
case GCC_JIT_TYPE_LONG_DOUBLE: case GCC_JIT_TYPE_LONG_DOUBLE:
case GCC_JIT_TYPE_COMPLEX_FLOAT:
case GCC_JIT_TYPE_COMPLEX_DOUBLE:
case GCC_JIT_TYPE_COMPLEX_LONG_DOUBLE:
/* Not a pointer: */ /* Not a pointer: */
return NULL; return NULL;
...@@ -1309,6 +1330,11 @@ recording::memento_of_get_type::is_int () const ...@@ -1309,6 +1330,11 @@ recording::memento_of_get_type::is_int () const
case GCC_JIT_TYPE_FILE_PTR: case GCC_JIT_TYPE_FILE_PTR:
return false; return false;
case GCC_JIT_TYPE_COMPLEX_FLOAT:
case GCC_JIT_TYPE_COMPLEX_DOUBLE:
case GCC_JIT_TYPE_COMPLEX_LONG_DOUBLE:
return false;
} }
} }
...@@ -1357,6 +1383,11 @@ recording::memento_of_get_type::is_float () const ...@@ -1357,6 +1383,11 @@ recording::memento_of_get_type::is_float () const
case GCC_JIT_TYPE_FILE_PTR: case GCC_JIT_TYPE_FILE_PTR:
return false; return false;
case GCC_JIT_TYPE_COMPLEX_FLOAT:
case GCC_JIT_TYPE_COMPLEX_DOUBLE:
case GCC_JIT_TYPE_COMPLEX_LONG_DOUBLE:
return true;
} }
} }
...@@ -1405,6 +1436,11 @@ recording::memento_of_get_type::is_bool () const ...@@ -1405,6 +1436,11 @@ recording::memento_of_get_type::is_bool () const
case GCC_JIT_TYPE_FILE_PTR: case GCC_JIT_TYPE_FILE_PTR:
return false; return false;
case GCC_JIT_TYPE_COMPLEX_FLOAT:
case GCC_JIT_TYPE_COMPLEX_DOUBLE:
case GCC_JIT_TYPE_COMPLEX_LONG_DOUBLE:
return false;
} }
} }
...@@ -1451,7 +1487,11 @@ static const char * const get_type_strings[] = { ...@@ -1451,7 +1487,11 @@ static const char * const get_type_strings[] = {
"size_t", /* GCC_JIT_TYPE_SIZE_T */ "size_t", /* GCC_JIT_TYPE_SIZE_T */
"FILE *" /* GCC_JIT_TYPE_FILE_PTR */ "FILE *", /* GCC_JIT_TYPE_FILE_PTR */
"complex float", /* GCC_JIT_TYPE_COMPLEX_FLOAT */
"complex double", /* GCC_JIT_TYPE_COMPLEX_DOUBLE */
"complex long double" /* GCC_JIT_TYPE_COMPLEX_LONG_DOUBLE */
}; };
......
...@@ -52,6 +52,9 @@ public: ...@@ -52,6 +52,9 @@ public:
context (context *parent_ctxt); context (context *parent_ctxt);
~context (); ~context ();
builtins_manager *
get_builtins_manager ();
void record (memento *m); void record (memento *m);
void replay_into (replayer *r); void replay_into (replayer *r);
void disassociate_from_playback (); void disassociate_from_playback ();
......
...@@ -382,7 +382,13 @@ enum gcc_jit_types ...@@ -382,7 +382,13 @@ enum gcc_jit_types
GCC_JIT_TYPE_SIZE_T, GCC_JIT_TYPE_SIZE_T,
/* C type: (FILE *) */ /* C type: (FILE *) */
GCC_JIT_TYPE_FILE_PTR GCC_JIT_TYPE_FILE_PTR,
/* Complex numbers. */
GCC_JIT_TYPE_COMPLEX_FLOAT,
GCC_JIT_TYPE_COMPLEX_DOUBLE,
GCC_JIT_TYPE_COMPLEX_LONG_DOUBLE
}; };
extern gcc_jit_type * extern gcc_jit_type *
......
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