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;