Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package binutils for openSUSE:Factory 
checked in at 2023-06-03 00:05:05
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/binutils (Old)
 and      /work/SRC/openSUSE:Factory/.binutils.new.15902 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "binutils"

Sat Jun  3 00:05:05 2023 rev:166 rq:1089814 version:2.40

Changes:
--------
--- /work/SRC/openSUSE:Factory/binutils/binutils.changes        2023-04-14 
13:12:40.531425713 +0200
+++ /work/SRC/openSUSE:Factory/.binutils.new.15902/binutils.changes     
2023-06-03 00:05:10.605263741 +0200
@@ -1,0 +2,7 @@
+Tue May 30 09:43:15 UTC 2023 - Andreas Schwab <sch...@suse.de>
+
+- riscv-dynamic-tls-reloc-pie.patch: Backport for PR ld/22263 and PR
+  ld/25694
+- riscv-pr22263-1.patch: Backport for PR ld/22263
+
+-------------------------------------------------------------------

New:
----
  riscv-dynamic-tls-reloc-pie.patch
  riscv-pr22263-1.patch

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ binutils.spec ++++++
--- /var/tmp/diff_new_pack.O1yQWe/_old  2023-06-03 00:05:13.381280132 +0200
+++ /var/tmp/diff_new_pack.O1yQWe/_new  2023-06-03 00:05:13.389280180 +0200
@@ -154,6 +154,8 @@
 Patch43:        binutils-revert-hlasm-insns.diff
 Patch44:        binutils-revert-rela.diff
 Patch45:        extensa-gcc-4_3-fix.diff
+Patch46:        riscv-dynamic-tls-reloc-pie.patch
+Patch47:        riscv-pr22263-1.patch
 Patch100:       add-ulp-section.diff
 Patch90:        cross-avr-nesc-as.patch
 Patch92:        cross-avr-omit_section_dynsym.patch
@@ -278,6 +280,8 @@
 %patch44 -p1
 %patch45 -p1
 %endif
+%patch46 -p1
+%patch47 -p1
 %patch100 -p1
 %if "%{TARGET}" == "avr"
 cp gas/config/tc-avr.h gas/config/tc-avr-nesc.h



++++++ riscv-dynamic-tls-reloc-pie.patch ++++++
>From f491758f183592cbf8113e02a2bebbd412ff7358 Mon Sep 17 00:00:00 2001
From: Nelson Chu <nel...@nelson.ba.rivosinc.com>
Date: Thu, 4 May 2023 17:08:50 +0800
Subject: [PATCH] [PR ld/22263][PR ld/25694] RISC-V: Avoid dynamic TLS relocs
 in PIE.

Lots of targets already fixed the TEXTREL problem for TLS in PIE.

* For PR ld/25694,
In the check_reloc, refer to spare and loongarch, they don't need to reserve
any local dynamic reloc for TLS LE in pie/pde, and similar to other targets.
So it seems like riscv was too conservative to estimate the TLS LE before.
Just break and don't goto static_reloc for TLS LE in pie/pde can fix the
TEXTREL problem.

* For PR ld/22263,
The risc-v code for TLS GD/IE in the relocate_section seems same as MIPS port.
So similar to MIPS, pr22570, commits 9143e72c6d4d and 1cb83cac9a89, it seems
also the right way to do the same thing for risc-v.

On risc-v, fixes
FAIL: Build pr22263-1

RISC-V haven't supported the TLS transitions, so will need the same fix (use
bfd_link_dll) in the future.

bfd/
        PR ld/22263
        PR ld/25694
        * elfnn-riscv.c (riscv_elf_check_relocs): Replace bfd_link_pic with
        bfd_link_dll for TLS IE.  Don't need to reserve the local dynamic
        relocation for TLS LE in pie/pde, and report error in pic just like
        before.
        (riscv_elf_relocate_section): For TLS GD/IE, use bfd_link_dll rather
        than !bfd_link_pic in determining the dynamic symbol index.  Avoid
        the index of -1.
