diff options
author | mengqinggang <mengqinggang@loongson.cn> | 2023-12-08 15:15:50 +0800 |
---|---|---|
committer | liuzhensong <liuzhensong@loongson.cn> | 2023-12-22 14:20:18 +0800 |
commit | c3d507aba3ec2c9b3f9aa105a01cf80ecc0b8c9b (patch) | |
tree | 46b9a5155634c7e2122319f6adeba51d6ded0c03 /gas | |
parent | 866a2ad35b75cbc60260c00b82bec2243877355f (diff) | |
download | gdb-c3d507aba3ec2c9b3f9aa105a01cf80ecc0b8c9b.zip gdb-c3d507aba3ec2c9b3f9aa105a01cf80ecc0b8c9b.tar.gz gdb-c3d507aba3ec2c9b3f9aa105a01cf80ecc0b8c9b.tar.bz2 |
LoongArch: Add support for the third expression of .align for R_LARCH_ALIGN
If the symbol index is not zero, the addend is used to represent
the first and the third expressions of the .align.
The lowest 8 bits are used to represent the first expression.
Other bits are used to represent the third expression.
The addend of R_LARCH_ALIGN for ".align 5, ,4" is 0x405.
The addend of R_LARCH_ALIGN for ".balign 32, ,4" is 0x405.
Diffstat (limited to 'gas')
-rw-r--r-- | gas/config/tc-loongarch.c | 20 | ||||
-rw-r--r-- | gas/config/tc-loongarch.h | 4 | ||||
-rw-r--r-- | gas/testsuite/gas/loongarch/relax_align.d | 46 | ||||
-rw-r--r-- | gas/testsuite/gas/loongarch/relax_align.s | 4 |
4 files changed, 47 insertions, 27 deletions
diff --git a/gas/config/tc-loongarch.c b/gas/config/tc-loongarch.c index 367a0b6..9b912da 100644 --- a/gas/config/tc-loongarch.c +++ b/gas/config/tc-loongarch.c @@ -1652,14 +1652,16 @@ loongarch_make_nops (char *buf, bfd_vma bytes) the correct alignment now because of other linker relaxations. */ bool -loongarch_frag_align_code (int n) +loongarch_frag_align_code (int n, int max) { - bfd_vma bytes = (bfd_vma) 1 << n; - bfd_vma insn_alignment = 4; - bfd_vma worst_case_bytes = bytes - insn_alignment; char *nops; + symbolS *s; expressionS ex; + bfd_vma insn_alignment = 4; + bfd_vma bytes = (bfd_vma) 1 << n; + bfd_vma worst_case_bytes = bytes - insn_alignment; + /* If we are moving to a smaller alignment than the instruction size, then no alignment is required. */ if (bytes <= insn_alignment) @@ -1671,8 +1673,14 @@ loongarch_frag_align_code (int n) nops = frag_more (worst_case_bytes); - ex.X_op = O_constant; - ex.X_add_number = worst_case_bytes; + s = symbol_find (".Lla-relax-align"); + if (s == NULL) + s = (symbolS *)local_symbol_make (".Lla-relax-align", now_seg, + &zero_address_frag, 0); + + ex.X_add_symbol = s; + ex.X_op = O_symbol; + ex.X_add_number = (max << 8) | n; loongarch_make_nops (nops, worst_case_bytes); diff --git a/gas/config/tc-loongarch.h b/gas/config/tc-loongarch.h index 4afa384..194ee10 100644 --- a/gas/config/tc-loongarch.h +++ b/gas/config/tc-loongarch.h @@ -49,11 +49,11 @@ extern int loongarch_relax_frag (asection *, struct frag *, long); #define md_undefined_symbol(name) (0) #define md_operand(x) -extern bool loongarch_frag_align_code (int); +extern bool loongarch_frag_align_code (int, int); #define md_do_align(N, FILL, LEN, MAX, LABEL) \ if ((N) != 0 && !(FILL) && !need_pass_2 && subseg_text_p (now_seg)) \ { \ - if (loongarch_frag_align_code (N)) \ + if (loongarch_frag_align_code (N, MAX)) \ goto LABEL; \ } diff --git a/gas/testsuite/gas/loongarch/relax_align.d b/gas/testsuite/gas/loongarch/relax_align.d index 1810eb4..2cc6c86 100644 --- a/gas/testsuite/gas/loongarch/relax_align.d +++ b/gas/testsuite/gas/loongarch/relax_align.d @@ -1,4 +1,4 @@ -#as: +#as: --no-warn #objdump: -dr #skip: loongarch32-*-* @@ -7,20 +7,30 @@ Disassembly of section .text: -00000000.* <L1>: -[ ]+0:[ ]+1a000004[ ]+pcalau12i[ ]+\$a0,[ ]+0 -[ ]+0:[ ]+R_LARCH_PCALA_HI20[ ]+L1 -[ ]+0:[ ]+R_LARCH_RELAX[ ]+\*ABS\* -[ ]+4:[ ]+02c00084[ ]+addi\.d[ ]+\$a0,[ ]+\$a0,[ ]+0 -[ ]+4:[ ]+R_LARCH_PCALA_LO12[ ]+L1 -[ ]+4:[ ]+R_LARCH_RELAX[ ]+\*ABS\* -[ ]+8:[ ]+03400000[ ]+nop[ ]+ -[ ]+8:[ ]+R_LARCH_ALIGN[ ]+\*ABS\*\+0xc -[ ]+c:[ ]+03400000[ ]+nop[ ]+ -[ ]+10:[ ]+03400000[ ]+nop[ ]+ -[ ]+14:[ ]+1a000004[ ]+pcalau12i[ ]+\$a0,[ ]+0 -[ ]+14:[ ]+R_LARCH_PCALA_HI20[ ]+L1 -[ ]+14:[ ]+R_LARCH_RELAX[ ]+\*ABS\* -[ ]+18:[ ]+02c00084[ ]+addi\.d[ ]+\$a0,[ ]+\$a0,[ ]+0 -[ ]+18:[ ]+R_LARCH_PCALA_LO12[ ]+L1 -[ ]+18:[ ]+R_LARCH_RELAX[ ]+\*ABS\* +[ ]*0000000000000000 <.Lla-relax-align>: +[ ]+0:[ ]+1a000004[ ]+pcalau12i[ ]+\$a0, 0 +[ ]+0: R_LARCH_PCALA_HI20[ ]+L1 +[ ]+0: R_LARCH_RELAX[ ]+\*ABS\* +[ ]+4:[ ]+02c00084[ ]+addi.d[ ]+\$a0, \$a0, 0 +[ ]+4: R_LARCH_PCALA_LO12[ ]+L1 +[ ]+4: R_LARCH_RELAX[ ]+\*ABS\* +[ ]+8:[ ]+03400000[ ]+nop.* +[ ]+8: R_LARCH_ALIGN[ ]+.Lla-relax-align\+0x4 +[ ]+c:[ ]+03400000[ ]+nop.* +[ ]+10:[ ]+03400000[ ]+nop.* +[ ]+14:[ ]+1a000004[ ]+pcalau12i[ ]+\$a0, 0 +[ ]+14: R_LARCH_PCALA_HI20[ ]+L1 +[ ]+14: R_LARCH_RELAX[ ]+\*ABS\* +[ ]+18:[ ]+02c00084[ ]+addi.d[ ]+\$a0, \$a0, 0 +[ ]+18: R_LARCH_PCALA_LO12[ ]+L1 +[ ]+18: R_LARCH_RELAX[ ]+\*ABS\* +[ ]+1c:[ ]+03400000[ ]+nop.* +[ ]+1c: R_LARCH_ALIGN[ ]+.Lla-relax-align\+0x404 +[ ]+20:[ ]+03400000[ ]+nop.* +[ ]+24:[ ]+03400000[ ]+nop.* +[ ]+28:[ ]+1a000004[ ]+pcalau12i[ ]+\$a0, 0 +[ ]+28: R_LARCH_PCALA_HI20[ ]+L1 +[ ]+28: R_LARCH_RELAX[ ]+\*ABS\* +[ ]+2c:[ ]+02c00084[ ]+addi.d[ ]+\$a0, \$a0, 0 +[ ]+2c: R_LARCH_PCALA_LO12[ ]+L1 +[ ]+2c: R_LARCH_RELAX[ ]+\*ABS\* diff --git a/gas/testsuite/gas/loongarch/relax_align.s b/gas/testsuite/gas/loongarch/relax_align.s index 3880d78..c0177c8 100644 --- a/gas/testsuite/gas/loongarch/relax_align.s +++ b/gas/testsuite/gas/loongarch/relax_align.s @@ -1,5 +1,7 @@ .text -L1: +.L1: la.local $a0, L1 .align 4 la.local $a0, L1 + .align 4, , 4 + la.local $a0, L1 |