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 (),
 				     &params,
 				     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;