Add support for setting the inline attribute
diff --git a/gcc/jit/jit-playback.c b/gcc/jit/jit-playback.c index f721e5c..ab7a668 100644 --- a/gcc/jit/jit-playback.c +++ b/gcc/jit/jit-playback.c
@@ -472,7 +472,8 @@ const char *name, const auto_vec<param *> *params, int is_variadic, - enum built_in_function builtin_id) + enum built_in_function builtin_id, + enum gcc_jit_inline_mode inline_mode) { int i; param *param; @@ -496,6 +497,30 @@ /* FIXME: this uses input_location: */ tree fndecl = build_fn_decl (name, fn_type); + if (inline_mode != GCC_JIT_INLINE_MODE_DEFAULT) + { + switch (inline_mode) + { + case GCC_JIT_INLINE_MODE_DEFAULT: + break; + case GCC_JIT_INLINE_MODE_ALWAYS_INLINE: + DECL_DECLARED_INLINE_P (fndecl) = 1; + DECL_DISREGARD_INLINE_LIMITS (fndecl) = 1; // FIXME: this line breaks compilation of sysroot, but seems required to make inlining work. + // FIXME: could it be because it's calling an external function? + DECL_ATTRIBUTES (fndecl) = + tree_cons (get_identifier ("always_inline"), + NULL, + DECL_ATTRIBUTES (fndecl)); + break; + case GCC_JIT_INLINE_MODE_NO_INLINE: + DECL_UNINLINABLE (fndecl) = 1; + break; + case GCC_JIT_INLINE_MODE_INLINE: + DECL_DECLARED_INLINE_P (fndecl) = 1; + break; + } + } + if (loc) set_tree_location (fndecl, loc);
diff --git a/gcc/jit/jit-playback.h b/gcc/jit/jit-playback.h index b5d71aa..c81061f 100644 --- a/gcc/jit/jit-playback.h +++ b/gcc/jit/jit-playback.h
@@ -104,7 +104,8 @@ const char *name, const auto_vec<param *> *params, int is_variadic, - enum built_in_function builtin_id); + enum built_in_function builtin_id, + enum gcc_jit_inline_mode inline_mode); lvalue * new_global (location *loc,
diff --git a/gcc/jit/jit-recording.c b/gcc/jit/jit-recording.c index 0aa535e..c2436d7 100644 --- a/gcc/jit/jit-recording.c +++ b/gcc/jit/jit-recording.c
@@ -3957,7 +3957,8 @@ m_builtin_id (builtin_id), m_locals (), m_blocks (), - m_fn_ptr_type (NULL) + m_fn_ptr_type (NULL), + m_inline_mode(GCC_JIT_INLINE_MODE_DEFAULT) { for (int i = 0; i< num_params; i++) { @@ -4016,7 +4017,8 @@ m_name->c_str (), ¶ms, m_is_variadic, - m_builtin_id)); + m_builtin_id, + m_inline_mode)); } /* Create a recording::local instance and add it to @@ -4231,6 +4233,15 @@ } /* Implements the post-error-checking part of + gcc_jit_function_set_inline_mode. */ + +void +recording::function::set_inline_mode(enum gcc_jit_inline_mode inline_mode) +{ + m_inline_mode = inline_mode; +} + +/* Implements the post-error-checking part of gcc_jit_function_get_address. */ recording::rvalue *
diff --git a/gcc/jit/jit-recording.h b/gcc/jit/jit-recording.h index 36c8fba..e598869 100644 --- a/gcc/jit/jit-recording.h +++ b/gcc/jit/jit-recording.h
@@ -1263,6 +1263,8 @@ void dump_to_dot (const char *path); + void set_inline_mode(enum gcc_jit_inline_mode); + rvalue *get_address (location *loc); private: @@ -1280,6 +1282,7 @@ auto_vec<local *> m_locals; auto_vec<block *> m_blocks; type *m_fn_ptr_type; + gcc_jit_inline_mode m_inline_mode; }; class block : public memento
diff --git a/gcc/jit/libgccjit.c b/gcc/jit/libgccjit.c index 4783803..d4a47d8 100644 --- a/gcc/jit/libgccjit.c +++ b/gcc/jit/libgccjit.c
@@ -551,6 +551,20 @@ /* Public entrypoint. See description in libgccjit.h. After error-checking, the real work is done by the + gcc::jit::recording::function::set_inline_mode method, in + jit-recording.c. */ + +void +gcc_jit_function_set_inline_mode(gcc_jit_function *func, enum gcc_jit_inline_mode inline_mode) +{ + RETURN_IF_FAIL (func, NULL, NULL, "NULL function"); + + func->set_inline_mode(inline_mode); +} + +/* Public entrypoint. See description in libgccjit.h. + + After error-checking, the real work is done by the gcc::jit::recording::type::is_bool method, in jit-recording.c. */
diff --git a/gcc/jit/libgccjit.h b/gcc/jit/libgccjit.h index e4ec6cf..179cc5c 100644 --- a/gcc/jit/libgccjit.h +++ b/gcc/jit/libgccjit.h
@@ -1745,6 +1745,19 @@ extern gcc_jit_type * gcc_jit_type_is_array (gcc_jit_type *type); +#define LIBGCCJIT_HAVE_gcc_jit_function_set_inline_mode + +enum gcc_jit_inline_mode +{ + GCC_JIT_INLINE_MODE_DEFAULT, + GCC_JIT_INLINE_MODE_ALWAYS_INLINE, + GCC_JIT_INLINE_MODE_NO_INLINE, + GCC_JIT_INLINE_MODE_INLINE, +}; + +extern void +gcc_jit_function_set_inline_mode(gcc_jit_function *func, enum gcc_jit_inline_mode inline_mode); + /* Return non-zero if the type is a bool. */ extern int gcc_jit_type_is_bool (gcc_jit_type *type);
diff --git a/gcc/jit/libgccjit.map b/gcc/jit/libgccjit.map index a30cca5..78bda91 100644 --- a/gcc/jit/libgccjit.map +++ b/gcc/jit/libgccjit.map
@@ -252,3 +252,8 @@ gcc_jit_context_new_rvalue_from_struct; gcc_jit_context_new_rvalue_from_array; } LIBGCCJIT_ABI_20; + +LIBGCCJIT_ABI_22 { + global: + gcc_jit_function_set_inline_mode; +} LIBGCCJIT_ABI_21;