---
 bfd/elfnn-riscv.c | 25 +++++++++++--------------
 1 file changed, 11 insertions(+), 14 deletions(-)

diff --git a/bfd/elfnn-riscv.c b/bfd/elfnn-riscv.c
index 4a5da7df3fe..ee2d19f7699 100644
--- a/bfd/elfnn-riscv.c
+++ b/bfd/elfnn-riscv.c
@@ -732,7 +732,7 @@ riscv_elf_check_relocs (bfd *abfd, struct bfd_link_info 
*info,
          break;
 
        case R_RISCV_TLS_GOT_HI20:
-         if (bfd_link_pic (info))
+         if (bfd_link_dll (info))
            info->flags |= DF_STATIC_TLS;
          if (!riscv_elf_record_got_reference (abfd, info, h, r_symndx)
              || !riscv_elf_record_tls_type (abfd, h, r_symndx, GOT_TLS_IE))
@@ -787,11 +787,12 @@ riscv_elf_check_relocs (bfd *abfd, struct bfd_link_info 
*info,
          goto static_reloc;
 
        case R_RISCV_TPREL_HI20:
+         /* This is not allowed in the pic, but okay in pie.  */
          if (!bfd_link_executable (info))
            return bad_static_reloc (abfd, r_type, h);
          if (h != NULL)
            riscv_elf_record_tls_type (abfd, h, r_symndx, GOT_TLS_LE);
-         goto static_reloc;
+         break;
 
        case R_RISCV_HI20:
          if (bfd_link_pic (info))
@@ -2689,24 +2690,20 @@ riscv_elf_relocate_section (bfd *output_bfd,
              if (htab->elf.srelgot == NULL)
                abort ();
 
-             if (h != NULL)
-               {
-                 bool dyn, pic;
-                 dyn = htab->elf.dynamic_sections_created;
-                 pic = bfd_link_pic (info);
-
-                 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, pic, h)
-                     && (!pic || !SYMBOL_REFERENCES_LOCAL (info, h)))
-                   indx = h->dynindx;
-               }
+             bool dyn = elf_hash_table (info)->dynamic_sections_created;
+             if (h != NULL
+                 && h->dynindx != -1
+                 && WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), 
h)
+                 && (bfd_link_dll (info) || !SYMBOL_REFERENCES_LOCAL (info, 
h)))
+               indx = h->dynindx;
 
              /* The GOT entries have not been initialized yet.  Do it
                 now, and emit any relocations.  */
-             if ((bfd_link_pic (info) || indx != 0)
+             if ((bfd_link_dll (info) || indx != 0)
                  && (h == NULL
                      || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
                      || h->root.type != bfd_link_hash_undefweak))
-                   need_relocs = true;
+               need_relocs = true;
 
              if (tls_type & GOT_TLS_GD)
                {
-- 
2.40.1


++++++ riscv-pr22263-1.patch ++++++
>From 53e0482788fa665f532936ba3637bc0fcde6db2c Mon Sep 17 00:00:00 2001
From: Nelson Chu <nel...@rivosinc.com>
Date: Sat, 27 May 2023 09:36:20 +0800
Subject: [PATCH] RISC-V: Avoid spurious R_RISCV_NONE for pr22263-1 test.

For TLS GD/IE, add the same condition with the relocate_section in the
allocate_dynrelocs, to make sure we won't reserve redundant spaces
for dynamic relocations since the conservative estimatation.

After applying this patch, ld seems no longer generate the spurious
R_RISCV_NONE for pr22263-1 test.

bfd/
        PR ld/22263
        * elfnn-riscv.c (RISCV_TLS_GD_IE_NEED_DYN_RELOC): New defined.
        Set NEED_RELOC to true if TLS GD/IE needs dynamic relocations,
        and INDX will be the dynamic index.
        (allocate_dynrelocs): Don't reserve extra spaces in the rela.got
        if RISCV_TLS_GD_IE_NEED_DYN_RELOC set need_reloc to false.  This
        condition needs to be same as relocate_section.
        (relocate_section): Likewise, use the same condition as
        allocate_dynrelocs.
---
 bfd/elfnn-riscv.c | 41 ++++++++++++++++++++++++++++-------------
 1 file changed, 28 insertions(+), 13 deletions(-)

diff --git a/bfd/elfnn-riscv.c b/bfd/elfnn-riscv.c
index ee2d19f7699..d02c4a29324 100644
--- a/bfd/elfnn-riscv.c
+++ b/bfd/elfnn-riscv.c
@@ -38,6 +38,25 @@
 #define CHAR_BIT 8
 #endif
 
+/* Set NEED_RELOC to true if TLS GD/IE needs dynamic relocations, and INDX will
+   be the dynamic index.  PR22263, use the same check in allocate_dynrelocs and
+   riscv_elf_relocate_section for TLS GD/IE.  */
+#define RISCV_TLS_GD_IE_NEED_DYN_RELOC(INFO, DYN, H, INDX, NEED_RELOC) \
+  do \
+    { \
+      if ((H) != NULL \
+         && (H)->dynindx != -1 \
+         && WILL_CALL_FINISH_DYNAMIC_SYMBOL ((DYN), bfd_link_pic (INFO), (H)) \
+         && (bfd_link_dll (INFO) || !SYMBOL_REFERENCES_LOCAL ((INFO), (H)))) \
+       (INDX) = (H)->dynindx; \
+      if ((bfd_link_dll (INFO) || (INDX) != 0) \
+         && ((H) == NULL \
+             || ELF_ST_VISIBILITY ((H)->other) == STV_DEFAULT \
+             || (H)->root.type != bfd_link_hash_undefweak)) \
+       (NEED_RELOC) = true; \
+    } \
+  while (0)
+
 /* Internal relocations used exclusively by the relaxation pass.  */
 #define R_RISCV_DELETE (R_RISCV_max + 1)
 
@@ -1186,18 +1205,24 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void 
*inf)
       dyn = htab->elf.dynamic_sections_created;
       if (tls_type & (GOT_TLS_GD | GOT_TLS_IE))
        {
+         int indx = 0;
+         bool need_reloc = false;
+         RISCV_TLS_GD_IE_NEED_DYN_RELOC(info, dyn, h, indx, need_reloc);
+
          /* TLS_GD needs two dynamic relocs and two GOT slots.  */
          if (tls_type & GOT_TLS_GD)
            {
              s->size += 2 * RISCV_ELF_WORD_BYTES;
-             htab->elf.srelgot->size += 2 * sizeof (ElfNN_External_Rela);
+             if (need_reloc)
+               htab->elf.srelgot->size += 2 * sizeof (ElfNN_External_Rela);
            }
 
          /* TLS_IE needs one dynamic reloc and one GOT slot.  */
          if (tls_type & GOT_TLS_IE)
            {
              s->size += RISCV_ELF_WORD_BYTES;
-             htab->elf.srelgot->size += sizeof (ElfNN_External_Rela);
+             if (need_reloc)
+               htab->elf.srelgot->size += sizeof (ElfNN_External_Rela);
            }
        }
       else
@@ -2691,20 +2716,10 @@ riscv_elf_relocate_section (bfd *output_bfd,
                abort ();
 
              bool dyn = elf_hash_table (info)->dynamic_sections_created;
-             if (h != NULL
-                 && h->dynindx != -1
-                 && WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), 
h)
-                 && (bfd_link_dll (info) || !SYMBOL_REFERENCES_LOCAL (info, 
h)))
-               indx = h->dynindx;
+             RISCV_TLS_GD_IE_NEED_DYN_RELOC (info, dyn, h, indx, need_relocs);
 
              /* The GOT entries have not been initialized yet.  Do it
                 now, and emit any relocations.  */
-             if ((bfd_link_dll (info) || indx != 0)
-                 && (h == NULL
-                     || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
-                     || h->root.type != bfd_link_hash_undefweak))
-               need_relocs = true;
-
              if (tls_type & GOT_TLS_GD)
                {
                  if (need_relocs)
-- 
2.40.1

Reply via email to