aboutsummaryrefslogtreecommitdiff
path: root/gas
diff options
context:
space:
mode:
authormengqinggang <mengqinggang@loongson.cn>2024-05-29 14:50:39 +0800
committerliuzhensong <liuzhensong@loongson.cn>2024-06-04 19:47:20 +0800
commit5f4fa40e4def33ed428b2d72aeb2bf24b50a664e (patch)
treeb2302f426f3b27b97b27b957ee0dc00717af4c42 /gas
parentb472e4cfd63c551543b6a1653f3cff03162b7403 (diff)
downloadgdb-5f4fa40e4def33ed428b2d72aeb2bf24b50a664e.zip
gdb-5f4fa40e4def33ed428b2d72aeb2bf24b50a664e.tar.gz
gdb-5f4fa40e4def33ed428b2d72aeb2bf24b50a664e.tar.bz2
LoongArch: Make align symbol be in same section with alignment directive
R_LARCH_ALIGN (psABI v2.30) requires a symbol index. The symbol is only created at the first time to handle alignment directive. This means that all other sections may use this symbol. If the section of this symbol is discarded, there may be problems. Search it in its own section. Remove elf_backend_data.is_rela_normal() function added at commit daeda14191c. Co-authored-by: Jinyang He <hejinyang@loongson.cn> Reported-by: WANG Xuerui <git@xen0n.name> Link: https://lore.kernel.org/loongarch/2abbb633-a10e-71cc-a5e1-4d9e39074066@loongson.cn/T/#t
Diffstat (limited to 'gas')
-rw-r--r--gas/config/tc-loongarch.c63
-rw-r--r--gas/config/tc-loongarch.h3
-rw-r--r--gas/testsuite/gas/loongarch/relax-align2.d24
-rw-r--r--gas/testsuite/gas/loongarch/relax-align2.s11
-rw-r--r--gas/testsuite/gas/loongarch/relax_align.d6
5 files changed, 103 insertions, 4 deletions
diff --git a/gas/config/tc-loongarch.c b/gas/config/tc-loongarch.c
index 00b8c80..e7de9d8 100644
--- a/gas/config/tc-loongarch.c
+++ b/gas/config/tc-loongarch.c
@@ -419,6 +419,55 @@ loongarch_target_format ()
return LARCH_opts.ase_lp64 ? "elf64-loongarch" : "elf32-loongarch";
}
+typedef struct
+{
+ unsigned int sec_id;
+ symbolS *s;
+} align_sec_sym;
+
+static htab_t align_hash;
+
+static hashval_t
+align_sec_sym_hash (const void *entry)
+{
+ const align_sec_sym *e = entry;
+ return (hashval_t) (e->sec_id);
+}
+
+static int
+align_sec_sym_eq (const void *entry1, const void *entry2)
+{
+ const align_sec_sym *e1 = entry1, *e2 = entry2;
+ return e1->sec_id == e2->sec_id;
+}
+
+/* Make align symbol be in same section with alignment directive.
+ If the symbol is only created at the first time to handle alignment
+ directive. This means that all other sections may use this symbol.
+ If the section of this symbol is discarded, there may be problems. */
+
+static symbolS *get_align_symbol (segT sec)
+{
+ align_sec_sym search = { sec->id, NULL };
+ align_sec_sym *pentry = htab_find (align_hash, &search);
+ if (pentry)
+ return pentry->s;
+
+ /* If we not find the symbol in this section. Create and insert it. */
+ symbolS *s = (symbolS *)local_symbol_make (".Lla-relax-align", sec,
+ &zero_address_frag, 0);
+ align_sec_sym entry = { sec->id, s };
+ align_sec_sym **slot = (align_sec_sym **) htab_find_slot (align_hash,
+ &entry, INSERT);
+ if (slot == NULL)
+ return NULL;
+ *slot = (align_sec_sym *) xmalloc (sizeof (align_sec_sym));
+ if (*slot == NULL)
+ return NULL;
+ **slot = entry;
+ return entry.s;
+}
+
void
md_begin ()
{
@@ -440,11 +489,21 @@ md_begin ()
it->name, it->format, it->macro);
}
+ align_hash = htab_create (10, align_sec_sym_hash, align_sec_sym_eq, free);
+
/* FIXME: expressionS use 'offsetT' as constant,
* we want this is 64-bit type. */
assert (8 <= sizeof (offsetT));
}
+/* Called just before the assembler exits. */
+
+void
+loongarch_md_end (void)
+{
+ htab_delete (align_hash);
+}
+
unsigned long
loongarch_mach (void)
{
@@ -1826,7 +1885,9 @@ loongarch_frag_align_code (int n, int max)
if (fragP->fr_subtype != 0 && offset > fragP->fr_subtype). */
if (align_max)
{
- s = symbol_find (now_seg->name);
+ s = get_align_symbol (now_seg);
+ if (!s)
+ as_fatal (_("internal error: cannot get align symbol"));
addend = ALIGN_MAX_ADDEND (n, max);
}
diff --git a/gas/config/tc-loongarch.h b/gas/config/tc-loongarch.h
index f53e358..20434ac 100644
--- a/gas/config/tc-loongarch.h
+++ b/gas/config/tc-loongarch.h
@@ -32,6 +32,9 @@ extern unsigned long loongarch_mach (void);
#define WORKING_DOT_WORD 1
#define REPEAT_CONS_EXPRESSIONS
+#define md_end loongarch_md_end
+extern void loongarch_md_end (void);
+
/* Early than md_begin. */
#define md_after_parse_args loongarch_after_parse_args
extern void loongarch_after_parse_args (void);
diff --git a/gas/testsuite/gas/loongarch/relax-align2.d b/gas/testsuite/gas/loongarch/relax-align2.d
new file mode 100644
index 0000000..cbef84f
--- /dev/null
+++ b/gas/testsuite/gas/loongarch/relax-align2.d
@@ -0,0 +1,24 @@
+#as: --no-warn
+#readelf: -rsW
+#skip: loongarch32-*-*
+
+Relocation section '\.rela\.text' at offset .* contains 2 entries:
+.*
+0+04[ ]+0000000000000066[ ]+R_LARCH_ALIGN[ ]+c
+0+14[ ]+0000000500000066[ ]+R_LARCH_ALIGN[ ]+0+[ ]+\.Lla-relax-align \+ 404
+
+Relocation section '\.rela\.text2' at offset .* contains 2 entries:
+.*
+0+04[ ]+0000000000000066[ ]+R_LARCH_ALIGN[ ]+c
+0+14[ ]+0000000600000066[ ]+R_LARCH_ALIGN[ ]+0+[ ]+\.Lla-relax-align \+ 404
+
+Symbol table '\.symtab' contains .* entries:
+#...
+[ ]+.*:[ ]+0+[ ]+0[ ]+SECTION[ ]+LOCAL[ ]+DEFAULT[ ]+1[ ]+\.text
+#...
+[ ]+.*:[ ]+0+[ ]+0[ ]+SECTION[ ]+LOCAL[ ]+DEFAULT[ ]+5[ ]+\.text2
+#...
+[ ]+.*:[ ]+0+[ ]+0[ ]+NOTYPE[ ]+LOCAL[ ]+DEFAULT[ ]+1[ ]+\.Lla-relax-align
+#...
+[ ]+.*:[ ]+0+[ ]+0[ ]+NOTYPE[ ]+LOCAL[ ]+DEFAULT[ ]+5[ ]+\.Lla-relax-align
+#pass
diff --git a/gas/testsuite/gas/loongarch/relax-align2.s b/gas/testsuite/gas/loongarch/relax-align2.s
new file mode 100644
index 0000000..6cd6bd8
--- /dev/null
+++ b/gas/testsuite/gas/loongarch/relax-align2.s
@@ -0,0 +1,11 @@
+.section ".text", "ax"
+nop
+.align 4
+nop
+.align 4, , 4
+
+.section ".text2", "ax"
+nop
+.align 4
+nop
+.align 4, , 4
diff --git a/gas/testsuite/gas/loongarch/relax_align.d b/gas/testsuite/gas/loongarch/relax_align.d
index acd215a..fc1fd03 100644
--- a/gas/testsuite/gas/loongarch/relax_align.d
+++ b/gas/testsuite/gas/loongarch/relax_align.d
@@ -7,7 +7,7 @@
Disassembly of section .text:
-[ ]*0000000000000000 <.text>:
+[ ]*0000000000000000 <.Lla-relax-align>:
[ ]+0:[ ]+4c000020[ ]+ret
[ ]+4:[ ]+03400000[ ]+nop
[ ]+4: R_LARCH_ALIGN[ ]+\*ABS\*\+0xc
@@ -20,12 +20,12 @@ Disassembly of section .text:
[ ]+1c:[ ]+03400000[ ]+nop
[ ]+20:[ ]+4c000020[ ]+ret
[ ]+24:[ ]+03400000[ ]+nop
-[ ]+24: R_LARCH_ALIGN[ ]+.text\+0x104
+[ ]+24: R_LARCH_ALIGN[ ]+.Lla-relax-align\+0x104
[ ]+28:[ ]+03400000[ ]+nop
[ ]+2c:[ ]+03400000[ ]+nop
[ ]+30:[ ]+4c000020[ ]+ret
[ ]+34:[ ]+03400000[ ]+nop
-[ ]+34: R_LARCH_ALIGN[ ]+.text\+0xb04
+[ ]+34: R_LARCH_ALIGN[ ]+.Lla-relax-align\+0xb04
[ ]+38:[ ]+03400000[ ]+nop
[ ]+3c:[ ]+03400000[ ]+nop
[ ]+40:[ ]+4c000020[ ]+ret