[llvm] [LoongArch] Insert nops and emit align reloc when handle alignment directive (PR #72962)

Lu Weining via llvm-commits llvm-commits at lists.llvm.org
Tue Jan 16 05:04:36 PST 2024


================
@@ -0,0 +1,53 @@
+# RUN: llvm-mc --filetype=obj --triple=loongarch64 --mattr=-relax %s \
+# RUN:     | llvm-readelf -rs - | FileCheck %s --check-prefix=NORELAX
+# RUN: llvm-mc --filetype=obj --triple=loongarch64 --mattr=+relax %s \
+# RUN:     | llvm-readelf -rs - | FileCheck %s --check-prefix=RELAX
+# RUN: llvm-mc --filetype=obj --triple=loongarch64 --mattr=+relax %s \
+# RUN:     | llvm-objdump -d - | FileCheck -check-prefix=RELAX-INST %s
+
+# NORELAX: There are no relocations in this file.
+# NORELAX: Symbol table '.symtab' contains 1 entries:
+
+# RELAX:       0000000000000000  0000000100000066 R_LARCH_ALIGN          0000000000000000 {{.*}} + 4
+# RELAX-NEXT:  0000000000000010  0000000100000066 R_LARCH_ALIGN          0000000000000000 {{.*}} + 5
+# RELAX-NEXT:  000000000000002c  0000000100000066 R_LARCH_ALIGN          0000000000000000 {{.*}} + 4
+# RELAX-NEXT:  000000000000003c  0000000100000066 R_LARCH_ALIGN          0000000000000000 {{.*}} + b04
+# RELAX-NEXT:  0000000000000048  0000000100000066 R_LARCH_ALIGN          0000000000000000 {{.*}} + 4
+# RELAX-EMPTY:
+# RELAX:       0000000000000000  0000000200000066 R_LARCH_ALIGN          0000000000000000 <null> + 4
+# RELAX-EMPTY:
+# RELAX:       Symbol table '.symtab' contains 3 entries:
+# RELAX:       0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT   UND
+# RELAX-NEXT:  1: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT     2
+# RELAX-NEXT:  2: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT     4
+
+.text
+.p2align 4        # A = 0x0
+nop
+.p2align 5        # B = A + 3 * NOP + NOP = 0x10
+.p2align 4        # C = B + 7 * NOP = 0x2C
+nop
+.p2align 4, , 11  # D = C + 3 * NOP + NOP = 0x3C
+## Not emit the third parameter.
+.p2align 4, , 12  # E = D + 3 * NOP = 0x48
+                  # END = E + 3 * NOP = 0x54 = 21 * NOP
+
+## Not emit R_LARCH_ALIGN if code alignment great than alignment directive.
+.p2align 2
+.p2align 1
+.p2align 0
+## Not emit instructions if max emit bytes less than min nop size.
+.p2align 4, , 2
+## Not emit R_LARCH_ALIGN if alignment directive with specific padding value.
+.p2align 4, 1
+nop
+.p2align 4, 1, 12
+
+# RELAX-INST:           <.text>:
+# RELAX-INST-COUNT-21:    nop
+# RELAX-INST-COUNT-3:     01 01 01 01
+# RELAX-INST-NEXT:        nop
+# RELAX-INST-COUNT-3:     01 01 01 01
+
+.section .text2, "ax"
+.p2align 4
----------------
SixWeining wrote:

Why the last directive also take effect while not when relax is off. But this match RISCV and GAS.

But we can add an extra instruction at the end of line.

https://github.com/llvm/llvm-project/pull/72962


More information about the llvm-commits mailing list