From: "Sam James" <sam@gentoo.org>
To: gentoo-commits@lists.gentoo.org
Subject: [gentoo-commits] proj/gcc-patches:master commit in: 15.0.0/gentoo/
Date: Fri, 18 Oct 2024 10:35:42 +0000 (UTC) [thread overview]
Message-ID: <1729247687.462456df6da32e138cdc1e18df6e681cc2dc948a.sam@gentoo> (raw)
commit: 462456df6da32e138cdc1e18df6e681cc2dc948a
Author: Sam James <sam <AT> gentoo <DOT> org>
AuthorDate: Fri Oct 18 10:34:47 2024 +0000
Commit: Sam James <sam <AT> gentoo <DOT> org>
CommitDate: Fri Oct 18 10:34:47 2024 +0000
URL: https://gitweb.gentoo.org/proj/gcc-patches.git/commit/?id=462456df
15.0.0: revert some embed patches
Do as Jakub suggests at https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117190#c3
and revert these for now until a fix can be applied.
Bug: https://gcc.gnu.org/PR117190
Bug: https://gcc.gnu.org/PR117199
Bug: https://gcc.gnu.org/PR117201
Signed-off-by: Sam James <sam <AT> gentoo.org>
...x-up-speed-up-compilation-of-large-char-a.patch | 97 ++++++++++
...eed-up-compilation-of-large-char-array-in.patch | 212 +++++++++++++++++++++
2 files changed, 309 insertions(+)
diff --git a/15.0.0/gentoo/73_all_PR117190-Revert-c-Fix-up-speed-up-compilation-of-large-char-a.patch b/15.0.0/gentoo/73_all_PR117190-Revert-c-Fix-up-speed-up-compilation-of-large-char-a.patch
new file mode 100644
index 0000000..47f26cc
--- /dev/null
+++ b/15.0.0/gentoo/73_all_PR117190-Revert-c-Fix-up-speed-up-compilation-of-large-char-a.patch
@@ -0,0 +1,97 @@
+From bfec21e6cf88b0b64bfcc30d2f5ae3b3370e36e3 Mon Sep 17 00:00:00 2001
+Message-ID: <bfec21e6cf88b0b64bfcc30d2f5ae3b3370e36e3.1729247640.git.sam@gentoo.org>
+From: Sam James <sam@gentoo.org>
+Date: Fri, 18 Oct 2024 11:31:20 +0100
+Subject: [PATCH 1/2] Revert "c: Fix up speed up compilation of large char
+ array initializers when not using #embed [PR117177]"
+
+This reverts commit 96ba5e5663d4390a7e69735ce3c9de657fc543fc.
+
+Keep the testcase.
+
+Bug: https://gcc.gnu.org/PR117190
+---
+ gcc/c/c-parser.cc | 35 ++++++++++-------------------------
+ 1 file changed, 10 insertions(+), 25 deletions(-)
+
+diff --git a/gcc/c/c-parser.cc b/gcc/c/c-parser.cc
+index 090ab1cbc088..e4381044e5cb 100644
+--- a/gcc/c/c-parser.cc
++++ b/gcc/c/c-parser.cc
+@@ -6529,7 +6529,6 @@ c_parser_initval (c_parser *parser, struct c_expr *after,
+ unsigned int i;
+ gcc_checking_assert (len >= 64);
+ location_t last_loc = UNKNOWN_LOCATION;
+- location_t prev_loc = UNKNOWN_LOCATION;
+ for (i = 0; i < 64; ++i)
+ {
+ c_token *tok = c_parser_peek_nth_token_raw (parser, 1 + 2 * i);
+@@ -6545,7 +6544,6 @@ c_parser_initval (c_parser *parser, struct c_expr *after,
+ buf1[i] = (char) tree_to_uhwi (tok->value);
+ if (i == 0)
+ loc = tok->location;
+- prev_loc = last_loc;
+ last_loc = tok->location;
+ }
+ if (i < 64)
+@@ -6569,7 +6567,6 @@ c_parser_initval (c_parser *parser, struct c_expr *after,
+ unsigned int max_len = 131072 - offsetof (struct tree_string, str) - 1;
+ unsigned int orig_len = len;
+ unsigned int off = 0, last = 0;
+- unsigned char lastc = 0;
+ if (!wi::neg_p (wi::to_wide (val)) && wi::to_widest (val) <= UCHAR_MAX)
+ off = 1;
+ len = MIN (len, max_len - off);
+@@ -6599,25 +6596,20 @@ c_parser_initval (c_parser *parser, struct c_expr *after,
+ if (tok2->type != CPP_COMMA && tok2->type != CPP_CLOSE_BRACE)
+ break;
+ buf2[i + off] = (char) tree_to_uhwi (tok->value);
+- prev_loc = last_loc;
++ /* If orig_len is INT_MAX, this can be flexible array member and
++ in that case we need to ensure another element which
++ for CPP_EMBED is normally guaranteed after it. Include
++ that byte in the RAW_DATA_OWNER though, so it can be optimized
++ later. */
++ if (tok2->type == CPP_CLOSE_BRACE && orig_len == INT_MAX)
++ {
++ last = 1;
++ break;
++ }
+ last_loc = tok->location;
+ c_parser_consume_token (parser);
+ c_parser_consume_token (parser);
+ }
+- /* If orig_len is INT_MAX, this can be flexible array member and
+- in that case we need to ensure another element which
+- for CPP_EMBED is normally guaranteed after it. Include
+- that byte in the RAW_DATA_OWNER though, so it can be optimized
+- later. */
+- if (orig_len == INT_MAX
+- && (!c_parser_next_token_is (parser, CPP_COMMA)
+- || c_parser_peek_2nd_token (parser)->type != CPP_NUMBER))
+- {
+- --i;
+- last = 1;
+- std::swap (prev_loc, last_loc);
+- lastc = (unsigned char) buf2[i + off];
+- }
+ val = make_node (RAW_DATA_CST);
+ TREE_TYPE (val) = integer_type_node;
+ RAW_DATA_LENGTH (val) = i;
+@@ -6633,13 +6625,6 @@ c_parser_initval (c_parser *parser, struct c_expr *after,
+ init.original_type = integer_type_node;
+ init.m_decimal = 0;
+ process_init_element (loc, init, false, braced_init_obstack);
+- if (last)
+- {
+- init.value = build_int_cst (integer_type_node, lastc);
+- init.original_code = INTEGER_CST;
+- set_c_expr_source_range (&init, prev_loc, prev_loc);
+- process_init_element (prev_loc, init, false, braced_init_obstack);
+- }
+ }
+ }
+
+--
+2.47.0
+
diff --git a/15.0.0/gentoo/74_all_PR117190-Revert-c-Speed-up-compilation-of-large-char-array-in.patch b/15.0.0/gentoo/74_all_PR117190-Revert-c-Speed-up-compilation-of-large-char-array-in.patch
new file mode 100644
index 0000000..889c961
--- /dev/null
+++ b/15.0.0/gentoo/74_all_PR117190-Revert-c-Speed-up-compilation-of-large-char-array-in.patch
@@ -0,0 +1,212 @@
+From ec2844301e40a017a32b4f11f499d6db7629c6bf Mon Sep 17 00:00:00 2001
+Message-ID: <ec2844301e40a017a32b4f11f499d6db7629c6bf.1729247640.git.sam@gentoo.org>
+In-Reply-To: <bfec21e6cf88b0b64bfcc30d2f5ae3b3370e36e3.1729247640.git.sam@gentoo.org>
+References: <bfec21e6cf88b0b64bfcc30d2f5ae3b3370e36e3.1729247640.git.sam@gentoo.org>
+From: Sam James <sam@gentoo.org>
+Date: Fri, 18 Oct 2024 11:31:27 +0100
+Subject: [PATCH 2/2] Revert "c: Speed up compilation of large char array
+ initializers when not using #embed"
+
+This reverts commit f9bac238840155e1539aa68daf1507ea63c9ed80.
+
+Keep the testcase.
+
+Bug: https://gcc.gnu.org/PR117190
+---
+ gcc/c/c-parser.cc | 118 ----------------------------------------------
+ gcc/c/c-tree.h | 1 -
+ gcc/c/c-typeck.cc | 36 --------------
+ 3 files changed, 155 deletions(-)
+
+diff --git a/gcc/c/c-parser.cc b/gcc/c/c-parser.cc
+index e4381044e5cb..9518459a0a57 100644
+--- a/gcc/c/c-parser.cc
++++ b/gcc/c/c-parser.cc
+@@ -6507,125 +6507,7 @@ c_parser_initval (c_parser *parser, struct c_expr *after,
+ (init.value))))
+ init = convert_lvalue_to_rvalue (loc, init, true, true, true);
+ }
+- tree val = init.value;
+ process_init_element (loc, init, false, braced_init_obstack);
+-
+- /* Attempt to optimize large char array initializers into RAW_DATA_CST
+- to save compile time and memory even when not using #embed. */
+- static unsigned vals_to_ignore;
+- if (vals_to_ignore)
+- /* If earlier call determined there is certain number of CPP_COMMA
+- CPP_NUMBER tokens with 0-255 int values, but not enough for
+- RAW_DATA_CST to be beneficial, don't try to check it again until
+- they are all parsed. */
+- --vals_to_ignore;
+- else if (val
+- && TREE_CODE (val) == INTEGER_CST
+- && TREE_TYPE (val) == integer_type_node
+- && c_parser_next_token_is (parser, CPP_COMMA))
+- if (unsigned int len = c_maybe_optimize_large_byte_initializer ())
+- {
+- char buf1[64];
+- unsigned int i;
+- gcc_checking_assert (len >= 64);
+- location_t last_loc = UNKNOWN_LOCATION;
+- for (i = 0; i < 64; ++i)
+- {
+- c_token *tok = c_parser_peek_nth_token_raw (parser, 1 + 2 * i);
+- if (tok->type != CPP_COMMA)
+- break;
+- tok = c_parser_peek_nth_token_raw (parser, 2 + 2 * i);
+- if (tok->type != CPP_NUMBER
+- || TREE_CODE (tok->value) != INTEGER_CST
+- || TREE_TYPE (tok->value) != integer_type_node
+- || wi::neg_p (wi::to_wide (tok->value))
+- || wi::to_widest (tok->value) > UCHAR_MAX)
+- break;
+- buf1[i] = (char) tree_to_uhwi (tok->value);
+- if (i == 0)
+- loc = tok->location;
+- last_loc = tok->location;
+- }
+- if (i < 64)
+- {
+- vals_to_ignore = i;
+- return;
+- }
+- c_token *tok = c_parser_peek_nth_token_raw (parser, 1 + 2 * i);
+- /* If 64 CPP_COMMA CPP_NUMBER pairs are followed by CPP_CLOSE_BRACE,
+- punt if len is INT_MAX as that can mean this is a flexible array
+- member and in that case we need one CPP_NUMBER afterwards
+- (as guaranteed for CPP_EMBED). */
+- if (tok->type == CPP_CLOSE_BRACE && len != INT_MAX)
+- len = i;
+- else if (tok->type != CPP_COMMA)
+- {
+- vals_to_ignore = i;
+- return;
+- }
+- /* Ensure the STRING_CST fits into 128K. */
+- unsigned int max_len = 131072 - offsetof (struct tree_string, str) - 1;
+- unsigned int orig_len = len;
+- unsigned int off = 0, last = 0;
+- if (!wi::neg_p (wi::to_wide (val)) && wi::to_widest (val) <= UCHAR_MAX)
+- off = 1;
+- len = MIN (len, max_len - off);
+- char *buf2 = XNEWVEC (char, len + off);
+- if (off)
+- buf2[0] = (char) tree_to_uhwi (val);
+- memcpy (buf2 + off, buf1, i);
+- for (unsigned int j = 0; j < i; ++j)
+- {
+- c_parser_peek_token (parser);
+- c_parser_consume_token (parser);
+- c_parser_peek_token (parser);
+- c_parser_consume_token (parser);
+- }
+- for (; i < len; ++i)
+- {
+- if (!c_parser_next_token_is (parser, CPP_COMMA))
+- break;
+- tok = c_parser_peek_2nd_token (parser);
+- if (tok->type != CPP_NUMBER
+- || TREE_CODE (tok->value) != INTEGER_CST
+- || TREE_TYPE (tok->value) != integer_type_node
+- || wi::neg_p (wi::to_wide (tok->value))
+- || wi::to_widest (tok->value) > UCHAR_MAX)
+- break;
+- c_token *tok2 = c_parser_peek_nth_token (parser, 3);
+- if (tok2->type != CPP_COMMA && tok2->type != CPP_CLOSE_BRACE)
+- break;
+- buf2[i + off] = (char) tree_to_uhwi (tok->value);
+- /* If orig_len is INT_MAX, this can be flexible array member and
+- in that case we need to ensure another element which
+- for CPP_EMBED is normally guaranteed after it. Include
+- that byte in the RAW_DATA_OWNER though, so it can be optimized
+- later. */
+- if (tok2->type == CPP_CLOSE_BRACE && orig_len == INT_MAX)
+- {
+- last = 1;
+- break;
+- }
+- last_loc = tok->location;
+- c_parser_consume_token (parser);
+- c_parser_consume_token (parser);
+- }
+- val = make_node (RAW_DATA_CST);
+- TREE_TYPE (val) = integer_type_node;
+- RAW_DATA_LENGTH (val) = i;
+- tree owner = build_string (i + off + last, buf2);
+- XDELETEVEC (buf2);
+- TREE_TYPE (owner) = build_array_type_nelts (unsigned_char_type_node,
+- i + off + last);
+- RAW_DATA_OWNER (val) = owner;
+- RAW_DATA_POINTER (val) = TREE_STRING_POINTER (owner) + off;
+- init.value = val;
+- set_c_expr_source_range (&init, loc, last_loc);
+- init.original_code = RAW_DATA_CST;
+- init.original_type = integer_type_node;
+- init.m_decimal = 0;
+- process_init_element (loc, init, false, braced_init_obstack);
+- }
+ }
+
+ /* Parse a compound statement (possibly a function body) (C90 6.6.2,
+diff --git a/gcc/c/c-tree.h b/gcc/c/c-tree.h
+index bfdcb78bbcc1..e23d8e59ac4b 100644
+--- a/gcc/c/c-tree.h
++++ b/gcc/c/c-tree.h
+@@ -832,7 +832,6 @@ extern struct c_expr pop_init_level (location_t, int, struct obstack *,
+ location_t);
+ extern void set_init_index (location_t, tree, tree, struct obstack *);
+ extern void set_init_label (location_t, tree, location_t, struct obstack *);
+-unsigned c_maybe_optimize_large_byte_initializer (void);
+ extern void process_init_element (location_t, struct c_expr, bool,
+ struct obstack *);
+ extern tree build_compound_literal (location_t, tree, tree, bool,
+diff --git a/gcc/c/c-typeck.cc b/gcc/c/c-typeck.cc
+index 108ea5ca3e8c..36d0b23a3d72 100644
+--- a/gcc/c/c-typeck.cc
++++ b/gcc/c/c-typeck.cc
+@@ -11347,42 +11347,6 @@ maybe_split_raw_data (tree value, tree *raw_data)
+ return value;
+ }
+
+-/* Return non-zero if c_parser_initval should attempt to optimize
+- large initializers into RAW_DATA_CST. In that case return how
+- many elements to optimize at most. */
+-
+-unsigned
+-c_maybe_optimize_large_byte_initializer (void)
+-{
+- if (!constructor_type
+- || TREE_CODE (constructor_type) != ARRAY_TYPE
+- || constructor_stack->implicit)
+- return 0;
+- tree elttype = TYPE_MAIN_VARIANT (TREE_TYPE (constructor_type));
+- if (TREE_CODE (elttype) != INTEGER_TYPE
+- && TREE_CODE (elttype) != BITINT_TYPE)
+- return 0;
+- if (TYPE_PRECISION (elttype) != CHAR_BIT
+- || constructor_stack->replacement_value.value
+- || (COMPLETE_TYPE_P (constructor_type)
+- && !poly_int_tree_p (TYPE_SIZE (constructor_type)))
+- || constructor_range_stack)
+- return 0;
+- if (constructor_max_index == NULL_TREE)
+- return INT_MAX;
+- if (tree_int_cst_le (constructor_max_index, constructor_index)
+- || integer_all_onesp (constructor_max_index))
+- return 0;
+- widest_int w = wi::to_widest (constructor_max_index);
+- w -= wi::to_widest (constructor_index);
+- w += 1;
+- if (w < 64)
+- return 0;
+- if (w > INT_MAX)
+- return INT_MAX;
+- return w.to_uhwi ();
+-}
+-
+ /* Add one non-braced element to the current constructor level.
+ This adjusts the current position within the constructor's type.
+ This may also start or terminate implicit levels
+--
+2.47.0
+
next reply other threads:[~2024-10-18 10:35 UTC|newest]
Thread overview: 184+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-10-18 10:35 Sam James [this message]
-- strict thread matches above, loose matches on Subject: below --
2025-03-26 6:25 [gentoo-commits] proj/gcc-patches:master commit in: 15.0.0/gentoo/ Sam James
2025-03-25 10:27 Sam James
2025-03-25 8:38 Sam James
2025-03-25 2:32 Sam James
2025-03-25 1:27 Sam James
2025-03-24 0:35 Sam James
2025-03-21 19:31 Sam James
2025-03-21 17:21 Sam James
2025-03-21 16:23 Sam James
2025-03-21 11:20 Sam James
2025-03-21 8:51 Sam James
2025-03-21 6:07 Sam James
2025-03-20 22:08 Sam James
2025-03-20 1:59 Sam James
2025-03-20 1:59 Sam James
2025-03-16 22:37 Sam James
2025-03-14 14:46 Sam James
2025-03-14 13:37 Sam James
2025-03-13 16:48 Sam James
2025-03-13 10:08 Sam James
2025-03-11 10:32 Sam James
2025-03-07 16:54 Sam James
2025-03-03 16:38 Sam James
2025-03-01 10:33 Sam James
2025-03-01 6:50 Sam James
2025-02-17 1:30 Sam James
2025-02-13 9:23 Sam James
2025-02-12 15:12 Sam James
2025-02-10 21:22 Sam James
2025-02-09 23:58 Sam James
2025-02-07 23:37 Sam James
2025-02-07 21:19 Sam James
2025-02-03 22:04 Sam James
2025-02-02 22:41 Sam James
2025-01-29 20:21 Sam James
2025-01-26 22:52 Sam James
2025-01-22 16:27 Sam James
2025-01-19 22:43 Sam James
2025-01-16 23:11 Sam James
2025-01-16 23:11 Sam James
2025-01-15 11:41 Sam James
2025-01-14 16:22 Sam James
2025-01-14 15:06 Sam James
2025-01-14 15:06 Sam James
2025-01-14 12:29 Sam James
2025-01-14 8:43 Sam James
2025-01-14 8:40 Sam James
2025-01-13 13:58 Sam James
2025-01-13 6:00 Sam James
2025-01-13 3:40 Sam James
2025-01-13 3:23 Sam James
2025-01-13 3:20 Sam James
2025-01-13 0:20 Sam James
2025-01-12 18:53 Sam James
2025-01-11 12:53 Sam James
2025-01-08 21:51 Sam James
2025-01-06 10:50 Sam James
2025-01-06 10:03 Sam James
2025-01-06 4:49 Sam James
2025-01-06 4:44 Sam James
2025-01-06 4:13 Sam James
2025-01-06 4:13 Sam James
2025-01-06 4:13 Sam James
2025-01-06 4:03 Sam James
2025-01-05 23:19 Sam James
2025-01-03 3:07 Sam James
2024-12-30 1:05 Sam James
2024-12-29 10:00 Sam James
2024-12-27 15:14 Sam James
2024-12-24 20:48 Sam James
2024-12-22 22:46 Sam James
2024-12-20 11:25 Sam James
2024-12-20 5:57 Sam James
2024-12-20 1:55 Sam James
2024-12-19 18:34 Sam James
2024-12-13 13:23 Sam James
2024-12-13 11:52 Sam James
2024-12-13 5:08 Sam James
2024-12-12 12:28 Sam James
2024-12-11 4:41 Sam James
2024-12-11 0:58 Sam James
2024-12-10 19:19 Sam James
2024-12-10 14:55 Sam James
2024-12-10 5:19 Sam James
2024-12-10 5:13 Sam James
2024-12-10 5:11 Sam James
2024-12-10 5:07 Sam James
2024-12-09 3:05 Sam James
2024-12-08 22:41 Sam James
2024-12-06 17:33 Sam James
2024-12-04 20:40 Sam James
2024-12-01 22:51 Sam James
2024-12-01 22:51 Sam James
2024-11-30 11:30 Sam James
2024-11-27 17:42 Sam James
2024-11-25 15:10 Sam James
2024-11-25 3:01 Sam James
2024-11-25 3:00 Sam James
2024-11-25 3:00 Sam James
2024-11-24 22:42 Sam James
2024-11-18 17:25 Sam James
2024-11-18 10:42 Sam James
2024-11-18 10:42 Sam James
2024-11-18 9:25 Sam James
2024-11-18 9:25 Sam James
2024-11-14 18:38 Sam James
2024-11-13 4:26 Sam James
2024-11-13 0:16 Sam James
2024-11-12 2:33 Sam James
2024-11-11 19:46 Sam James
2024-11-11 19:46 Sam James
2024-11-10 22:41 Sam James
2024-11-09 16:24 Sam James
2024-11-09 7:55 Sam James
2024-11-08 8:22 Sam James
2024-11-07 16:13 Sam James
2024-11-03 23:16 Sam James
2024-11-01 8:24 Sam James
2024-11-01 8:24 Sam James
2024-11-01 8:18 Sam James
2024-11-01 8:17 Sam James
2024-10-30 16:03 Sam James
2024-10-29 19:17 Sam James
2024-10-28 21:32 Sam James
2024-10-28 8:09 Sam James
2024-10-23 15:40 Sam James
2024-10-22 19:09 Sam James
2024-10-22 18:34 Sam James
2024-10-21 12:33 Sam James
2024-10-21 12:27 Sam James
2024-10-21 12:26 Sam James
2024-10-21 11:45 Sam James
2024-10-20 22:42 Sam James
2024-10-18 14:05 Sam James
2024-10-17 23:33 Sam James
2024-10-17 23:03 Sam James
2024-10-17 5:01 Sam James
2024-10-17 4:15 Sam James
2024-10-13 22:48 Sam James
2024-10-07 2:45 Sam James
2024-10-04 10:37 Sam James
2024-10-04 9:28 Sam James
2024-10-02 19:45 Sam James
2024-09-30 14:05 Sam James
2024-09-29 22:56 Sam James
2024-09-24 1:41 Sam James
2024-09-23 15:23 Sam James
2024-09-02 2:28 Sam James
2024-08-26 13:44 Sam James
2024-08-26 6:24 Sam James
2024-08-23 13:51 Sam James
2024-08-20 20:31 Sam James
2024-08-19 18:43 Sam James
2024-08-14 9:48 Sam James
2024-08-14 2:57 Sam James
2024-08-11 22:40 Sam James
2024-08-09 19:54 Sam James
2024-08-09 19:54 Sam James
2024-08-09 19:47 Sam James
2024-08-09 19:25 Sam James
2024-08-08 11:10 Sam James
2024-08-08 11:06 Sam James
2024-08-08 11:03 Sam James
2024-08-05 9:09 Sam James
2024-08-05 1:54 Sam James
2024-08-05 1:51 Sam James
2024-08-02 20:39 Sam James
2024-08-01 14:40 Sam James
2024-07-28 23:34 Sam James
2024-07-22 1:11 Sam James
2024-07-19 11:14 Sam James
2024-07-18 0:45 Sam James
2024-07-14 23:36 Sam James
2024-06-28 12:49 Sam James
2024-06-27 0:02 Sam James
2024-06-26 23:57 Sam James
2024-06-16 22:45 Sam James
2024-06-10 20:18 Sam James
2024-06-10 17:28 Sam James
2024-06-10 17:28 Sam James
2024-06-10 2:08 Sam James
2024-06-08 17:03 Sam James
2024-06-08 17:03 Sam James
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=1729247687.462456df6da32e138cdc1e18df6e681cc2dc948a.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