public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
From: "Sam James" <sam@gentoo.org>
To: gentoo-commits@lists.gentoo.org
Subject: [gentoo-commits] proj/toolchain/binutils-patches:master commit in: 9999/
Date: Wed, 23 Jul 2025 22:37:35 +0000 (UTC)	[thread overview]
Message-ID: <1753310251.94c4ba7c7271a8356739b2da33bb921c9caa447d.sam@gentoo> (raw)

commit:     94c4ba7c7271a8356739b2da33bb921c9caa447d
Author:     Sam James <sam <AT> gentoo <DOT> org>
AuthorDate: Wed Jul 23 22:36:53 2025 +0000
Commit:     Sam James <sam <AT> gentoo <DOT> org>
CommitDate: Wed Jul 23 22:37:31 2025 +0000
URL:        https://gitweb.gentoo.org/proj/toolchain/binutils-patches.git/commit/?id=94c4ba7c

9999: add strip vs LTO IR patch

Bug: https://sourceware.org/PR33198
Signed-off-by: Sam James <sam <AT> gentoo.org>

 ...006-strip-Properly-handle-LLVM-IR-bitcode.patch | 523 +++++++++++++++++++++
 1 file changed, 523 insertions(+)

diff --git a/9999/0006-strip-Properly-handle-LLVM-IR-bitcode.patch b/9999/0006-strip-Properly-handle-LLVM-IR-bitcode.patch
new file mode 100644
index 0000000..ccb99ed
--- /dev/null
+++ b/9999/0006-strip-Properly-handle-LLVM-IR-bitcode.patch
@@ -0,0 +1,523 @@
+https://sourceware.org/bugzilla/show_bug.cgi?id=33198#c2
+
+From 252058908602dc41b2e483e663aba211395c5c9d Mon Sep 17 00:00:00 2001
+From: "H.J. Lu" <hjl.tools@gmail.com>
+Date: Tue, 22 Jul 2025 14:09:48 -0700
+Subject: [PATCH] strip: Properly handle LLVM IR bitcode
+
+commit 717a38e9a02109fcbcb18bb2ec3aa251e2ad0a0d
+Author: H.J. Lu <hjl.tools@gmail.com>
+Date:   Sun May 4 05:12:46 2025 +0800
+
+    strip: Add GCC LTO IR support
+
+added "-R .gnu.lto_.*" to strip to remove the GCC LTO sections.  When
+"-R .gnu.lto_.*" is used, the plugin target is ignored so that the LTO
+sections are stripped as the regular sections.  It works for the non-fat
+GCC LTO IR since the GCC LTO IR is stored in the regular sections.  When
+the plugin target is ignored, the GCC LTO IR can be recognized as the
+normal object files.  But it doesn't work for the non-fat LLVM IR which
+is stored in a standalone file.
+
+1. Add bfd_check_format_matches_lto and bfd_check_format_lto to take an
+argument, lto_sections_removed, to indicate if LTO sections should be
+ignored.
+2. Update strip to always enable the plugin target so that the plugin
+target is enabled when checking for bfd_archive.
+3. Update strip to ignore the plugin target for bfd_object when all LTO
+sections should be removed.  If the object is unknown, copy it as an
+unknown file without any messages.
+4. Treat the "-R .llvm.lto" strip option as removing all LTO sections.
+
+bfd/
+
+	PR binutils/33198
+	* format.c (bfd_check_format_lto): New function.
+	(bfd_check_format): Call bfd_check_format_matches_lto.
+	(bfd_check_format_matches): Renamed to ...
+	(bfd_check_format_matches_lto): This.  Add an argument,
+	lto_sections_removed, to indicate if LTO sections should be
+	removed and don't match the plugin target if lto_sections_removed
+	is true.
+	(bfd_check_format_matches): Call bfd_check_format_matches_lto.
+	* bfd-in2.h: Regenerated.
+
+binutils/
+
+	PR binutils/33198
+	* objcopy.c (copy_archive): Call bfd_check_format_lto, instead
+	of bfd_check_format, and pass lto_sections_removed.  Remove the
+	non-fatal message on unknown element since it will be copied as
+	an unknown file.
+	(copy_file): Don't check lto_sections_removed when enabling LTO
+	plugin in strip.
+	(copy_file): Ignore plugin target first if all LTO sections should
+	be removed.  Try with plugin target next if ignoring plugin target
+	fails to match the format.
+	(strip_main): Also set lto_sections_removed for -R .llvm.lto.
+	* testsuite/binutils-all/x86-64/pr33198.c: New file.
+	* testsuite/binutils-all/x86-64/x86-64.exp (run_pr33198_test):
+	New.
+	Run binutils/33198 tests.
+
+Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
+---
+ bfd/bfd-in2.h                                 |   7 +
+ bfd/format.c                                  |  84 ++++++++--
+ binutils/objcopy.c                            |  40 +++--
+ .../testsuite/binutils-all/x86-64/pr33198.c   |   4 +
+ .../testsuite/binutils-all/x86-64/x86-64.exp  | 158 ++++++++++++++++++
+ binutils/testsuite/lib/binutils-common.exp    |  16 ++
+ 6 files changed, 288 insertions(+), 21 deletions(-)
+ create mode 100644 binutils/testsuite/binutils-all/x86-64/pr33198.c
+
+diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h
+index b013ef954da..2ff3e930bfa 100644
+--- a/bfd/bfd-in2.h
++++ b/bfd/bfd-in2.h
+@@ -2903,8 +2903,15 @@ bool generic_core_file_matches_executable_p
+    (bfd *core_bfd, bfd *exec_bfd);
+ 
+ /* Extracted from format.c.  */
++bool bfd_check_format_lto (bfd *abfd, bfd_format format,
++    bool lto_sections_removed);
++
+ bool bfd_check_format (bfd *abfd, bfd_format format);
+ 
++bool bfd_check_format_matches_lto
++   (bfd *abfd, bfd_format format, char ***matching,
++    bool lto_sections_removed);
++
+ bool bfd_check_format_matches
+    (bfd *abfd, bfd_format format, char ***matching);
+ 
+diff --git a/bfd/format.c b/bfd/format.c
+index a909b70fe81..f3a0774af08 100644
+--- a/bfd/format.c
++++ b/bfd/format.c
+@@ -56,16 +56,19 @@ extern const size_t _bfd_target_vector_entries;
+ 
+ /*
+ FUNCTION
+-	bfd_check_format
++	bfd_check_format_lto
+ 
+ SYNOPSIS
+-	bool bfd_check_format (bfd *abfd, bfd_format format);
++	bool bfd_check_format_lto (bfd *abfd, bfd_format format,
++				   bool lto_sections_removed);
+ 
+ DESCRIPTION
+ 	Verify if the file attached to the BFD @var{abfd} is compatible
+ 	with the format @var{format} (i.e., one of <<bfd_object>>,
+ 	<<bfd_archive>> or <<bfd_core>>).
+ 
++	If LTO_SECTION_REMOVED is true, ignore plugin target.
++
+ 	If the BFD has been set to a specific target before the
+ 	call, only the named target and format combination is
+ 	checked. If the target has not been set, or has been set to
+@@ -99,10 +102,31 @@ DESCRIPTION
+ 	itself.
+ */
+ 
++bool
++bfd_check_format_lto (bfd *abfd, bfd_format format,
++		      bool lto_sections_removed)
++{
++  return bfd_check_format_matches_lto (abfd, format, NULL,
++				       lto_sections_removed);
++}
++
++
++/*
++FUNCTION
++	bfd_check_format
++
++SYNOPSIS
++	bool bfd_check_format (bfd *abfd, bfd_format format);
++
++DESCRIPTION
++	Similar to bfd_check_format_plugin, except plugin target isn't
++	ignored.
++*/
++
+ bool
+ bfd_check_format (bfd *abfd, bfd_format format)
+ {
+-  return bfd_check_format_matches (abfd, format, NULL);
++  return bfd_check_format_matches_lto (abfd, format, NULL, false);
+ }
+ 
+ struct bfd_preserve
+@@ -407,11 +431,12 @@ bfd_set_lto_type (bfd *abfd ATTRIBUTE_UNUSED)
+ 
+ /*
+ FUNCTION
+-	bfd_check_format_matches
++	bfd_check_format_matches_lto
+ 
+ SYNOPSIS
+-	bool bfd_check_format_matches
+-	  (bfd *abfd, bfd_format format, char ***matching);
++	bool bfd_check_format_matches_lto
++	  (bfd *abfd, bfd_format format, char ***matching,
++	   bool lto_sections_removed);
+ 
+ DESCRIPTION
+ 	Like <<bfd_check_format>>, except when it returns FALSE with
+@@ -423,10 +448,14 @@ DESCRIPTION
+ 
+ 	When done with the list that @var{matching} points to, the caller
+ 	should free it.
++
++	If LTO_SECTION_REMOVED is true, ignore plugin target.
+ */
+ 
+ bool
+-bfd_check_format_matches (bfd *abfd, bfd_format format, char ***matching)
++bfd_check_format_matches_lto (bfd *abfd, bfd_format format,
++			      char ***matching,
++			      bool lto_sections_removed ATTRIBUTE_UNUSED)
+ {
+   extern const bfd_target binary_vec;
+   const bfd_target * const *target;
+@@ -495,8 +524,13 @@ bfd_check_format_matches (bfd *abfd, bfd_format format, char ***matching)
+   if (!bfd_preserve_save (abfd, &preserve, NULL))
+     goto err_ret;
+ 
+-  /* If the target type was explicitly specified, just check that target.  */
+-  if (!abfd->target_defaulted)
++  /* If the target type was explicitly specified, just check that target.
++     If LTO_SECTION_REMOVED is true, don't match the plugin target.  */
++  if (!abfd->target_defaulted
++#if BFD_SUPPORTS_PLUGINS
++      && (!lto_sections_removed || !bfd_plugin_target_p (abfd->xvec))
++#endif
++     )
+     {
+       if (bfd_seek (abfd, 0, SEEK_SET) != 0)	/* rewind! */
+ 	goto err_ret;
+@@ -540,10 +574,12 @@ bfd_check_format_matches (bfd *abfd, bfd_format format, char ***matching)
+ 	 searching.  Don't match the plugin target if we have another
+ 	 alternative since we want to properly set the input format
+ 	 before allowing a plugin to claim the file.  Also, don't
+-	 check the default target twice.  */
++	 check the default target twice.   If LTO_SECTION_REMOVED is
++	 true, don't match the plugin target.  */
+       if (*target == &binary_vec
+ #if BFD_SUPPORTS_PLUGINS
+-	  || (match_count != 0 && bfd_plugin_target_p (*target))
++	  || ((lto_sections_removed || match_count != 0)
++	      && bfd_plugin_target_p (*target))
+ #endif
+ 	  || (!abfd->target_defaulted && *target == save_targ))
+ 	continue;
+@@ -795,6 +831,32 @@ bfd_check_format_matches (bfd *abfd, bfd_format format, char ***matching)
+   return false;
+ }
+ 
++/*
++FUNCTION
++	bfd_check_format_matches
++
++SYNOPSIS
++	bool bfd_check_format_matches
++	  (bfd *abfd, bfd_format format, char ***matching);
++
++DESCRIPTION
++	Like <<bfd_check_format>>, except when it returns FALSE with
++	<<bfd_errno>> set to <<bfd_error_file_ambiguously_recognized>>.  In that
++	case, if @var{matching} is not NULL, it will be filled in with
++	a NULL-terminated list of the names of the formats that matched,
++	allocated with <<malloc>>.
++	Then the user may choose a format and try again.
++
++	When done with the list that @var{matching} points to, the caller
++	should free it.
++*/
++
++bool
++bfd_check_format_matches (bfd *abfd, bfd_format format, char ***matching)
++{
++  return bfd_check_format_matches_lto (abfd, format, matching, false);
++}
++
+ /*
+ FUNCTION
+ 	bfd_set_format
+diff --git a/binutils/objcopy.c b/binutils/objcopy.c
+index 2ca04e84d47..905ce917708 100644
+--- a/binutils/objcopy.c
++++ b/binutils/objcopy.c
+@@ -3741,10 +3741,13 @@ copy_archive (bfd *ibfd, bfd *obfd, const char *output_target,
+       l->obfd = NULL;
+       list = l;
+ 
++#if BFD_SUPPORTS_PLUGINS
++      /* Ignore plugin target if all LTO sections should be removed.  */
++      ok_object = bfd_check_format_lto (this_element, bfd_object,
++					lto_sections_removed);
++#else
+       ok_object = bfd_check_format (this_element, bfd_object);
+-      if (!ok_object)
+-	bfd_nonfatal_message (NULL, this_element, NULL,
+-			      _("Unable to recognise the format of file"));
++#endif
+ 
+       /* PR binutils/3110: Cope with archives
+ 	 containing multiple target types.  */
+@@ -3880,9 +3883,8 @@ copy_file (const char *input_filename, const char *output_filename, int ofd,
+     }
+ 
+ #if BFD_SUPPORTS_PLUGINS
+-  /* Enable LTO plugin in strip unless all LTO sections should be
+-     removed.  */
+-  if (is_strip && !target && !lto_sections_removed)
++  /* Enable LTO plugin in strip.  */
++  if (is_strip && !target)
+     target = "plugin";
+ #endif
+ 
+@@ -3980,7 +3982,21 @@ copy_file (const char *input_filename, const char *output_filename, int ofd,
+ 			 input_arch))
+ 	status = 1;
+     }
+-  else if (bfd_check_format_matches (ibfd, bfd_object, &obj_matching))
++  else if (
++#if BFD_SUPPORTS_PLUGINS
++	   /* Ignore plugin target first if all LTO sections should be
++	      removed.  Try with plugin target next if ignoring plugin
++	      target fails to match the format.  */
++	   bfd_check_format_matches_lto (ibfd, bfd_object, &obj_matching,
++					 lto_sections_removed)
++	   || (lto_sections_removed
++	       && bfd_check_format_matches_lto (ibfd, bfd_object,
++						&obj_matching, false))
++#else
++	   bfd_check_format_matches_lto (ibfd, bfd_object, &obj_matching,
++					 false)
++#endif
++	   )
+     {
+       bfd *obfd;
+     do_copy:
+@@ -5036,9 +5052,13 @@ strip_main (int argc, char *argv[])
+ #if BFD_SUPPORTS_PLUGINS
+   /* Check if all GCC LTO sections should be removed, assuming all LTO
+      sections will be removed with -R .gnu.lto_.*.  * Remove .gnu.lto_.*
+-     sections will also remove .gnu.debuglto_.  sections.  */
+-  lto_sections_removed = !!find_section_list (".gnu.lto_.*", false,
+-					      SECTION_CONTEXT_REMOVE);
++     sections will also remove .gnu.debuglto_.  sections.  LLVM IR
++     bitcode is stored in .llvm.lto section which will be removed with
++     -R .llvm.lto.  */
++  lto_sections_removed = (!!find_section_list (".gnu.lto_.*", false,
++					       SECTION_CONTEXT_REMOVE)
++			  || !!find_section_list (".llvm.lto", false,
++					       SECTION_CONTEXT_REMOVE));
+ #endif
+ 
+   i = optind;
+diff --git a/binutils/testsuite/binutils-all/x86-64/pr33198.c b/binutils/testsuite/binutils-all/x86-64/pr33198.c
+new file mode 100644
+index 00000000000..cd0130cacdf
+--- /dev/null
++++ b/binutils/testsuite/binutils-all/x86-64/pr33198.c
+@@ -0,0 +1,4 @@
++void
++foo (void)
++{
++}
+diff --git a/binutils/testsuite/binutils-all/x86-64/x86-64.exp b/binutils/testsuite/binutils-all/x86-64/x86-64.exp
+index 05c73047b60..ab1aa50a9a1 100644
+--- a/binutils/testsuite/binutils-all/x86-64/x86-64.exp
++++ b/binutils/testsuite/binutils-all/x86-64/x86-64.exp
+@@ -96,3 +96,161 @@ if {[catch "system \"bzip2 -dc $t > $tempfile\""] != 0} {
+ 	}
+     }
+ }
++
++proc run_pr33198_test { fat strip_flags } {
++    global srcdir
++    global subdir
++    global llvm_plug_opt
++    global AR
++    global CLANG_FOR_TARGET
++    global NM
++    global READELF
++    global STRIP
++
++    set test pr33198
++    set testname "${test}${fat} with $strip_flags"
++
++    if { [istarget "x86_64-*-linux*-gnux32"] \
++	 || ![info exists CLANG_FOR_TARGET]
++	 || [string match "" $llvm_plug_opt] } then {
++	untested $testname
++	return
++    }
++
++    set src $srcdir/$subdir/${test}.c
++    set obj tmpdir/${test}${fat}.o
++    set archive tmpdir/${test}${fat}.a
++    set CLANG_CFLAGS "-c -O2 -flto"
++    if { "$fat" == "-fat" } {
++	append CLANG_CFLAGS " -ffat-lto-objects"
++    }
++
++    append strip_flags " --strip-unneeded $llvm_plug_opt"
++
++    set cmd "$CLANG_FOR_TARGET $CLANG_CFLAGS -o $obj $src"
++    send_log "$cmd\n"
++    verbose "$cmd" 1
++    catch "exec $cmd" got
++    if ![string match "" $got] then {
++	send_log "$got\n"
++	verbose "$got" 1
++	fail "$testname ($obj)"
++	return
++    }
++
++    set cmd "$NM $llvm_plug_opt $obj\n"
++    send_log "$cmd\n"
++    verbose "$cmd" 1
++    catch "exec $cmd" got
++    if ![regexp "0+ T foo" $got] then {
++	send_log "$got\n"
++	verbose "$got" 1
++	fail "$testname ($obj)"
++	return
++    }
++
++    pass "$testname ($obj)"
++
++    set cmd "$STRIP $strip_flags $obj -o ${obj}.strip"
++    send_log "$cmd\n"
++    verbose "$cmd" 1
++    catch "exec $cmd" got
++    if ![string match "" $got] then {
++	send_log "$got\n"
++	verbose "$got" 1
++	fail "$testname (strip $obj)"
++	return
++    }
++
++    set cmd "$NM $llvm_plug_opt ${obj}.strip"
++    send_log "$cmd\n"
++    verbose "$cmd" 1
++    catch "exec $cmd" got
++    if ![regexp "0+ T foo" $got] then {
++	send_log "$got\n"
++	verbose "$got" 1
++	fail "$testname (strip $obj)"
++	return
++    }
++
++    if { "$fat" == "-fat" } {
++	set cmd "$READELF -SW ${obj}.strip"
++	send_log "$cmd\n"
++	verbose "$cmd" 1
++	catch "exec $cmd" got
++	if [regexp "\.llvm\.lto *LLVM_LTO *" $got] then {
++	    send_log "$got\n"
++	    verbose "$got" 1
++	    fail "$testname (strip $obj)"
++	    return
++	}
++    }
++
++    pass "$testname (strip $obj)"
++
++    set cmd "$AR $llvm_plug_opt -s -r -c $archive $obj"
++    send_log "$cmd\n"
++    verbose "$cmd" 1
++    catch "exec $cmd" got
++    if ![string match "" $got] then {
++	send_log "$got\n"
++	verbose "$got" 1
++	fail "$testname ($archive)"
++	return
++    }
++
++    set cmd "$NM $llvm_plug_opt $archive\n"
++    send_log "$cmd\n"
++    verbose "$cmd" 1
++    catch "exec $cmd" got
++    if ![regexp "0+ T foo" $got] then {
++	send_log "$got\n"
++	verbose "$got" 1
++	fail "$testname ($archive)"
++	return
++    }
++
++    pass "$testname ($archive)"
++
++    set cmd "$STRIP $strip_flags $archive -o ${archive}.strip"
++    send_log "$cmd\n"
++    verbose "$cmd" 1
++    catch "exec $cmd" got
++    if ![string match "" $got] then {
++	send_log "$got\n"
++	verbose "$got" 1
++	fail "$testname (strip $archive)"
++	return
++    }
++
++    set cmd "$NM $llvm_plug_opt ${archive}.strip"
++    send_log "$cmd\n"
++    verbose "$cmd" 1
++    catch "exec $cmd" got
++    if ![regexp "0+ T foo" $got] then {
++	send_log "$got\n"
++	verbose "$got" 1
++	fail "$testname (strip $archive)"
++	return
++    }
++
++    if { "$fat" == "-fat" } {
++	set cmd "$READELF -SW ${archive}.strip"
++	send_log "$cmd\n"
++	verbose "$cmd" 1
++	catch "exec $cmd" got
++	if [regexp "\.llvm\.lto *LLVM_LTO *" $got] then {
++	    send_log "$got\n"
++	    verbose "$got" 1
++	    fail "$testname (strip $archive)"
++	    return
++	}
++    }
++
++    pass "$testname (strip $archive)"
++}
++
++run_pr33198_test "" "-R .gnu.lto_* -R .gnu.debuglto_* -R .llvm.lto -N __gnu_lto_v1"
++run_pr33198_test "-fat" "-R .gnu.lto_* -R .gnu.debuglto_* -R .llvm.lto -N __gnu_lto_v1"
++run_pr33198_test "" "-R .llvm.lto"
++run_pr33198_test "-fat" "-R .llvm.lto"
+diff --git a/binutils/testsuite/lib/binutils-common.exp b/binutils/testsuite/lib/binutils-common.exp
+index b73b5558c27..d3a73337762 100644
+--- a/binutils/testsuite/lib/binutils-common.exp
++++ b/binutils/testsuite/lib/binutils-common.exp
+@@ -1811,3 +1811,19 @@ proc get_standard_section_names {} {
+     }
+     return
+ }
++
++set llvm_plug_opt ""
++if { [isnative] } then {
++    if ![info exists CLANG_FOR_TARGET] then {
++	catch "exec clang -v" got
++	if [regexp "clang version" $got] then {
++	    set CLANG_FOR_TARGET clang
++	}
++    }
++    if [info exists CLANG_FOR_TARGET] then {
++	set llvm_plug_so [string trim [exec $CLANG_FOR_TARGET -print-file-name=LLVMgold.so]]
++	if { $llvm_plug_so ne "LLVMgold.so" } then {
++	    set llvm_plug_opt "--plugin $llvm_plug_so"
++	}
++    }
++}
+-- 
+2.50.1


             reply	other threads:[~2025-07-23 22:37 UTC|newest]

Thread overview: 94+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-07-23 22:37 Sam James [this message]
  -- strict thread matches above, loose matches on Subject: below --
2025-08-29 13:40 [gentoo-commits] proj/toolchain/binutils-patches:master commit in: 9999/ Sam James
2025-08-28 20:21 Sam James
2025-08-28 13:51 Sam James
2025-08-28  5:32 Sam James
2025-08-27 16:26 Sam James
2025-08-27  4:05 Sam James
2025-08-27  2:49 Sam James
2025-08-25  2:49 Sam James
2025-08-20 23:30 Sam James
2025-08-20 22:17 Sam James
2025-08-20 22:17 Sam James
2025-08-20 20:44 Sam James
2025-08-20  4:39 Sam James
2025-08-19 20:54 Sam James
2025-08-19 17:11 Sam James
2025-08-19 16:28 Sam James
2025-08-19 10:51 Sam James
2025-08-19  3:48 Sam James
2025-08-18 20:21 Sam James
2025-08-18 20:21 Sam James
2025-08-18 20:19 Sam James
2025-08-18 15:39 Sam James
2025-08-17 20:58 Sam James
2025-08-17 19:45 Sam James
2025-08-06 13:19 Sam James
2025-08-06  4:07 Sam James
2025-08-06  1:08 Sam James
2025-08-05 20:21 Sam James
2025-08-04 21:43 Sam James
2025-08-04 21:05 Sam James
2025-08-04 15:32 Sam James
2025-08-04 11:06 Sam James
2025-08-03 23:43 Sam James
2025-08-01 11:28 Sam James
2025-08-01  8:17 Sam James
2025-07-31 11:39 Sam James
2025-07-28 12:24 Andreas K. Hüttel
2025-07-24 17:25 Sam James
2025-07-24  4:03 Sam James
2025-07-24  3:46 Sam James
2025-06-14 21:52 Sam James
2025-06-13  8:00 Sam James
2025-05-14  7:14 Sam James
2025-05-14  3:59 Sam James
2025-05-05  9:46 Sam James
2025-05-05  3:06 Sam James
2025-05-04 10:15 Sam James
2025-04-10 17:35 Sam James
2025-04-09  2:24 Sam James
2025-04-08  0:36 Sam James
2025-03-29 14:18 Sam James
2025-03-12 20:21 Sam James
2025-03-06 12:54 Sam James
2025-03-06  4:54 Sam James
2025-02-03 18:02 Andreas K. Hüttel
2025-01-14  2:09 Sam James
2025-01-13  6:11 Sam James
2025-01-02 13:48 Sam James
2025-01-01 14:05 Sam James
2024-12-26  1:21 Sam James
2024-12-24  6:27 Sam James
2024-12-21  0:09 Sam James
2024-08-03 22:43 Andreas K. Hüttel
2024-06-29 17:05 Andreas K. Hüttel
2024-06-29 16:32 Andreas K. Hüttel
2024-06-29 16:32 Andreas K. Hüttel
2024-06-28 21:48 Andreas K. Hüttel
2023-10-27  0:44 Sam James
2023-10-27  0:44 Sam James
2023-07-30 14:49 Andreas K. Hüttel
2023-07-28 16:23 Andreas K. Hüttel
2023-06-30  9:21 WANG Xuerui
2023-04-02 11:44 Andreas K. Hüttel
2023-01-05 16:22 Andreas K. Hüttel
2023-01-05 16:21 Andreas K. Hüttel
2023-01-03 23:03 Andreas K. Hüttel
2023-01-02 23:50 Andreas K. Hüttel
2022-10-08 12:15 WANG Xuerui
2022-07-29  7:55 WANG Xuerui
2022-01-15 22:27 Andreas K. Hüttel
2021-08-17 20:07 Andreas K. Hüttel
2021-07-30 23:25 Andreas K. Hüttel
2021-07-24 20:57 Andreas K. Hüttel
2021-07-20 19:53 Andreas K. Hüttel
2021-07-20 19:50 Andreas K. Hüttel
2021-07-06  7:04 Sergei Trofimovich
2021-07-06  7:04 Sergei Trofimovich
2021-07-06  7:04 Sergei Trofimovich
2020-07-25 17:27 Andreas K. Hüttel
2020-07-25 12:26 Andreas K. Hüttel
2020-07-25 12:23 Andreas K. Hüttel
2020-07-25 12:20 Andreas K. Hüttel
2020-05-19 21:12 Andreas K. Hüttel

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1753310251.94c4ba7c7271a8356739b2da33bb921c9caa447d.sam@gentoo \
    --to=sam@gentoo.org \
    --cc=gentoo-commits@lists.gentoo.org \
    --cc=gentoo-dev@lists.gentoo.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox