public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
* [PATCH] RISC-V: hash with segment id and pcrel_hi address while recording pcrel_hi
@ 2024-06-21  1:24 lifang_xia
  2024-06-25  4:31 ` Nelson Chu
  0 siblings, 1 reply; 10+ messages in thread
From: lifang_xia @ 2024-06-21  1:24 UTC (permalink / raw)
  To: binutils; +Cc: nelson, Lifang Xia

From: Lifang Xia <lifang_xia@linux.alibaba.com>

When the same address across different segments needs to be recorded, it will
overwrite the slot, leading to a memory leak. To ensure uniqueness, the
segment ID needs to be included in the hash key calculation.

gas/
	* config/tc-riscv.c (riscv_pcrel_hi_fixup): New member "seg".
	(riscv_pcrel_fixup_hash): Get hash with seg->id and e->adrsess.
	(riscv_pcrel_fixup_eq): Check seg->id at first.
	(riscv_record_pcrel_fixup): New member "seg".
	(md_apply_fix) <case BFD_RELOC_RISCV_PCREL_HI20>: Likewise.
	(md_apply_fix) <case BFD_RELOC_RISCV_PCREL_LO12_I>: Likewise.
---
 gas/config/tc-riscv.c | 27 +++++++++++++++++----------
 1 file changed, 17 insertions(+), 10 deletions(-)

diff --git a/gas/config/tc-riscv.c b/gas/config/tc-riscv.c
index e0083702fbd..0461bfefe27 100644
--- a/gas/config/tc-riscv.c
+++ b/gas/config/tc-riscv.c
@@ -1784,6 +1784,7 @@ init_opcode_hash (const struct riscv_opcode *opcodes,
    help us resolve the corresponding low-part relocation later.  */
 typedef struct
 {
+  segT seg;
   bfd_vma address;
   symbolS *symbol;
   bfd_vma target;
@@ -1798,7 +1799,13 @@ static hashval_t
 riscv_pcrel_fixup_hash (const void *entry)
 {
   const riscv_pcrel_hi_fixup *e = entry;
-  return (hashval_t) (e->address);
+
+  /* the pcrel_hi with same address may reside in different segments,
+     to ensure uniqueness, the segment ID needs to be included in the
+     hash key calculation.
+     There is no hash for two integer, refer to ctf_hash_integer.  */
+  return htab_hash_pointer ((void *)(uintptr_t)e->seg->id)
+         + 59 * htab_hash_pointer ((void *)(uintptr_t)e->address);
 }
 
 /* Compare the keys between two entries fo the pcrel_hi hash table.  */
@@ -1807,16 +1814,17 @@ static int
 riscv_pcrel_fixup_eq (const void *entry1, const void *entry2)
 {
   const riscv_pcrel_hi_fixup *e1 = entry1, *e2 = entry2;
-  return e1->address == e2->address;
+  return e1->seg->id == e2->seg->id
+	  && e1->address == e2->address;
 }
 
 /* Record the pcrel_hi relocation.  */
 
 static bool
-riscv_record_pcrel_fixup (htab_t p, bfd_vma address, symbolS *symbol,
+riscv_record_pcrel_fixup (htab_t p, segT seg, bfd_vma address, symbolS *symbol,
 			  bfd_vma target)
 {
-  riscv_pcrel_hi_fixup entry = {address, symbol, target};
+  riscv_pcrel_hi_fixup entry = {seg, address, symbol, target};
   riscv_pcrel_hi_fixup **slot =
 	(riscv_pcrel_hi_fixup **) htab_find_slot (p, &entry, INSERT);
   if (slot == NULL)
@@ -4676,11 +4684,10 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
 	  bfd_vma value = target - md_pcrel_from (fixP);
 
 	  /* Record PCREL_HI20.  */
-	  if (!riscv_record_pcrel_fixup (riscv_pcrel_hi_fixup_hash,
-					 md_pcrel_from (fixP),
-					 fixP->fx_addsy,
-					 target))
-	    as_warn (_("too many pcrel_hi"));
+          if (!riscv_record_pcrel_fixup (riscv_pcrel_hi_fixup_hash, seg,
+                                         md_pcrel_from (fixP), fixP->fx_addsy,
+                                         target))
+            as_warn (_("too many pcrel_hi"));
 
 	  bfd_putl32 (bfd_getl32 (buf)
 		      | ENCODE_UTYPE_IMM (RISCV_CONST_HIGH_PART (value)),
@@ -4698,7 +4705,7 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
 	 and set fx_done for -mno-relax.  */
       {
 	bfd_vma location_pcrel_hi = S_GET_VALUE (fixP->fx_addsy) + *valP;
-	riscv_pcrel_hi_fixup search = {location_pcrel_hi, 0, 0};
+	riscv_pcrel_hi_fixup search = {seg, location_pcrel_hi, 0, 0};
 	riscv_pcrel_hi_fixup *entry = htab_find (riscv_pcrel_hi_fixup_hash,
 						 &search);
 	if (entry && entry->symbol
-- 
2.39.2 (Apple Git-143)


^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2024-07-05  1:09 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-06-21  1:24 [PATCH] RISC-V: hash with segment id and pcrel_hi address while recording pcrel_hi lifang_xia
2024-06-25  4:31 ` Nelson Chu
2024-06-25  8:25   ` Jan Beulich
2024-07-02  3:20     ` lifang_xia
2024-07-02  6:25       ` Jan Beulich
2024-07-04  1:56         ` [PATCH v2] " lifang_xia
2024-07-04  6:45           ` Jan Beulich
2024-07-04  9:18             ` Nelson Chu
2024-07-04 13:49               ` Nelson Chu
2024-07-05  1:09                 ` lifang_xia

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).