diff --git a/valgrind-3.18.1-rust-demangle-suffix.patch b/valgrind-3.18.1-rust-demangle-suffix.patch
new file mode 100644
index 0000000..58de409
--- /dev/null
+++ b/valgrind-3.18.1-rust-demangle-suffix.patch
@@ -0,0 +1,370 @@
+commit e0b62fe05559003b731b4d786f3b71e9a66fb94d
+Author: Mark Wielaard <mark@klomp.org>
+Date:   Thu Feb 17 18:35:38 2022 +0100
+
+    Update libiberty demangler
+    
+    Update the libiberty demangler using the auxprogs/update-demangler
+    script to gcc git commit d3b2ead595467166c849950ecd3710501a5094d9.
+    
+    This update includes:
+    
+    - libiberty rust-demangle, ignore .suffix
+    - libiberty: Fix infinite recursion in rust demangler
+    - Update copyright years
+    - libiberty: support digits in cpp mangled clone names
+    - d-demangle: properly skip anonymous symbols
+    - d-demangle: remove parenthesis where it is not needed
+
+diff --git a/auxprogs/update-demangler b/auxprogs/update-demangler
+index 00c090467..307a0ea36 100755
+--- a/auxprogs/update-demangler
++++ b/auxprogs/update-demangler
+@@ -17,8 +17,8 @@ set -e
+ #---------------------------------------------------------------------
+ 
+ # You need to modify these revision numbers for your update.
+-old_gcc_revision=01d92cfd79872e4cffc78bf233bb9b767336beb8 # the revision of the previous update
+-new_gcc_revision=b3585c0836e729bed56b9afd4292177673a25ca0 # the revision for this update
++old_gcc_revision=b3585c0836e729bed56b9afd4292177673a25ca0 # the revision of the previous update
++new_gcc_revision=d3b2ead595467166c849950ecd3710501a5094d9 # the revision for this update
+ 
+ # Unless the organization of demangler related files has changed, no
+ # changes below this line should be necessary.
+diff --git a/coregrind/m_demangle/ansidecl.h b/coregrind/m_demangle/ansidecl.h
+index 2329c8655..4275c9b9c 100644
+--- a/coregrind/m_demangle/ansidecl.h
++++ b/coregrind/m_demangle/ansidecl.h
+@@ -1,5 +1,5 @@
+-/* ANSI and traditional C compatibility macros
+-   Copyright (C) 1991-2021 Free Software Foundation, Inc.
++/* ANSI and traditional C compatability macros
++   Copyright (C) 1991-2022 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+ 
+ This program is free software; you can redistribute it and/or modify
+diff --git a/coregrind/m_demangle/cp-demangle.c b/coregrind/m_demangle/cp-demangle.c
+index 1f4cd3d28..ca82c330d 100644
+--- a/coregrind/m_demangle/cp-demangle.c
++++ b/coregrind/m_demangle/cp-demangle.c
+@@ -1,5 +1,5 @@
+ /* Demangler for g++ V3 ABI.
+-   Copyright (C) 2003-2021 Free Software Foundation, Inc.
++   Copyright (C) 2003-2022 Free Software Foundation, Inc.
+    Written by Ian Lance Taylor <ian@wasabisystems.com>.
+ 
+    This file is part of the libiberty library, which is part of GCC.
+@@ -3901,10 +3901,11 @@ d_clone_suffix (struct d_info *di, struct demangle_component *encoding)
+   const char *pend = suffix;
+   struct demangle_component *n;
+ 
+-  if (*pend == '.' && (IS_LOWER (pend[1]) || pend[1] == '_'))
++  if (*pend == '.' && (IS_LOWER (pend[1]) || IS_DIGIT (pend[1])
++		       || pend[1] == '_'))
+     {
+       pend += 2;
+-      while (IS_LOWER (*pend) || *pend == '_')
++      while (IS_LOWER (*pend) || IS_DIGIT (*pend) || *pend == '_')
+ 	++pend;
+     }
+   while (*pend == '.' && IS_DIGIT (pend[1]))
+diff --git a/coregrind/m_demangle/cp-demangle.h b/coregrind/m_demangle/cp-demangle.h
+index cb47bdf0d..c6445036d 100644
+--- a/coregrind/m_demangle/cp-demangle.h
++++ b/coregrind/m_demangle/cp-demangle.h
+@@ -1,5 +1,5 @@
+ /* Internal demangler interface for g++ V3 ABI.
+-   Copyright (C) 2003-2021 Free Software Foundation, Inc.
++   Copyright (C) 2003-2022 Free Software Foundation, Inc.
+    Written by Ian Lance Taylor <ian@wasabisystems.com>.
+ 
+    This file is part of the libiberty library, which is part of GCC.
+diff --git a/coregrind/m_demangle/cplus-dem.c b/coregrind/m_demangle/cplus-dem.c
+index bf4379054..5d6e04d96 100644
+--- a/coregrind/m_demangle/cplus-dem.c
++++ b/coregrind/m_demangle/cplus-dem.c
+@@ -1,5 +1,5 @@
+ /* Demangler for GNU C++
+-   Copyright (C) 1989-2021 Free Software Foundation, Inc.
++   Copyright (C) 1989-2022 Free Software Foundation, Inc.
+    Written by James Clark (jjc@jclark.uucp)
+    Rewritten by Fred Fish (fnf@cygnus.com) for ARM and Lucid demangling
+    Modified by Satish Pai (pai@apollo.hp.com) for HP demangling
+diff --git a/coregrind/m_demangle/d-demangle.c b/coregrind/m_demangle/d-demangle.c
+index 4525c48d4..c2c3e08c8 100644
+--- a/coregrind/m_demangle/d-demangle.c
++++ b/coregrind/m_demangle/d-demangle.c
+@@ -1,5 +1,5 @@
+ /* Demangler for the D programming language
+-   Copyright (C) 2014-2021 Free Software Foundation, Inc.
++   Copyright (C) 2014-2022 Free Software Foundation, Inc.
+    Written by Iain Buclaw (ibuclaw@gdcproject.org)
+ 
+ This file is part of the libiberty library.
+@@ -269,15 +269,15 @@ dlang_hexdigit (const char *mangled, char *ret)
+ 
+   c = mangled[0];
+   if (!ISDIGIT (c))
+-    (*ret) = (c - (ISUPPER (c) ? 'A' : 'a') + 10);
++    *ret = c - (ISUPPER (c) ? 'A' : 'a') + 10;
+   else
+-    (*ret) = (c - '0');
++    *ret = c - '0';
+ 
+   c = mangled[1];
+   if (!ISDIGIT (c))
+-    (*ret) = (*ret << 4) | (c - (ISUPPER (c) ? 'A' : 'a') + 10);
++    *ret = (*ret << 4) | (c - (ISUPPER (c) ? 'A' : 'a') + 10);
+   else
+-    (*ret) = (*ret << 4) | (c - '0');
++    *ret = (*ret << 4) | (c - '0');
+ 
+   mangled += 2;
+ 
+@@ -354,7 +354,7 @@ dlang_decode_backref (const char *mangled, long *ret)
+ static const char *
+ dlang_backref (const char *mangled, const char **ret, struct dlang_info *info)
+ {
+-  (*ret) = NULL;
++  *ret = NULL;
+ 
+   if (mangled == NULL || *mangled != 'Q')
+     return NULL;
+@@ -372,7 +372,7 @@ dlang_backref (const char *mangled, const char **ret, struct dlang_info *info)
+     return NULL;
+ 
+   /* Set the position of the back reference.  */
+-  (*ret) = qpos - refpos;
++  *ret = qpos - refpos;
+ 
+   return mangled;
+ }
+@@ -1666,13 +1666,19 @@ dlang_parse_qualified (string *decl, const char *mangled,
+   size_t n = 0;
+   do
+     {
++      /* Skip over anonymous symbols.  */
++      if (*mangled == '0')
++      {
++	do
++	  mangled++;
++	while (*mangled == '0');
++
++	continue;
++      }
++
+       if (n++)
+ 	string_append (decl, ".");
+ 
+-      /* Skip over anonymous symbols.  */
+-      while (*mangled == '0')
+-	mangled++;
+-
+       mangled = dlang_identifier (decl, mangled, info);
+ 
+       /* Consume the encoded arguments.  However if this is not followed by the
+diff --git a/coregrind/m_demangle/demangle.h b/coregrind/m_demangle/demangle.h
+index 2acb3bd4e..bbce948c5 100644
+--- a/coregrind/m_demangle/demangle.h
++++ b/coregrind/m_demangle/demangle.h
+@@ -1,5 +1,5 @@
+ /* Defs for interface to demanglers.
+-   Copyright (C) 1992-2021 Free Software Foundation, Inc.
++   Copyright (C) 1992-2022 Free Software Foundation, Inc.
+ 
+    This program is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Library General Public License
+diff --git a/coregrind/m_demangle/dyn-string.c b/coregrind/m_demangle/dyn-string.c
+index 66948debf..89ce8e12c 100644
+--- a/coregrind/m_demangle/dyn-string.c
++++ b/coregrind/m_demangle/dyn-string.c
+@@ -1,5 +1,5 @@
+ /* An abstract string datatype.
+-   Copyright (C) 1998-2021 Free Software Foundation, Inc.
++   Copyright (C) 1998-2022 Free Software Foundation, Inc.
+    Contributed by Mark Mitchell (mark@markmitchell.com).
+ 
+ This file is part of GNU CC.
+diff --git a/coregrind/m_demangle/dyn-string.h b/coregrind/m_demangle/dyn-string.h
+index 6c5e66012..be2184aa9 100644
+--- a/coregrind/m_demangle/dyn-string.h
++++ b/coregrind/m_demangle/dyn-string.h
+@@ -1,5 +1,5 @@
+ /* An abstract string datatype.
+-   Copyright (C) 1998-2021 Free Software Foundation, Inc.
++   Copyright (C) 1998-2022 Free Software Foundation, Inc.
+    Contributed by Mark Mitchell (mark@markmitchell.com).
+ 
+ This file is part of GCC.
+diff --git a/coregrind/m_demangle/rust-demangle.c b/coregrind/m_demangle/rust-demangle.c
+index 0cafa3df9..0a9331ac2 100644
+--- a/coregrind/m_demangle/rust-demangle.c
++++ b/coregrind/m_demangle/rust-demangle.c
+@@ -1,5 +1,5 @@
+ /* Demangler for the Rust programming language
+-   Copyright (C) 2016-2021 Free Software Foundation, Inc.
++   Copyright (C) 2016-2022 Free Software Foundation, Inc.
+    Written by David Tolnay (dtolnay@gmail.com).
+    Rewritten by Eduard-Mihai Burtescu (eddyb@lyken.rs) for v0 support.
+ 
+@@ -101,6 +101,12 @@ struct rust_demangler
+   /* Rust mangling version, with legacy mangling being -1. */
+   int version;
+ 
++  /* Recursion depth.  */
++  unsigned int recursion;
++  /* Maximum number of times demangle_path may be called recursively.  */
++#define RUST_MAX_RECURSION_COUNT  1024
++#define RUST_NO_RECURSION_LIMIT   ((unsigned int) -1)
++
+   uint64_t bound_lifetime_depth;
+ };
+ 
+@@ -698,6 +704,15 @@ demangle_path (struct rust_demangler *rdm, int in_value)
+   if (rdm->errored)
+     return;
+ 
++  if (rdm->recursion != RUST_NO_RECURSION_LIMIT)
++    {
++      ++ rdm->recursion;
++      if (rdm->recursion > RUST_MAX_RECURSION_COUNT)
++	/* FIXME: There ought to be a way to report
++	   that the recursion limit has been reached.  */
++	goto fail_return;
++    }
++
+   switch (tag = next (rdm))
+     {
+     case 'C':
+@@ -715,10 +730,7 @@ demangle_path (struct rust_demangler *rdm, int in_value)
+     case 'N':
+       ns = next (rdm);
+       if (!ISLOWER (ns) && !ISUPPER (ns))
+-        {
+-          rdm->errored = 1;
+-          return;
+-        }
++	goto fail_return;
+ 
+       demangle_path (rdm, in_value);
+ 
+@@ -803,9 +815,15 @@ demangle_path (struct rust_demangler *rdm, int in_value)
+         }
+       break;
+     default:
+-      rdm->errored = 1;
+-      return;
++      goto fail_return;
+     }
++  goto pass_return;
++
++ fail_return:
++  rdm->errored = 1;
++ pass_return:
++  if (rdm->recursion != RUST_NO_RECURSION_LIMIT)
++    -- rdm->recursion;
+ }
+ 
+ static void
+@@ -897,6 +915,19 @@ demangle_type (struct rust_demangler *rdm)
+       return;
+     }
+ 
++   if (rdm->recursion != RUST_NO_RECURSION_LIMIT)
++    {
++      ++ rdm->recursion;
++      if (rdm->recursion > RUST_MAX_RECURSION_COUNT)
++	/* FIXME: There ought to be a way to report
++	   that the recursion limit has been reached.  */
++	{
++	  rdm->errored = 1;
++	  -- rdm->recursion;
++	  return;
++	}
++    }
++
+   switch (tag)
+     {
+     case 'R':
+@@ -1057,6 +1088,9 @@ demangle_type (struct rust_demangler *rdm)
+       rdm->next--;
+       demangle_path (rdm, 0);
+     }
++
++  if (rdm->recursion != RUST_NO_RECURSION_LIMIT)
++    -- rdm->recursion;
+ }
+ 
+ /* A trait in a trait object may have some "existential projections"
+@@ -1347,6 +1381,7 @@ rust_demangle_callback (const char *mangled, int options,
+   rdm.skipping_printing = 0;
+   rdm.verbose = (options & DMGL_VERBOSE) != 0;
+   rdm.version = 0;
++  rdm.recursion = (options & DMGL_NO_RECURSE_LIMIT) ? RUST_NO_RECURSION_LIMIT : 0;
+   rdm.bound_lifetime_depth = 0;
+ 
+   /* Rust symbols always start with _R (v0) or _ZN (legacy). */
+@@ -1367,13 +1402,19 @@ rust_demangle_callback (const char *mangled, int options,
+   /* Rust symbols (v0) use only [_0-9a-zA-Z] characters. */
+   for (p = rdm.sym; *p; p++)
+     {
++      /* Rust v0 symbols can have '.' suffixes, ignore those.  */
++      if (rdm.version == 0 && *p == '.')
++        break;
++
+       rdm.sym_len++;
+ 
+       if (*p == '_' || ISALNUM (*p))
+         continue;
+ 
+-      /* Legacy Rust symbols can also contain [.:$] characters. */
+-      if (rdm.version == -1 && (*p == '$' || *p == '.' || *p == ':'))
++      /* Legacy Rust symbols can also contain [.:$] characters.
++         Or @ in the .suffix (which will be skipped, see below). */
++      if (rdm.version == -1 && (*p == '$' || *p == '.' || *p == ':'
++                                || *p == '@'))
+         continue;
+ 
+       return 0;
+@@ -1382,7 +1423,16 @@ rust_demangle_callback (const char *mangled, int options,
+   /* Legacy Rust symbols need to be handled separately. */
+   if (rdm.version == -1)
+     {
+-      /* Legacy Rust symbols always end with E. */
++      /* Legacy Rust symbols always end with E.  But can be followed by a
++         .suffix (which we want to ignore).  */
++      int dot_suffix = 1;
++      while (rdm.sym_len > 0 &&
++             !(dot_suffix && rdm.sym[rdm.sym_len - 1] == 'E'))
++        {
++          dot_suffix = rdm.sym[rdm.sym_len - 1] == '.';
++          rdm.sym_len--;
++        }
++
+       if (!(rdm.sym_len > 0 && rdm.sym[rdm.sym_len - 1] == 'E'))
+         return 0;
+       rdm.sym_len--;
+diff --git a/coregrind/m_demangle/safe-ctype.c b/coregrind/m_demangle/safe-ctype.c
+index 14da11918..97bc43667 100644
+--- a/coregrind/m_demangle/safe-ctype.c
++++ b/coregrind/m_demangle/safe-ctype.c
+@@ -1,6 +1,6 @@
+ /* <ctype.h> replacement macros.
+ 
+-   Copyright (C) 2000-2021 Free Software Foundation, Inc.
++   Copyright (C) 2000-2022 Free Software Foundation, Inc.
+    Contributed by Zack Weinberg <zackw@stanford.edu>.
+ 
+ This file is part of the libiberty library.
+diff --git a/coregrind/m_demangle/safe-ctype.h b/coregrind/m_demangle/safe-ctype.h
+index a7389c32e..86157ed4b 100644
+--- a/coregrind/m_demangle/safe-ctype.h
++++ b/coregrind/m_demangle/safe-ctype.h
+@@ -1,6 +1,6 @@
+ /* <ctype.h> replacement macros.
+ 
+-   Copyright (C) 2000-2021 Free Software Foundation, Inc.
++   Copyright (C) 2000-2022 Free Software Foundation, Inc.
+    Contributed by Zack Weinberg <zackw@stanford.edu>.
+ 
+ This file is part of the libiberty library.
diff --git a/valgrind.spec b/valgrind.spec
index 190a90b..6bbee75 100644
--- a/valgrind.spec
+++ b/valgrind.spec
@@ -146,6 +146,9 @@ Patch23: valgrind-3.18.1-ppc64-cmov.patch
 # KDE#449494 arm64: Mismatch detected between RDMA and atomics features
 Patch24: valgrind-3.18.1-arm64-atomics-rdm.patch
 
+# KDE#445916 Demangle Rust v0 symbols with .llvm suffix
+Patch25: valgrind-3.18.1-rust-demangle-suffix.patch
+
 BuildRequires: make
 BuildRequires: glibc-devel
 
@@ -302,6 +305,7 @@ Valgrind User Manual for details.
 %patch22 -p1
 %patch23 -p1
 %patch24 -p1
+%patch25 -p1
 
 %build
 # LTO triggers undefined symbols in valgrind.  Valgrind has a --enable-lto
@@ -534,6 +538,7 @@ fi
 * Tue Feb  8 2022 Mark Wielaard <mjw@fedoraproject.org>
 - Add valgrind-3.18.1-ppc64-cmov.patch
 - Add valgrind-3.18.1-arm64-atomics-rdm.patch
+- Add valgrind-3.18.1-rust-demangle-suffix.patch
 
 * Sat Jan 22 2022 Fedora Release Engineering <releng@fedoraproject.org> - 1:3.18.1-9
 - Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild