[lld] [llvm] [RISCV] Fix alignment when mixing rvc/norvc relax/norelax code (PR #150159)

Kito Cheng via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 31 07:41:35 PDT 2025


https://github.com/kito-cheng updated https://github.com/llvm/llvm-project/pull/150159

>From e152b303e0ffaaf1fe9e07cd7bb4ddefc83ff8e6 Mon Sep 17 00:00:00 2001
From: Kito Cheng <kito.cheng at sifive.com>
Date: Wed, 23 Jul 2025 10:20:44 +0800
Subject: [PATCH 1/2] [RISCV] Fix alignment when mixing rvc/norvc relax/norelax
 code

The issue we want to show is the alignment problem when mixing RVC and non-RVC
code, especially when the RVC code is relaxed and the alignment with in the
non-RVC region will not got expected alignment requirement.

Give an example, this example will build with `rv64gc` and `-mrelax` option,
and assume text section is start from `0x1000`:

```
_start:
        lui a0, %hi(foo)
        addi a0, a0, %lo(foo)
        mul a0, a1, a4
        .option push

        .option norelax
        .option norvc
        .balign 8
SHOULD_ALIGN_8_HERE:
        .word 0x12345678
```

Then when we assemble this file, assembler will insert NOP and
`R_RISCV_RELAX`/`R_RISCV_ALIGN` like below:
```
Disassembly of section .text:

0000000000000000 <_start-0x2>:
   0:   0001                    nop
                        0: R_RISCV_ALIGN        *ABS*+0x2

0000000000000002 <_start>:
   2:   00000537                lui     a0,0x0
                        2: R_RISCV_HI20 foo
                        2: R_RISCV_RELAX        *ABS*
   6:   00050513                mv      a0,a0
                        6: R_RISCV_LO12_I       foo
                        6: R_RISCV_RELAX        *ABS*
   a:   8082                    ret
   c:   00000013                nop

0000000000000010 <SHOULD_ALIGN_8_HERE>:
  10:   12345678                .word   0x12345678
```

And we didn't insert `R_RISCV_ALIGN` before `SHOULD_ALIGN_8_HERE`, because
`norelax` option are given and the alignment seems already meet.

However...the linker relaxation will remove first NOP in the text section
before the `_start` symbol for meet the alignment requirement, then
`SHOULD_ALIGN_8_HERE` no longer aligned to 8 bytes.

So this should be fixed in the MC assembler by inserting `R_RISCV_ALIGN`
correctly before `SHOULD_ALIGN_8_HERE`, even if the norelax option is given,
but that not means we should always inserting that, we just need insert when
relax has ever enabled on that section.

Also it should emit N-2 bytes NOPs even norvc status if this section has enable
RVC ever, so that linker has enough NOPs to remove for meet the alignment
requirement.

This is not really lld bug, but this must be put within lld testcases so that we
can verify the alignment result is wrong after linking.

Not all testcase are fail with out this fix, however some of them may fail on
binutils side, so I think it worth to put all testcase to lld test to prevent
future regression.
---
 lld/test/ELF/riscv-relax-align-1.s            | 69 ++++++++++++++++++
 lld/test/ELF/riscv-relax-align-10.s           | 69 ++++++++++++++++++
 lld/test/ELF/riscv-relax-align-11.s           | 70 +++++++++++++++++++
 lld/test/ELF/riscv-relax-align-12.s           | 69 ++++++++++++++++++
 lld/test/ELF/riscv-relax-align-2.s            | 68 ++++++++++++++++++
 lld/test/ELF/riscv-relax-align-3.s            | 69 ++++++++++++++++++
 lld/test/ELF/riscv-relax-align-4.s            | 68 ++++++++++++++++++
 lld/test/ELF/riscv-relax-align-5.s            | 69 ++++++++++++++++++
 lld/test/ELF/riscv-relax-align-6.s            | 68 ++++++++++++++++++
 lld/test/ELF/riscv-relax-align-7.s            | 70 +++++++++++++++++++
 lld/test/ELF/riscv-relax-align-8.s            | 69 ++++++++++++++++++
 lld/test/ELF/riscv-relax-align-9.s            | 70 +++++++++++++++++++
 .../Target/RISCV/AsmParser/RISCVAsmParser.cpp | 23 ++++++
 .../RISCV/MCTargetDesc/RISCVAsmBackend.cpp    |  7 +-
 .../RISCV/MCTargetDesc/RISCVAsmBackend.h      | 14 ++++
 15 files changed, 870 insertions(+), 2 deletions(-)
 create mode 100644 lld/test/ELF/riscv-relax-align-1.s
 create mode 100644 lld/test/ELF/riscv-relax-align-10.s
 create mode 100644 lld/test/ELF/riscv-relax-align-11.s
 create mode 100644 lld/test/ELF/riscv-relax-align-12.s
 create mode 100644 lld/test/ELF/riscv-relax-align-2.s
 create mode 100644 lld/test/ELF/riscv-relax-align-3.s
 create mode 100644 lld/test/ELF/riscv-relax-align-4.s
 create mode 100644 lld/test/ELF/riscv-relax-align-5.s
 create mode 100644 lld/test/ELF/riscv-relax-align-6.s
 create mode 100644 lld/test/ELF/riscv-relax-align-7.s
 create mode 100644 lld/test/ELF/riscv-relax-align-8.s
 create mode 100644 lld/test/ELF/riscv-relax-align-9.s

diff --git a/lld/test/ELF/riscv-relax-align-1.s b/lld/test/ELF/riscv-relax-align-1.s
new file mode 100644
index 0000000000000..c7ab4b03539eb
--- /dev/null
+++ b/lld/test/ELF/riscv-relax-align-1.s
@@ -0,0 +1,69 @@
+# REQUIRES: riscv
+## Testing the aligment is correct when mixing with rvc/norvc relax/norelax
+
+# RUN: rm -rf %t && split-file %s %t && cd %t
+
+## NORVC, NORELAX
+# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORVC=1 --defsym=NORELAX=1
+# RUN: ld.lld -T lds a.o -o a.out
+# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORVC-NORELAX
+
+# NORVC-NORELAX: 0000000000001010 t SHOULD_ALIGN_8_HERE
+
+## NORVC, RELAX
+# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORVC=1
+# RUN: ld.lld -T lds a.o -o a.out
+# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORVC
+
+# NORVC: 0000000000001010 t SHOULD_ALIGN_8_HERE
+
+## RVC, NORELAX
+# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORELAX=1
+# RUN: ld.lld -T lds a.o -o a.out
+# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORELAX
+
+# NORELAX: 0000000000001010 t SHOULD_ALIGN_8_HERE
+
+## RVC, RELAX
+# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o
+# RUN: ld.lld -T lds a.o -o a.out
+# RUN: llvm-nm a.out | FileCheck %s --check-prefix=RELAX-RVC
+
+# RELAX-RVC: 0000000000001010 t SHOULD_ALIGN_8_HERE
+
+#--- a.s
+        .text
+        .option relax
+        .balign 4
+        .global _start
+        .type _start, @function
+_start:
+        lui a0, %hi(foo)
+        addi a0, a0, %lo(foo)
+	mul a0, a1, a4
+        .option push
+
+.ifdef NORELAX
+        .option norelax
+.endif
+.ifdef NORVC
+        .option norvc
+.endif
+        .balign 8
+SHOULD_ALIGN_8_HERE:
+        .word 0x12345678
+
+        .option pop
+
+foo:
+        ret
+
+
+
+#--- lds
+ENTRY(_start)
+SECTIONS {
+	.text 0x0001000 : {
+		*(.text*)
+	}
+}
diff --git a/lld/test/ELF/riscv-relax-align-10.s b/lld/test/ELF/riscv-relax-align-10.s
new file mode 100644
index 0000000000000..dc816f0b03b77
--- /dev/null
+++ b/lld/test/ELF/riscv-relax-align-10.s
@@ -0,0 +1,69 @@
+# REQUIRES: riscv
+## Testing the aligment is correct when mixing with rvc/norvc relax/norelax
+
+# RUN: rm -rf %t && split-file %s %t && cd %t
+
+## NORVC, NORELAX
+# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORVC=1 --defsym=NORELAX=1
+# RUN: ld.lld -T lds a.o -o a.out
+# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORVC-NORELAX
+
+# NORVC-NORELAX: 0000000000001010 t SHOULD_ALIGN_16_HERE
+
+## NORVC, RELAX
+# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORVC=1
+# RUN: ld.lld -T lds a.o -o a.out
+# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORVC
+
+# NORVC: 0000000000001010 t SHOULD_ALIGN_16_HERE
+
+## RVC, NORELAX
+# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORELAX=1
+# RUN: ld.lld -T lds a.o -o a.out
+# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORELAX
+
+# NORELAX: 0000000000001010 t SHOULD_ALIGN_16_HERE
+
+## RVC, RELAX
+# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o
+# RUN: ld.lld -T lds a.o -o a.out
+# RUN: llvm-nm a.out | FileCheck %s --check-prefix=RELAX-RVC
+
+# RELAX-RVC: 0000000000001010 t SHOULD_ALIGN_16_HERE
+
+#--- a.s
+        .text
+        .option relax
+        .balign 2
+        .global _start
+        .type _start, @function
+_start:
+	call foo
+        .option norvc
+	mul a0, a1, a4
+        .option push
+
+.ifdef NORELAX
+        .option norelax
+.endif
+.ifdef NORVC
+        .option norvc
+.endif
+        .balign 16
+SHOULD_ALIGN_16_HERE:
+        .word 0x12345678
+
+        .option pop
+
+foo:
+        ret
+
+
+
+#--- lds
+ENTRY(_start)
+SECTIONS {
+	.text 0x0001000 : {
+		*(.text*)
+	}
+}
diff --git a/lld/test/ELF/riscv-relax-align-11.s b/lld/test/ELF/riscv-relax-align-11.s
new file mode 100644
index 0000000000000..456ecf1e04456
--- /dev/null
+++ b/lld/test/ELF/riscv-relax-align-11.s
@@ -0,0 +1,70 @@
+# REQUIRES: riscv
+## Testing the aligment is correct when mixing with rvc/norvc relax/norelax
+
+# RUN: rm -rf %t && split-file %s %t && cd %t
+
+## NORVC, NORELAX
+# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORVC=1 --defsym=NORELAX=1
+# RUN: ld.lld -T lds a.o -o a.out
+# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORVC-NORELAX
+
+# NORVC-NORELAX: 0000000000001010 t SHOULD_ALIGN_16_HERE
+
+## NORVC, RELAX
+# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORVC=1
+# RUN: ld.lld -T lds a.o -o a.out
+# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORVC
+
+# NORVC: 0000000000001010 t SHOULD_ALIGN_16_HERE
+
+## RVC, NORELAX
+# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORELAX=1
+# RUN: ld.lld -T lds a.o -o a.out
+# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORELAX
+
+# NORELAX: 0000000000001010 t SHOULD_ALIGN_16_HERE
+
+## RVC, RELAX
+# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o
+# RUN: ld.lld -T lds a.o -o a.out
+# RUN: llvm-nm a.out | FileCheck %s --check-prefix=RELAX-RVC
+
+# RELAX-RVC: 0000000000001010 t SHOULD_ALIGN_16_HERE
+
+#--- a.s
+        .text
+        .option relax
+        .balign 2
+        .global _start
+        .type _start, @function
+_start:
+        lui a0, %hi(foo)
+        addi a0, a0, %lo(foo)
+        .option norvc
+	mul a0, a1, a4
+        .option push
+
+.ifdef NORELAX
+        .option norelax
+.endif
+.ifdef NORVC
+        .option norvc
+.endif
+        .balign 16
+SHOULD_ALIGN_16_HERE:
+	ret
+
+        .option pop
+
+foo:
+        ret
+
+
+
+#--- lds
+ENTRY(_start)
+SECTIONS {
+	.text 0x0001000 : {
+		*(.text*)
+	}
+}
diff --git a/lld/test/ELF/riscv-relax-align-12.s b/lld/test/ELF/riscv-relax-align-12.s
new file mode 100644
index 0000000000000..b9e48d3323db5
--- /dev/null
+++ b/lld/test/ELF/riscv-relax-align-12.s
@@ -0,0 +1,69 @@
+# REQUIRES: riscv
+## Testing the aligment is correct when mixing with rvc/norvc relax/norelax
+
+# RUN: rm -rf %t && split-file %s %t && cd %t
+
+## NORVC, NORELAX
+# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORVC=1 --defsym=NORELAX=1
+# RUN: ld.lld -T lds a.o -o a.out
+# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORVC-NORELAX
+
+# NORVC-NORELAX: 0000000000001010 t SHOULD_ALIGN_16_HERE
+
+## NORVC, RELAX
+# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORVC=1
+# RUN: ld.lld -T lds a.o -o a.out
+# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORVC
+
+# NORVC: 0000000000001010 t SHOULD_ALIGN_16_HERE
+
+## RVC, NORELAX
+# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORELAX=1
+# RUN: ld.lld -T lds a.o -o a.out
+# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORELAX
+
+# NORELAX: 0000000000001010 t SHOULD_ALIGN_16_HERE
+
+## RVC, RELAX
+# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o
+# RUN: ld.lld -T lds a.o -o a.out
+# RUN: llvm-nm a.out | FileCheck %s --check-prefix=RELAX-RVC
+
+# RELAX-RVC: 0000000000001010 t SHOULD_ALIGN_16_HERE
+
+#--- a.s
+        .text
+        .option relax
+        .balign 2
+        .global _start
+        .type _start, @function
+_start:
+	call foo
+        .option norvc
+	mul a0, a1, a4
+        .option push
+
+.ifdef NORELAX
+        .option norelax
+.endif
+.ifdef NORVC
+        .option norvc
+.endif
+        .balign 16
+SHOULD_ALIGN_16_HERE:
+	ret
+
+        .option pop
+
+foo:
+        ret
+
+
+
+#--- lds
+ENTRY(_start)
+SECTIONS {
+	.text 0x0001000 : {
+		*(.text*)
+	}
+}
diff --git a/lld/test/ELF/riscv-relax-align-2.s b/lld/test/ELF/riscv-relax-align-2.s
new file mode 100644
index 0000000000000..401f6e338845b
--- /dev/null
+++ b/lld/test/ELF/riscv-relax-align-2.s
@@ -0,0 +1,68 @@
+# REQUIRES: riscv
+## Testing the aligment is correct when mixing with rvc/norvc relax/norelax
+
+# RUN: rm -rf %t && split-file %s %t && cd %t
+
+## NORVC, NORELAX
+# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORVC=1 --defsym=NORELAX=1
+# RUN: ld.lld -T lds a.o -o a.out
+# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORVC-NORELAX
+
+# NORVC-NORELAX: 0000000000001008 t SHOULD_ALIGN_8_HERE
+
+## NORVC, RELAX
+# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORVC=1
+# RUN: ld.lld -T lds a.o -o a.out
+# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORVC
+
+# NORVC: 0000000000001008 t SHOULD_ALIGN_8_HERE
+
+## RVC, NORELAX
+# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORELAX=1
+# RUN: ld.lld -T lds a.o -o a.out
+# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORELAX
+
+# NORELAX: 0000000000001008 t SHOULD_ALIGN_8_HERE
+
+## RVC, RELAX
+# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o
+# RUN: ld.lld -T lds a.o -o a.out
+# RUN: llvm-nm a.out | FileCheck %s --check-prefix=RELAX-RVC
+
+# RELAX-RVC: 0000000000001008 t SHOULD_ALIGN_8_HERE
+
+#--- a.s
+        .text
+        .option relax
+        .balign 4
+        .global _start
+        .type _start, @function
+_start:
+	call foo
+	mul a0, a1, a4
+        .option push
+
+.ifdef NORELAX
+        .option norelax
+.endif
+.ifdef NORVC
+        .option norvc
+.endif
+        .balign 8
+SHOULD_ALIGN_8_HERE:
+        .word 0x12345678
+
+        .option pop
+
+foo:
+        ret
+
+
+
+#--- lds
+ENTRY(_start)
+SECTIONS {
+	.text 0x0001000 : {
+		*(.text*)
+	}
+}
diff --git a/lld/test/ELF/riscv-relax-align-3.s b/lld/test/ELF/riscv-relax-align-3.s
new file mode 100644
index 0000000000000..1f4ebeef095f3
--- /dev/null
+++ b/lld/test/ELF/riscv-relax-align-3.s
@@ -0,0 +1,69 @@
+# REQUIRES: riscv
+## Testing the aligment is correct when mixing with rvc/norvc relax/norelax
+
+# RUN: rm -rf %t && split-file %s %t && cd %t
+
+## NORVC, NORELAX
+# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORVC=1 --defsym=NORELAX=1
+# RUN: ld.lld -T lds a.o -o a.out
+# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORVC-NORELAX
+
+# NORVC-NORELAX: 000000000000100c t SHOULD_ALIGN_4_HERE
+
+## NORVC, RELAX
+# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORVC=1
+# RUN: ld.lld -T lds a.o -o a.out
+# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORVC
+
+# NORVC: 000000000000100c t SHOULD_ALIGN_4_HERE
+
+## RVC, NORELAX
+# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORELAX=1
+# RUN: ld.lld -T lds a.o -o a.out
+# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORELAX
+
+# NORELAX: 000000000000100c t SHOULD_ALIGN_4_HERE
+
+## RVC, RELAX
+# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o
+# RUN: ld.lld -T lds a.o -o a.out
+# RUN: llvm-nm a.out | FileCheck %s --check-prefix=RELAX-RVC
+
+# RELAX-RVC: 000000000000100c t SHOULD_ALIGN_4_HERE
+
+#--- a.s
+        .text
+        .option relax
+        .balign 2
+        .global _start
+        .type _start, @function
+_start:
+        lui a0, %hi(foo)
+        addi a0, a0, %lo(foo)
+	mul a0, a1, a4
+        .option push
+
+.ifdef NORELAX
+        .option norelax
+.endif
+.ifdef NORVC
+        .option norvc
+.endif
+        .balign 4
+SHOULD_ALIGN_4_HERE:
+        .word 0x12345678
+
+        .option pop
+
+foo:
+        ret
+
+
+
+#--- lds
+ENTRY(_start)
+SECTIONS {
+	.text 0x0001000 : {
+		*(.text*)
+	}
+}
diff --git a/lld/test/ELF/riscv-relax-align-4.s b/lld/test/ELF/riscv-relax-align-4.s
new file mode 100644
index 0000000000000..2db50fa264f28
--- /dev/null
+++ b/lld/test/ELF/riscv-relax-align-4.s
@@ -0,0 +1,68 @@
+# REQUIRES: riscv
+## Testing the aligment is correct when mixing with rvc/norvc relax/norelax
+
+# RUN: rm -rf %t && split-file %s %t && cd %t
+
+## NORVC, NORELAX
+# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORVC=1 --defsym=NORELAX=1
+# RUN: ld.lld -T lds a.o -o a.out
+# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORVC-NORELAX
+
+# NORVC-NORELAX: 0000000000001008 t SHOULD_ALIGN_4_HERE
+
+## NORVC, RELAX
+# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORVC=1
+# RUN: ld.lld -T lds a.o -o a.out
+# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORVC
+
+# NORVC: 0000000000001008 t SHOULD_ALIGN_4_HERE
+
+## RVC, NORELAX
+# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORELAX=1
+# RUN: ld.lld -T lds a.o -o a.out
+# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORELAX
+
+# NORELAX: 0000000000001008 t SHOULD_ALIGN_4_HERE
+
+## RVC, RELAX
+# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o
+# RUN: ld.lld -T lds a.o -o a.out
+# RUN: llvm-nm a.out | FileCheck %s --check-prefix=RELAX-RVC
+
+# RELAX-RVC: 0000000000001008 t SHOULD_ALIGN_4_HERE
+
+#--- a.s
+        .text
+        .option relax
+        .balign 2
+        .global _start
+        .type _start, @function
+_start:
+	call foo
+	mul a0, a1, a4
+        .option push
+
+.ifdef NORELAX
+        .option norelax
+.endif
+.ifdef NORVC
+        .option norvc
+.endif
+        .balign 4
+SHOULD_ALIGN_4_HERE:
+        .word 0x12345678
+
+        .option pop
+
+foo:
+        ret
+
+
+
+#--- lds
+ENTRY(_start)
+SECTIONS {
+	.text 0x0001000 : {
+		*(.text*)
+	}
+}
diff --git a/lld/test/ELF/riscv-relax-align-5.s b/lld/test/ELF/riscv-relax-align-5.s
new file mode 100644
index 0000000000000..b3474811c1554
--- /dev/null
+++ b/lld/test/ELF/riscv-relax-align-5.s
@@ -0,0 +1,69 @@
+# REQUIRES: riscv
+## Testing the aligment is correct when mixing with rvc/norvc relax/norelax
+
+# RUN: rm -rf %t && split-file %s %t && cd %t
+
+## NORVC, NORELAX
+# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORVC=1 --defsym=NORELAX=1
+# RUN: ld.lld -T lds a.o -o a.out
+# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORVC-NORELAX
+
+# NORVC-NORELAX: 0000000000001010 t SHOULD_ALIGN_16_HERE
+
+## NORVC, RELAX
+# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORVC=1
+# RUN: ld.lld -T lds a.o -o a.out
+# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORVC
+
+# NORVC: 0000000000001010 t SHOULD_ALIGN_16_HERE
+
+## RVC, NORELAX
+# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORELAX=1
+# RUN: ld.lld -T lds a.o -o a.out
+# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORELAX
+
+# NORELAX: 0000000000001010 t SHOULD_ALIGN_16_HERE
+
+## RVC, RELAX
+# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o
+# RUN: ld.lld -T lds a.o -o a.out
+# RUN: llvm-nm a.out | FileCheck %s --check-prefix=RELAX-RVC
+
+# RELAX-RVC: 0000000000001010 t SHOULD_ALIGN_16_HERE
+
+#--- a.s
+        .text
+        .option relax
+        .balign 2
+        .global _start
+        .type _start, @function
+_start:
+        lui a0, %hi(foo)
+        addi a0, a0, %lo(foo)
+	mul a0, a1, a4
+        .option push
+
+.ifdef NORELAX
+        .option norelax
+.endif
+.ifdef NORVC
+        .option norvc
+.endif
+        .balign 16
+SHOULD_ALIGN_16_HERE:
+        .word 0x12345678
+
+        .option pop
+
+foo:
+        ret
+
+
+
+#--- lds
+ENTRY(_start)
+SECTIONS {
+	.text 0x0001000 : {
+		*(.text*)
+	}
+}
diff --git a/lld/test/ELF/riscv-relax-align-6.s b/lld/test/ELF/riscv-relax-align-6.s
new file mode 100644
index 0000000000000..66e58f490d49b
--- /dev/null
+++ b/lld/test/ELF/riscv-relax-align-6.s
@@ -0,0 +1,68 @@
+# REQUIRES: riscv
+## Testing the aligment is correct when mixing with rvc/norvc relax/norelax
+
+# RUN: rm -rf %t && split-file %s %t && cd %t
+
+## NORVC, NORELAX
+# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORVC=1 --defsym=NORELAX=1
+# RUN: ld.lld -T lds a.o -o a.out
+# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORVC-NORELAX
+
+# NORVC-NORELAX: 0000000000001010 t SHOULD_ALIGN_16_HERE
+
+## NORVC, RELAX
+# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORVC=1
+# RUN: ld.lld -T lds a.o -o a.out
+# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORVC
+
+# NORVC: 0000000000001010 t SHOULD_ALIGN_16_HERE
+
+## RVC, NORELAX
+# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORELAX=1
+# RUN: ld.lld -T lds a.o -o a.out
+# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORELAX
+
+# NORELAX: 0000000000001010 t SHOULD_ALIGN_16_HERE
+
+## RVC, RELAX
+# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o
+# RUN: ld.lld -T lds a.o -o a.out
+# RUN: llvm-nm a.out | FileCheck %s --check-prefix=RELAX-RVC
+
+# RELAX-RVC: 0000000000001010 t SHOULD_ALIGN_16_HERE
+
+#--- a.s
+        .text
+        .option relax
+        .balign 2
+        .global _start
+        .type _start, @function
+_start:
+	call foo
+	mul a0, a1, a4
+        .option push
+
+.ifdef NORELAX
+        .option norelax
+.endif
+.ifdef NORVC
+        .option norvc
+.endif
+        .balign 16
+SHOULD_ALIGN_16_HERE:
+        .word 0x12345678
+
+        .option pop
+
+foo:
+        ret
+
+
+
+#--- lds
+ENTRY(_start)
+SECTIONS {
+	.text 0x0001000 : {
+		*(.text*)
+	}
+}
diff --git a/lld/test/ELF/riscv-relax-align-7.s b/lld/test/ELF/riscv-relax-align-7.s
new file mode 100644
index 0000000000000..d192e7129f99b
--- /dev/null
+++ b/lld/test/ELF/riscv-relax-align-7.s
@@ -0,0 +1,70 @@
+# REQUIRES: riscv
+## Testing the aligment is correct when mixing with rvc/norvc relax/norelax
+
+# RUN: rm -rf %t && split-file %s %t && cd %t
+
+## NORVC, NORELAX
+# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORVC=1 --defsym=NORELAX=1
+# RUN: ld.lld -T lds a.o -o a.out
+# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORVC-NORELAX
+
+# NORVC-NORELAX: 000000000000100c t SHOULD_ALIGN_4_HERE
+
+## NORVC, RELAX
+# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORVC=1
+# RUN: ld.lld -T lds a.o -o a.out
+# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORVC
+
+# NORVC: 000000000000100c t SHOULD_ALIGN_4_HERE
+
+## RVC, NORELAX
+# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORELAX=1
+# RUN: ld.lld -T lds a.o -o a.out
+# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORELAX
+
+# NORELAX: 000000000000100c t SHOULD_ALIGN_4_HERE
+
+## RVC, RELAX
+# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o
+# RUN: ld.lld -T lds a.o -o a.out
+# RUN: llvm-nm a.out | FileCheck %s --check-prefix=RELAX-RVC
+
+# RELAX-RVC: 000000000000100c t SHOULD_ALIGN_4_HERE
+
+#--- a.s
+        .text
+        .option relax
+        .balign 2
+        .global _start
+        .type _start, @function
+_start:
+        lui a0, %hi(foo)
+        addi a0, a0, %lo(foo)
+	.option norvc
+	mul a0, a1, a4
+        .option push
+
+.ifdef NORELAX
+        .option norelax
+.endif
+.ifdef NORVC
+        .option norvc
+.endif
+        .balign 4
+SHOULD_ALIGN_4_HERE:
+        .word 0x12345678
+
+        .option pop
+
+foo:
+        ret
+
+
+
+#--- lds
+ENTRY(_start)
+SECTIONS {
+	.text 0x0001000 : {
+		*(.text*)
+	}
+}
diff --git a/lld/test/ELF/riscv-relax-align-8.s b/lld/test/ELF/riscv-relax-align-8.s
new file mode 100644
index 0000000000000..6f8095917d55e
--- /dev/null
+++ b/lld/test/ELF/riscv-relax-align-8.s
@@ -0,0 +1,69 @@
+# REQUIRES: riscv
+## Testing the aligment is correct when mixing with rvc/norvc relax/norelax
+
+# RUN: rm -rf %t && split-file %s %t && cd %t
+
+## NORVC, NORELAX
+# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORVC=1 --defsym=NORELAX=1
+# RUN: ld.lld -T lds a.o -o a.out
+# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORVC-NORELAX
+
+# NORVC-NORELAX: 0000000000001008 t SHOULD_ALIGN_4_HERE
+
+## NORVC, RELAX
+# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORVC=1
+# RUN: ld.lld -T lds a.o -o a.out
+# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORVC
+
+# NORVC: 0000000000001008 t SHOULD_ALIGN_4_HERE
+
+## RVC, NORELAX
+# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORELAX=1
+# RUN: ld.lld -T lds a.o -o a.out
+# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORELAX
+
+# NORELAX: 0000000000001008 t SHOULD_ALIGN_4_HERE
+
+## RVC, RELAX
+# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o
+# RUN: ld.lld -T lds a.o -o a.out
+# RUN: llvm-nm a.out | FileCheck %s --check-prefix=RELAX-RVC
+
+# RELAX-RVC: 0000000000001008 t SHOULD_ALIGN_4_HERE
+
+#--- a.s
+        .text
+        .option relax
+        .balign 2
+        .global _start
+        .type _start, @function
+_start:
+	call foo
+	.option norvc
+	mul a0, a1, a4
+        .option push
+
+.ifdef NORELAX
+        .option norelax
+.endif
+.ifdef NORVC
+        .option norvc
+.endif
+        .balign 4
+SHOULD_ALIGN_4_HERE:
+        .word 0x12345678
+
+        .option pop
+
+foo:
+        ret
+
+
+
+#--- lds
+ENTRY(_start)
+SECTIONS {
+	.text 0x0001000 : {
+		*(.text*)
+	}
+}
diff --git a/lld/test/ELF/riscv-relax-align-9.s b/lld/test/ELF/riscv-relax-align-9.s
new file mode 100644
index 0000000000000..f8fd096f4e62d
--- /dev/null
+++ b/lld/test/ELF/riscv-relax-align-9.s
@@ -0,0 +1,70 @@
+# REQUIRES: riscv
+## Testing the aligment is correct when mixing with rvc/norvc relax/norelax
+
+# RUN: rm -rf %t && split-file %s %t && cd %t
+
+## NORVC, NORELAX
+# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORVC=1 --defsym=NORELAX=1
+# RUN: ld.lld -T lds a.o -o a.out
+# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORVC-NORELAX
+
+# NORVC-NORELAX: 0000000000001010 t SHOULD_ALIGN_16_HERE
+
+## NORVC, RELAX
+# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORVC=1
+# RUN: ld.lld -T lds a.o -o a.out
+# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORVC
+
+# NORVC: 0000000000001010 t SHOULD_ALIGN_16_HERE
+
+## RVC, NORELAX
+# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORELAX=1
+# RUN: ld.lld -T lds a.o -o a.out
+# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORELAX
+
+# NORELAX: 0000000000001010 t SHOULD_ALIGN_16_HERE
+
+## RVC, RELAX
+# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o
+# RUN: ld.lld -T lds a.o -o a.out
+# RUN: llvm-nm a.out | FileCheck %s --check-prefix=RELAX-RVC
+
+# RELAX-RVC: 0000000000001010 t SHOULD_ALIGN_16_HERE
+
+#--- a.s
+        .text
+        .option relax
+        .balign 2
+        .global _start
+        .type _start, @function
+_start:
+        lui a0, %hi(foo)
+        addi a0, a0, %lo(foo)
+        .option norvc
+	mul a0, a1, a4
+        .option push
+
+.ifdef NORELAX
+        .option norelax
+.endif
+.ifdef NORVC
+        .option norvc
+.endif
+        .balign 16
+SHOULD_ALIGN_16_HERE:
+        .word 0x12345678
+
+        .option pop
+
+foo:
+        ret
+
+
+
+#--- lds
+ENTRY(_start)
+SECTIONS {
+	.text 0x0001000 : {
+		*(.text*)
+	}
+}
diff --git a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp
index d71c42c0a5fc1..f77d3e52b7b8a 100644
--- a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp
+++ b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp
@@ -3177,6 +3177,18 @@ bool RISCVAsmParser::parseDirectiveOption() {
     if (Parser.parseEOL())
       return true;
 
+    auto &Streamer = getTargetStreamer().getStreamer();
+    auto *Assembler = Streamer.getAssemblerPtr();
+    auto *Section = Streamer.getCurrentSectionOnly();
+    // Update RVCEver status only if any instruction emitted.
+    if (Section->hasInstructions() && Assembler != nullptr &&
+        (getSTI().hasFeature(RISCV::FeatureStdExtC) ||
+         getSTI().hasFeature(RISCV::FeatureStdExtZca))) {
+      RISCVAsmBackend &MAB =
+          static_cast<RISCVAsmBackend &>(Assembler->getBackend());
+      MAB.setRVCEver(Section);
+    }
+
     getTargetStreamer().emitDirectiveOptionNoRVC();
     clearFeatureBits(RISCV::FeatureStdExtC, "c");
     clearFeatureBits(RISCV::FeatureStdExtZca, "zca");
@@ -3214,6 +3226,17 @@ bool RISCVAsmParser::parseDirectiveOption() {
     if (Parser.parseEOL())
       return true;
 
+    auto &Streamer = getTargetStreamer().getStreamer();
+    auto *Assembler = Streamer.getAssemblerPtr();
+    auto *Section = Streamer.getCurrentSectionOnly();
+    // Update RelaxEver status only if any instruction emitted.
+    if (Assembler != nullptr && Section->hasInstructions() &&
+        getSTI().hasFeature(RISCV::FeatureRelax)) {
+      RISCVAsmBackend &MAB =
+          static_cast<RISCVAsmBackend &>(Assembler->getBackend());
+      MAB.setRelaxEver(Section);
+    }
+
     getTargetStreamer().emitDirectiveOptionNoRelax();
     clearFeatureBits(RISCV::FeatureRelax, "relax");
     return false;
diff --git a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.cpp b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.cpp
index 82e3b5ceb4ef6..93f412f1b2c61 100644
--- a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.cpp
+++ b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.cpp
@@ -309,9 +309,12 @@ bool RISCVAsmBackend::relaxAlign(MCFragment &F, unsigned &Size) {
   // Use default handling unless linker relaxation is enabled and the alignment
   // is larger than the nop size.
   const MCSubtargetInfo *STI = F.getSubtargetInfo();
-  if (!STI->hasFeature(RISCV::FeatureRelax))
+  if (!hasRelaxEver(F.getParent()) && !STI->hasFeature(RISCV::FeatureRelax))
     return false;
-  unsigned MinNopLen = STI->hasFeature(RISCV::FeatureStdExtZca) ? 2 : 4;
+  unsigned MinNopLen =
+      hasRelaxEver(F.getParent()) || STI->hasFeature(RISCV::FeatureStdExtZca)
+          ? 2
+          : 4;
   if (F.getAlignment() <= MinNopLen)
     return false;
 
diff --git a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.h b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.h
index d97d63204e7e4..ae09e39b9a27b 100644
--- a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.h
+++ b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.h
@@ -12,8 +12,10 @@
 #include "MCTargetDesc/RISCVBaseInfo.h"
 #include "MCTargetDesc/RISCVFixupKinds.h"
 #include "MCTargetDesc/RISCVMCTargetDesc.h"
+#include "llvm/ADT/SmallPtrSet.h"
 #include "llvm/ADT/StringMap.h"
 #include "llvm/MC/MCAsmBackend.h"
+#include "llvm/MC/MCSection.h"
 #include "llvm/MC/MCSubtargetInfo.h"
 
 namespace llvm {
@@ -33,11 +35,23 @@ class RISCVAsmBackend : public MCAsmBackend {
 
   StringMap<MCSymbol *> VendorSymbols;
 
+  SmallPtrSet<MCSection *, 8> RelaxEverSections;
+  SmallPtrSet<MCSection *, 8> RVCEverSections;
+
 public:
   RISCVAsmBackend(const MCSubtargetInfo &STI, uint8_t OSABI, bool Is64Bit,
                   const MCTargetOptions &Options);
   ~RISCVAsmBackend() override = default;
 
+  void setRVCEver(MCSection *Sec) { RVCEverSections.insert(Sec); }
+  bool hasRVCEver(MCSection *Sec) const {
+    return RVCEverSections.contains(Sec);
+  }
+  void setRelaxEver(MCSection *Sec) { RelaxEverSections.insert(Sec); }
+  bool hasRelaxEver(MCSection *Sec) const {
+    return RelaxEverSections.contains(Sec);
+  }
+
   std::optional<bool> evaluateFixup(const MCFragment &, MCFixup &, MCValue &,
                                     uint64_t &) override;
   bool addReloc(const MCFragment &, const MCFixup &, const MCValue &,

>From 58dd9c2e9ab6446d55696839b3a6bf84a5e743c0 Mon Sep 17 00:00:00 2001
From: Kito Cheng <kito.cheng at sifive.com>
Date: Thu, 31 Jul 2025 22:17:22 +0800
Subject: [PATCH 2/2] !fixup

Changes:
- Add const to MCSection* for the RelaxEverSections and RVCEverSections
- Fix and simplify condition in RISCVAsmBackend::relaxAlign.
- Drop lld tests.
- Adding MC tests
---
 lld/test/ELF/riscv-relax-align-1.s            | 69 ---------------
 lld/test/ELF/riscv-relax-align-10.s           | 69 ---------------
 lld/test/ELF/riscv-relax-align-11.s           | 70 ---------------
 lld/test/ELF/riscv-relax-align-12.s           | 69 ---------------
 lld/test/ELF/riscv-relax-align-2.s            | 68 --------------
 lld/test/ELF/riscv-relax-align-3.s            | 69 ---------------
 lld/test/ELF/riscv-relax-align-4.s            | 68 --------------
 lld/test/ELF/riscv-relax-align-5.s            | 69 ---------------
 lld/test/ELF/riscv-relax-align-6.s            | 68 --------------
 lld/test/ELF/riscv-relax-align-7.s            | 70 ---------------
 lld/test/ELF/riscv-relax-align-8.s            | 69 ---------------
 lld/test/ELF/riscv-relax-align-9.s            | 70 ---------------
 lld/test/ELF/riscv-relax-align-rvc.s          | 88 -------------------
 .../Target/RISCV/AsmParser/RISCVAsmParser.cpp |  3 +-
 .../RISCV/MCTargetDesc/RISCVAsmBackend.cpp    |  4 +-
 .../RISCV/MCTargetDesc/RISCVAsmBackend.h      | 12 +--
 .../MC/RISCV/align-option-norelax-norvc.s     | 34 +++++++
 llvm/test/MC/RISCV/align-option-norelax.s     | 30 +++++++
 18 files changed, 73 insertions(+), 926 deletions(-)
 delete mode 100644 lld/test/ELF/riscv-relax-align-1.s
 delete mode 100644 lld/test/ELF/riscv-relax-align-10.s
 delete mode 100644 lld/test/ELF/riscv-relax-align-11.s
 delete mode 100644 lld/test/ELF/riscv-relax-align-12.s
 delete mode 100644 lld/test/ELF/riscv-relax-align-2.s
 delete mode 100644 lld/test/ELF/riscv-relax-align-3.s
 delete mode 100644 lld/test/ELF/riscv-relax-align-4.s
 delete mode 100644 lld/test/ELF/riscv-relax-align-5.s
 delete mode 100644 lld/test/ELF/riscv-relax-align-6.s
 delete mode 100644 lld/test/ELF/riscv-relax-align-7.s
 delete mode 100644 lld/test/ELF/riscv-relax-align-8.s
 delete mode 100644 lld/test/ELF/riscv-relax-align-9.s
 delete mode 100644 lld/test/ELF/riscv-relax-align-rvc.s
 create mode 100644 llvm/test/MC/RISCV/align-option-norelax-norvc.s
 create mode 100644 llvm/test/MC/RISCV/align-option-norelax.s

diff --git a/lld/test/ELF/riscv-relax-align-1.s b/lld/test/ELF/riscv-relax-align-1.s
deleted file mode 100644
index c7ab4b03539eb..0000000000000
--- a/lld/test/ELF/riscv-relax-align-1.s
+++ /dev/null
@@ -1,69 +0,0 @@
-# REQUIRES: riscv
-## Testing the aligment is correct when mixing with rvc/norvc relax/norelax
-
-# RUN: rm -rf %t && split-file %s %t && cd %t
-
-## NORVC, NORELAX
-# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORVC=1 --defsym=NORELAX=1
-# RUN: ld.lld -T lds a.o -o a.out
-# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORVC-NORELAX
-
-# NORVC-NORELAX: 0000000000001010 t SHOULD_ALIGN_8_HERE
-
-## NORVC, RELAX
-# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORVC=1
-# RUN: ld.lld -T lds a.o -o a.out
-# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORVC
-
-# NORVC: 0000000000001010 t SHOULD_ALIGN_8_HERE
-
-## RVC, NORELAX
-# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORELAX=1
-# RUN: ld.lld -T lds a.o -o a.out
-# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORELAX
-
-# NORELAX: 0000000000001010 t SHOULD_ALIGN_8_HERE
-
-## RVC, RELAX
-# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o
-# RUN: ld.lld -T lds a.o -o a.out
-# RUN: llvm-nm a.out | FileCheck %s --check-prefix=RELAX-RVC
-
-# RELAX-RVC: 0000000000001010 t SHOULD_ALIGN_8_HERE
-
-#--- a.s
-        .text
-        .option relax
-        .balign 4
-        .global _start
-        .type _start, @function
-_start:
-        lui a0, %hi(foo)
-        addi a0, a0, %lo(foo)
-	mul a0, a1, a4
-        .option push
-
-.ifdef NORELAX
-        .option norelax
-.endif
-.ifdef NORVC
-        .option norvc
-.endif
-        .balign 8
-SHOULD_ALIGN_8_HERE:
-        .word 0x12345678
-
-        .option pop
-
-foo:
-        ret
-
-
-
-#--- lds
-ENTRY(_start)
-SECTIONS {
-	.text 0x0001000 : {
-		*(.text*)
-	}
-}
diff --git a/lld/test/ELF/riscv-relax-align-10.s b/lld/test/ELF/riscv-relax-align-10.s
deleted file mode 100644
index dc816f0b03b77..0000000000000
--- a/lld/test/ELF/riscv-relax-align-10.s
+++ /dev/null
@@ -1,69 +0,0 @@
-# REQUIRES: riscv
-## Testing the aligment is correct when mixing with rvc/norvc relax/norelax
-
-# RUN: rm -rf %t && split-file %s %t && cd %t
-
-## NORVC, NORELAX
-# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORVC=1 --defsym=NORELAX=1
-# RUN: ld.lld -T lds a.o -o a.out
-# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORVC-NORELAX
-
-# NORVC-NORELAX: 0000000000001010 t SHOULD_ALIGN_16_HERE
-
-## NORVC, RELAX
-# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORVC=1
-# RUN: ld.lld -T lds a.o -o a.out
-# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORVC
-
-# NORVC: 0000000000001010 t SHOULD_ALIGN_16_HERE
-
-## RVC, NORELAX
-# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORELAX=1
-# RUN: ld.lld -T lds a.o -o a.out
-# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORELAX
-
-# NORELAX: 0000000000001010 t SHOULD_ALIGN_16_HERE
-
-## RVC, RELAX
-# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o
-# RUN: ld.lld -T lds a.o -o a.out
-# RUN: llvm-nm a.out | FileCheck %s --check-prefix=RELAX-RVC
-
-# RELAX-RVC: 0000000000001010 t SHOULD_ALIGN_16_HERE
-
-#--- a.s
-        .text
-        .option relax
-        .balign 2
-        .global _start
-        .type _start, @function
-_start:
-	call foo
-        .option norvc
-	mul a0, a1, a4
-        .option push
-
-.ifdef NORELAX
-        .option norelax
-.endif
-.ifdef NORVC
-        .option norvc
-.endif
-        .balign 16
-SHOULD_ALIGN_16_HERE:
-        .word 0x12345678
-
-        .option pop
-
-foo:
-        ret
-
-
-
-#--- lds
-ENTRY(_start)
-SECTIONS {
-	.text 0x0001000 : {
-		*(.text*)
-	}
-}
diff --git a/lld/test/ELF/riscv-relax-align-11.s b/lld/test/ELF/riscv-relax-align-11.s
deleted file mode 100644
index 456ecf1e04456..0000000000000
--- a/lld/test/ELF/riscv-relax-align-11.s
+++ /dev/null
@@ -1,70 +0,0 @@
-# REQUIRES: riscv
-## Testing the aligment is correct when mixing with rvc/norvc relax/norelax
-
-# RUN: rm -rf %t && split-file %s %t && cd %t
-
-## NORVC, NORELAX
-# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORVC=1 --defsym=NORELAX=1
-# RUN: ld.lld -T lds a.o -o a.out
-# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORVC-NORELAX
-
-# NORVC-NORELAX: 0000000000001010 t SHOULD_ALIGN_16_HERE
-
-## NORVC, RELAX
-# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORVC=1
-# RUN: ld.lld -T lds a.o -o a.out
-# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORVC
-
-# NORVC: 0000000000001010 t SHOULD_ALIGN_16_HERE
-
-## RVC, NORELAX
-# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORELAX=1
-# RUN: ld.lld -T lds a.o -o a.out
-# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORELAX
-
-# NORELAX: 0000000000001010 t SHOULD_ALIGN_16_HERE
-
-## RVC, RELAX
-# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o
-# RUN: ld.lld -T lds a.o -o a.out
-# RUN: llvm-nm a.out | FileCheck %s --check-prefix=RELAX-RVC
-
-# RELAX-RVC: 0000000000001010 t SHOULD_ALIGN_16_HERE
-
-#--- a.s
-        .text
-        .option relax
-        .balign 2
-        .global _start
-        .type _start, @function
-_start:
-        lui a0, %hi(foo)
-        addi a0, a0, %lo(foo)
-        .option norvc
-	mul a0, a1, a4
-        .option push
-
-.ifdef NORELAX
-        .option norelax
-.endif
-.ifdef NORVC
-        .option norvc
-.endif
-        .balign 16
-SHOULD_ALIGN_16_HERE:
-	ret
-
-        .option pop
-
-foo:
-        ret
-
-
-
-#--- lds
-ENTRY(_start)
-SECTIONS {
-	.text 0x0001000 : {
-		*(.text*)
-	}
-}
diff --git a/lld/test/ELF/riscv-relax-align-12.s b/lld/test/ELF/riscv-relax-align-12.s
deleted file mode 100644
index b9e48d3323db5..0000000000000
--- a/lld/test/ELF/riscv-relax-align-12.s
+++ /dev/null
@@ -1,69 +0,0 @@
-# REQUIRES: riscv
-## Testing the aligment is correct when mixing with rvc/norvc relax/norelax
-
-# RUN: rm -rf %t && split-file %s %t && cd %t
-
-## NORVC, NORELAX
-# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORVC=1 --defsym=NORELAX=1
-# RUN: ld.lld -T lds a.o -o a.out
-# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORVC-NORELAX
-
-# NORVC-NORELAX: 0000000000001010 t SHOULD_ALIGN_16_HERE
-
-## NORVC, RELAX
-# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORVC=1
-# RUN: ld.lld -T lds a.o -o a.out
-# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORVC
-
-# NORVC: 0000000000001010 t SHOULD_ALIGN_16_HERE
-
-## RVC, NORELAX
-# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORELAX=1
-# RUN: ld.lld -T lds a.o -o a.out
-# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORELAX
-
-# NORELAX: 0000000000001010 t SHOULD_ALIGN_16_HERE
-
-## RVC, RELAX
-# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o
-# RUN: ld.lld -T lds a.o -o a.out
-# RUN: llvm-nm a.out | FileCheck %s --check-prefix=RELAX-RVC
-
-# RELAX-RVC: 0000000000001010 t SHOULD_ALIGN_16_HERE
-
-#--- a.s
-        .text
-        .option relax
-        .balign 2
-        .global _start
-        .type _start, @function
-_start:
-	call foo
-        .option norvc
-	mul a0, a1, a4
-        .option push
-
-.ifdef NORELAX
-        .option norelax
-.endif
-.ifdef NORVC
-        .option norvc
-.endif
-        .balign 16
-SHOULD_ALIGN_16_HERE:
-	ret
-
-        .option pop
-
-foo:
-        ret
-
-
-
-#--- lds
-ENTRY(_start)
-SECTIONS {
-	.text 0x0001000 : {
-		*(.text*)
-	}
-}
diff --git a/lld/test/ELF/riscv-relax-align-2.s b/lld/test/ELF/riscv-relax-align-2.s
deleted file mode 100644
index 401f6e338845b..0000000000000
--- a/lld/test/ELF/riscv-relax-align-2.s
+++ /dev/null
@@ -1,68 +0,0 @@
-# REQUIRES: riscv
-## Testing the aligment is correct when mixing with rvc/norvc relax/norelax
-
-# RUN: rm -rf %t && split-file %s %t && cd %t
-
-## NORVC, NORELAX
-# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORVC=1 --defsym=NORELAX=1
-# RUN: ld.lld -T lds a.o -o a.out
-# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORVC-NORELAX
-
-# NORVC-NORELAX: 0000000000001008 t SHOULD_ALIGN_8_HERE
-
-## NORVC, RELAX
-# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORVC=1
-# RUN: ld.lld -T lds a.o -o a.out
-# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORVC
-
-# NORVC: 0000000000001008 t SHOULD_ALIGN_8_HERE
-
-## RVC, NORELAX
-# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORELAX=1
-# RUN: ld.lld -T lds a.o -o a.out
-# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORELAX
-
-# NORELAX: 0000000000001008 t SHOULD_ALIGN_8_HERE
-
-## RVC, RELAX
-# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o
-# RUN: ld.lld -T lds a.o -o a.out
-# RUN: llvm-nm a.out | FileCheck %s --check-prefix=RELAX-RVC
-
-# RELAX-RVC: 0000000000001008 t SHOULD_ALIGN_8_HERE
-
-#--- a.s
-        .text
-        .option relax
-        .balign 4
-        .global _start
-        .type _start, @function
-_start:
-	call foo
-	mul a0, a1, a4
-        .option push
-
-.ifdef NORELAX
-        .option norelax
-.endif
-.ifdef NORVC
-        .option norvc
-.endif
-        .balign 8
-SHOULD_ALIGN_8_HERE:
-        .word 0x12345678
-
-        .option pop
-
-foo:
-        ret
-
-
-
-#--- lds
-ENTRY(_start)
-SECTIONS {
-	.text 0x0001000 : {
-		*(.text*)
-	}
-}
diff --git a/lld/test/ELF/riscv-relax-align-3.s b/lld/test/ELF/riscv-relax-align-3.s
deleted file mode 100644
index 1f4ebeef095f3..0000000000000
--- a/lld/test/ELF/riscv-relax-align-3.s
+++ /dev/null
@@ -1,69 +0,0 @@
-# REQUIRES: riscv
-## Testing the aligment is correct when mixing with rvc/norvc relax/norelax
-
-# RUN: rm -rf %t && split-file %s %t && cd %t
-
-## NORVC, NORELAX
-# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORVC=1 --defsym=NORELAX=1
-# RUN: ld.lld -T lds a.o -o a.out
-# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORVC-NORELAX
-
-# NORVC-NORELAX: 000000000000100c t SHOULD_ALIGN_4_HERE
-
-## NORVC, RELAX
-# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORVC=1
-# RUN: ld.lld -T lds a.o -o a.out
-# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORVC
-
-# NORVC: 000000000000100c t SHOULD_ALIGN_4_HERE
-
-## RVC, NORELAX
-# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORELAX=1
-# RUN: ld.lld -T lds a.o -o a.out
-# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORELAX
-
-# NORELAX: 000000000000100c t SHOULD_ALIGN_4_HERE
-
-## RVC, RELAX
-# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o
-# RUN: ld.lld -T lds a.o -o a.out
-# RUN: llvm-nm a.out | FileCheck %s --check-prefix=RELAX-RVC
-
-# RELAX-RVC: 000000000000100c t SHOULD_ALIGN_4_HERE
-
-#--- a.s
-        .text
-        .option relax
-        .balign 2
-        .global _start
-        .type _start, @function
-_start:
-        lui a0, %hi(foo)
-        addi a0, a0, %lo(foo)
-	mul a0, a1, a4
-        .option push
-
-.ifdef NORELAX
-        .option norelax
-.endif
-.ifdef NORVC
-        .option norvc
-.endif
-        .balign 4
-SHOULD_ALIGN_4_HERE:
-        .word 0x12345678
-
-        .option pop
-
-foo:
-        ret
-
-
-
-#--- lds
-ENTRY(_start)
-SECTIONS {
-	.text 0x0001000 : {
-		*(.text*)
-	}
-}
diff --git a/lld/test/ELF/riscv-relax-align-4.s b/lld/test/ELF/riscv-relax-align-4.s
deleted file mode 100644
index 2db50fa264f28..0000000000000
--- a/lld/test/ELF/riscv-relax-align-4.s
+++ /dev/null
@@ -1,68 +0,0 @@
-# REQUIRES: riscv
-## Testing the aligment is correct when mixing with rvc/norvc relax/norelax
-
-# RUN: rm -rf %t && split-file %s %t && cd %t
-
-## NORVC, NORELAX
-# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORVC=1 --defsym=NORELAX=1
-# RUN: ld.lld -T lds a.o -o a.out
-# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORVC-NORELAX
-
-# NORVC-NORELAX: 0000000000001008 t SHOULD_ALIGN_4_HERE
-
-## NORVC, RELAX
-# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORVC=1
-# RUN: ld.lld -T lds a.o -o a.out
-# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORVC
-
-# NORVC: 0000000000001008 t SHOULD_ALIGN_4_HERE
-
-## RVC, NORELAX
-# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORELAX=1
-# RUN: ld.lld -T lds a.o -o a.out
-# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORELAX
-
-# NORELAX: 0000000000001008 t SHOULD_ALIGN_4_HERE
-
-## RVC, RELAX
-# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o
-# RUN: ld.lld -T lds a.o -o a.out
-# RUN: llvm-nm a.out | FileCheck %s --check-prefix=RELAX-RVC
-
-# RELAX-RVC: 0000000000001008 t SHOULD_ALIGN_4_HERE
-
-#--- a.s
-        .text
-        .option relax
-        .balign 2
-        .global _start
-        .type _start, @function
-_start:
-	call foo
-	mul a0, a1, a4
-        .option push
-
-.ifdef NORELAX
-        .option norelax
-.endif
-.ifdef NORVC
-        .option norvc
-.endif
-        .balign 4
-SHOULD_ALIGN_4_HERE:
-        .word 0x12345678
-
-        .option pop
-
-foo:
-        ret
-
-
-
-#--- lds
-ENTRY(_start)
-SECTIONS {
-	.text 0x0001000 : {
-		*(.text*)
-	}
-}
diff --git a/lld/test/ELF/riscv-relax-align-5.s b/lld/test/ELF/riscv-relax-align-5.s
deleted file mode 100644
index b3474811c1554..0000000000000
--- a/lld/test/ELF/riscv-relax-align-5.s
+++ /dev/null
@@ -1,69 +0,0 @@
-# REQUIRES: riscv
-## Testing the aligment is correct when mixing with rvc/norvc relax/norelax
-
-# RUN: rm -rf %t && split-file %s %t && cd %t
-
-## NORVC, NORELAX
-# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORVC=1 --defsym=NORELAX=1
-# RUN: ld.lld -T lds a.o -o a.out
-# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORVC-NORELAX
-
-# NORVC-NORELAX: 0000000000001010 t SHOULD_ALIGN_16_HERE
-
-## NORVC, RELAX
-# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORVC=1
-# RUN: ld.lld -T lds a.o -o a.out
-# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORVC
-
-# NORVC: 0000000000001010 t SHOULD_ALIGN_16_HERE
-
-## RVC, NORELAX
-# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORELAX=1
-# RUN: ld.lld -T lds a.o -o a.out
-# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORELAX
-
-# NORELAX: 0000000000001010 t SHOULD_ALIGN_16_HERE
-
-## RVC, RELAX
-# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o
-# RUN: ld.lld -T lds a.o -o a.out
-# RUN: llvm-nm a.out | FileCheck %s --check-prefix=RELAX-RVC
-
-# RELAX-RVC: 0000000000001010 t SHOULD_ALIGN_16_HERE
-
-#--- a.s
-        .text
-        .option relax
-        .balign 2
-        .global _start
-        .type _start, @function
-_start:
-        lui a0, %hi(foo)
-        addi a0, a0, %lo(foo)
-	mul a0, a1, a4
-        .option push
-
-.ifdef NORELAX
-        .option norelax
-.endif
-.ifdef NORVC
-        .option norvc
-.endif
-        .balign 16
-SHOULD_ALIGN_16_HERE:
-        .word 0x12345678
-
-        .option pop
-
-foo:
-        ret
-
-
-
-#--- lds
-ENTRY(_start)
-SECTIONS {
-	.text 0x0001000 : {
-		*(.text*)
-	}
-}
diff --git a/lld/test/ELF/riscv-relax-align-6.s b/lld/test/ELF/riscv-relax-align-6.s
deleted file mode 100644
index 66e58f490d49b..0000000000000
--- a/lld/test/ELF/riscv-relax-align-6.s
+++ /dev/null
@@ -1,68 +0,0 @@
-# REQUIRES: riscv
-## Testing the aligment is correct when mixing with rvc/norvc relax/norelax
-
-# RUN: rm -rf %t && split-file %s %t && cd %t
-
-## NORVC, NORELAX
-# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORVC=1 --defsym=NORELAX=1
-# RUN: ld.lld -T lds a.o -o a.out
-# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORVC-NORELAX
-
-# NORVC-NORELAX: 0000000000001010 t SHOULD_ALIGN_16_HERE
-
-## NORVC, RELAX
-# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORVC=1
-# RUN: ld.lld -T lds a.o -o a.out
-# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORVC
-
-# NORVC: 0000000000001010 t SHOULD_ALIGN_16_HERE
-
-## RVC, NORELAX
-# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORELAX=1
-# RUN: ld.lld -T lds a.o -o a.out
-# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORELAX
-
-# NORELAX: 0000000000001010 t SHOULD_ALIGN_16_HERE
-
-## RVC, RELAX
-# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o
-# RUN: ld.lld -T lds a.o -o a.out
-# RUN: llvm-nm a.out | FileCheck %s --check-prefix=RELAX-RVC
-
-# RELAX-RVC: 0000000000001010 t SHOULD_ALIGN_16_HERE
-
-#--- a.s
-        .text
-        .option relax
-        .balign 2
-        .global _start
-        .type _start, @function
-_start:
-	call foo
-	mul a0, a1, a4
-        .option push
-
-.ifdef NORELAX
-        .option norelax
-.endif
-.ifdef NORVC
-        .option norvc
-.endif
-        .balign 16
-SHOULD_ALIGN_16_HERE:
-        .word 0x12345678
-
-        .option pop
-
-foo:
-        ret
-
-
-
-#--- lds
-ENTRY(_start)
-SECTIONS {
-	.text 0x0001000 : {
-		*(.text*)
-	}
-}
diff --git a/lld/test/ELF/riscv-relax-align-7.s b/lld/test/ELF/riscv-relax-align-7.s
deleted file mode 100644
index d192e7129f99b..0000000000000
--- a/lld/test/ELF/riscv-relax-align-7.s
+++ /dev/null
@@ -1,70 +0,0 @@
-# REQUIRES: riscv
-## Testing the aligment is correct when mixing with rvc/norvc relax/norelax
-
-# RUN: rm -rf %t && split-file %s %t && cd %t
-
-## NORVC, NORELAX
-# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORVC=1 --defsym=NORELAX=1
-# RUN: ld.lld -T lds a.o -o a.out
-# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORVC-NORELAX
-
-# NORVC-NORELAX: 000000000000100c t SHOULD_ALIGN_4_HERE
-
-## NORVC, RELAX
-# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORVC=1
-# RUN: ld.lld -T lds a.o -o a.out
-# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORVC
-
-# NORVC: 000000000000100c t SHOULD_ALIGN_4_HERE
-
-## RVC, NORELAX
-# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORELAX=1
-# RUN: ld.lld -T lds a.o -o a.out
-# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORELAX
-
-# NORELAX: 000000000000100c t SHOULD_ALIGN_4_HERE
-
-## RVC, RELAX
-# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o
-# RUN: ld.lld -T lds a.o -o a.out
-# RUN: llvm-nm a.out | FileCheck %s --check-prefix=RELAX-RVC
-
-# RELAX-RVC: 000000000000100c t SHOULD_ALIGN_4_HERE
-
-#--- a.s
-        .text
-        .option relax
-        .balign 2
-        .global _start
-        .type _start, @function
-_start:
-        lui a0, %hi(foo)
-        addi a0, a0, %lo(foo)
-	.option norvc
-	mul a0, a1, a4
-        .option push
-
-.ifdef NORELAX
-        .option norelax
-.endif
-.ifdef NORVC
-        .option norvc
-.endif
-        .balign 4
-SHOULD_ALIGN_4_HERE:
-        .word 0x12345678
-
-        .option pop
-
-foo:
-        ret
-
-
-
-#--- lds
-ENTRY(_start)
-SECTIONS {
-	.text 0x0001000 : {
-		*(.text*)
-	}
-}
diff --git a/lld/test/ELF/riscv-relax-align-8.s b/lld/test/ELF/riscv-relax-align-8.s
deleted file mode 100644
index 6f8095917d55e..0000000000000
--- a/lld/test/ELF/riscv-relax-align-8.s
+++ /dev/null
@@ -1,69 +0,0 @@
-# REQUIRES: riscv
-## Testing the aligment is correct when mixing with rvc/norvc relax/norelax
-
-# RUN: rm -rf %t && split-file %s %t && cd %t
-
-## NORVC, NORELAX
-# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORVC=1 --defsym=NORELAX=1
-# RUN: ld.lld -T lds a.o -o a.out
-# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORVC-NORELAX
-
-# NORVC-NORELAX: 0000000000001008 t SHOULD_ALIGN_4_HERE
-
-## NORVC, RELAX
-# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORVC=1
-# RUN: ld.lld -T lds a.o -o a.out
-# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORVC
-
-# NORVC: 0000000000001008 t SHOULD_ALIGN_4_HERE
-
-## RVC, NORELAX
-# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORELAX=1
-# RUN: ld.lld -T lds a.o -o a.out
-# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORELAX
-
-# NORELAX: 0000000000001008 t SHOULD_ALIGN_4_HERE
-
-## RVC, RELAX
-# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o
-# RUN: ld.lld -T lds a.o -o a.out
-# RUN: llvm-nm a.out | FileCheck %s --check-prefix=RELAX-RVC
-
-# RELAX-RVC: 0000000000001008 t SHOULD_ALIGN_4_HERE
-
-#--- a.s
-        .text
-        .option relax
-        .balign 2
-        .global _start
-        .type _start, @function
-_start:
-	call foo
-	.option norvc
-	mul a0, a1, a4
-        .option push
-
-.ifdef NORELAX
-        .option norelax
-.endif
-.ifdef NORVC
-        .option norvc
-.endif
-        .balign 4
-SHOULD_ALIGN_4_HERE:
-        .word 0x12345678
-
-        .option pop
-
-foo:
-        ret
-
-
-
-#--- lds
-ENTRY(_start)
-SECTIONS {
-	.text 0x0001000 : {
-		*(.text*)
-	}
-}
diff --git a/lld/test/ELF/riscv-relax-align-9.s b/lld/test/ELF/riscv-relax-align-9.s
deleted file mode 100644
index f8fd096f4e62d..0000000000000
--- a/lld/test/ELF/riscv-relax-align-9.s
+++ /dev/null
@@ -1,70 +0,0 @@
-# REQUIRES: riscv
-## Testing the aligment is correct when mixing with rvc/norvc relax/norelax
-
-# RUN: rm -rf %t && split-file %s %t && cd %t
-
-## NORVC, NORELAX
-# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORVC=1 --defsym=NORELAX=1
-# RUN: ld.lld -T lds a.o -o a.out
-# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORVC-NORELAX
-
-# NORVC-NORELAX: 0000000000001010 t SHOULD_ALIGN_16_HERE
-
-## NORVC, RELAX
-# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORVC=1
-# RUN: ld.lld -T lds a.o -o a.out
-# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORVC
-
-# NORVC: 0000000000001010 t SHOULD_ALIGN_16_HERE
-
-## RVC, NORELAX
-# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o --defsym=NORELAX=1
-# RUN: ld.lld -T lds a.o -o a.out
-# RUN: llvm-nm a.out | FileCheck %s --check-prefix=NORELAX
-
-# NORELAX: 0000000000001010 t SHOULD_ALIGN_16_HERE
-
-## RVC, RELAX
-# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m a.s -o a.o
-# RUN: ld.lld -T lds a.o -o a.out
-# RUN: llvm-nm a.out | FileCheck %s --check-prefix=RELAX-RVC
-
-# RELAX-RVC: 0000000000001010 t SHOULD_ALIGN_16_HERE
-
-#--- a.s
-        .text
-        .option relax
-        .balign 2
-        .global _start
-        .type _start, @function
-_start:
-        lui a0, %hi(foo)
-        addi a0, a0, %lo(foo)
-        .option norvc
-	mul a0, a1, a4
-        .option push
-
-.ifdef NORELAX
-        .option norelax
-.endif
-.ifdef NORVC
-        .option norvc
-.endif
-        .balign 16
-SHOULD_ALIGN_16_HERE:
-        .word 0x12345678
-
-        .option pop
-
-foo:
-        ret
-
-
-
-#--- lds
-ENTRY(_start)
-SECTIONS {
-	.text 0x0001000 : {
-		*(.text*)
-	}
-}
diff --git a/lld/test/ELF/riscv-relax-align-rvc.s b/lld/test/ELF/riscv-relax-align-rvc.s
deleted file mode 100644
index 8980e18ea876b..0000000000000
--- a/lld/test/ELF/riscv-relax-align-rvc.s
+++ /dev/null
@@ -1,88 +0,0 @@
-# REQUIRES: riscv
-
-# RUN: rm -rf %t && mkdir %t && cd %t
-
-# RUN: llvm-mc -filetype=obj -triple=riscv32 -mattr=+c,+relax %s -o 32.o
-# RUN: ld.lld -Ttext=0x10000 32.o -o 32
-# RUN: llvm-objdump -td --no-show-raw-insn -M no-aliases 32 | FileCheck %s
-## R_RISCV_ALIGN is handled regarldess of --no-relax.
-# RUN: ld.lld -Ttext=0x10000 --no-relax 32.o -o 32.norelax
-# RUN: llvm-objdump -td --no-show-raw-insn -M no-aliases 32.norelax | FileCheck %s
-
-# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+c,+relax %s -o 64.o
-# RUN: ld.lld -Ttext=0x10000 64.o -o 64
-# RUN: llvm-objdump -td --no-show-raw-insn -M no-aliases 64 | FileCheck %s
-# RUN: ld.lld -Ttext=0x10000 --no-relax 64.o -o 64.norelax
-# RUN: llvm-objdump -td --no-show-raw-insn -M no-aliases 64.norelax | FileCheck %s
-
-# CHECK-DAG: 00010002 l       .text  {{0*}}1e a
-# CHECK-DAG: 00010010 l       .text  {{0*}}22 b
-# CHECK-DAG: 00010012 l       .text  {{0*}}1e c
-# CHECK-DAG: 00010020 l       .text  {{0*}}16 d
-# CHECK-DAG: 00010000 g       .text  {{0*}}36 _start
-
-# CHECK:      <_start>:
-# CHECK-NEXT:           c.addi    a0, 0x1
-# CHECK-EMPTY:
-# CHECK-NEXT: <a>:
-# CHECK-NEXT:           c.nop
-# CHECK-NEXT:           addi    zero, zero, 0x0
-# CHECK-NEXT:           addi    zero, zero, 0x0
-# CHECK-NEXT:           addi    zero, zero, 0x0
-# CHECK-EMPTY:
-# CHECK-NEXT: <b>:
-# CHECK-NEXT:   10010:  c.addi  a0, 0x2
-# CHECK-EMPTY:
-# CHECK-NEXT: <c>:
-# CHECK-NEXT:           c.addi  a0, 0x3
-# CHECK-NEXT:           addi    zero, zero, 0x0
-# CHECK-NEXT:           addi    zero, zero, 0x0
-# CHECK-NEXT:           addi    zero, zero, 0x0
-# CHECK-EMPTY:
-# CHECK-NEXT: <d>:
-# CHECK-NEXT:   10020:  c.addi  a0, 0x4
-# CHECK-NEXT:           c.addi  a0, 0x5
-# CHECK-NEXT:           addi    zero, zero, 0x0
-# CHECK-NEXT:           addi    zero, zero, 0x0
-# CHECK-NEXT:           addi    zero, zero, 0x0
-# CHECK-NEXT:   10030:  c.addi  a0, 0x6
-# CHECK-NEXT:           c.addi  a0, 0x7
-# CHECK-NEXT:           c.addi  a0, 0x8
-# CHECK-EMPTY:
-
-# CHECK:      <.text2>:
-# CHECK-NEXT:           addi    a0, a1, 0x1
-# CHECK-NEXT:           c.addi  a0, 0x1
-# CHECK-NEXT:           c.nop
-# CHECK-NEXT:           c.addi  a0, 0x2
-
-.global _start
-_start:
-  c.addi a0, 0x1
-a:
-.balign 16
-b:
-  c.addi a0, 0x2
-c:
-  c.addi a0, 0x3
-.balign 32
-.size a, . - a
-d:
-  c.addi a0, 0x4
-  c.addi a0, 0x5
-.balign 16
-.size c, . - c
-  c.addi a0, 0x6
-.size b, . - b
-  c.addi a0, 0x7
-.balign 4
-  c.addi a0, 0x8
-.size d, . - d
-.size _start, . - _start
-
-.section .text2,"ax"
-.balign 16
-  addi a0, a1, 0x1
-  c.addi a0, 0x1
-.balign 8
-  c.addi a0, 0x2
diff --git a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp
index f77d3e52b7b8a..beaf02f0f50f7 100644
--- a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp
+++ b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp
@@ -3182,8 +3182,7 @@ bool RISCVAsmParser::parseDirectiveOption() {
     auto *Section = Streamer.getCurrentSectionOnly();
     // Update RVCEver status only if any instruction emitted.
     if (Section->hasInstructions() && Assembler != nullptr &&
-        (getSTI().hasFeature(RISCV::FeatureStdExtC) ||
-         getSTI().hasFeature(RISCV::FeatureStdExtZca))) {
+        getSTI().hasFeature(RISCV::FeatureStdExtZca)) {
       RISCVAsmBackend &MAB =
           static_cast<RISCVAsmBackend &>(Assembler->getBackend());
       MAB.setRVCEver(Section);
diff --git a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.cpp b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.cpp
index 93f412f1b2c61..5583a2d73a23b 100644
--- a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.cpp
+++ b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.cpp
@@ -309,10 +309,10 @@ bool RISCVAsmBackend::relaxAlign(MCFragment &F, unsigned &Size) {
   // Use default handling unless linker relaxation is enabled and the alignment
   // is larger than the nop size.
   const MCSubtargetInfo *STI = F.getSubtargetInfo();
-  if (!hasRelaxEver(F.getParent()) && !STI->hasFeature(RISCV::FeatureRelax))
+  if (!STI->hasFeature(RISCV::FeatureRelax) && !hasRelaxEver(F.getParent()))
     return false;
   unsigned MinNopLen =
-      hasRelaxEver(F.getParent()) || STI->hasFeature(RISCV::FeatureStdExtZca)
+      hasRVCEver(F.getParent()) || STI->hasFeature(RISCV::FeatureStdExtZca)
           ? 2
           : 4;
   if (F.getAlignment() <= MinNopLen)
diff --git a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.h b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.h
index ae09e39b9a27b..74140056cbdfe 100644
--- a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.h
+++ b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.h
@@ -35,20 +35,20 @@ class RISCVAsmBackend : public MCAsmBackend {
 
   StringMap<MCSymbol *> VendorSymbols;
 
-  SmallPtrSet<MCSection *, 8> RelaxEverSections;
-  SmallPtrSet<MCSection *, 8> RVCEverSections;
+  SmallPtrSet<const MCSection *, 8> RelaxEverSections;
+  SmallPtrSet<const MCSection *, 8> RVCEverSections;
 
 public:
   RISCVAsmBackend(const MCSubtargetInfo &STI, uint8_t OSABI, bool Is64Bit,
                   const MCTargetOptions &Options);
   ~RISCVAsmBackend() override = default;
 
-  void setRVCEver(MCSection *Sec) { RVCEverSections.insert(Sec); }
-  bool hasRVCEver(MCSection *Sec) const {
+  void setRVCEver(const MCSection *Sec) { RVCEverSections.insert(Sec); }
+  bool hasRVCEver(const MCSection *Sec) const {
     return RVCEverSections.contains(Sec);
   }
-  void setRelaxEver(MCSection *Sec) { RelaxEverSections.insert(Sec); }
-  bool hasRelaxEver(MCSection *Sec) const {
+  void setRelaxEver(const MCSection *Sec) { RelaxEverSections.insert(Sec); }
+  bool hasRelaxEver(const MCSection *Sec) const {
     return RelaxEverSections.contains(Sec);
   }
 
diff --git a/llvm/test/MC/RISCV/align-option-norelax-norvc.s b/llvm/test/MC/RISCV/align-option-norelax-norvc.s
new file mode 100644
index 0000000000000..acb724d443e7f
--- /dev/null
+++ b/llvm/test/MC/RISCV/align-option-norelax-norvc.s
@@ -0,0 +1,34 @@
+# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m %s -o - | \
+# RUN: llvm-objdump -dr --mattr=+c,+m - | FileCheck %s
+
+        .text
+        .option relax
+        .balign 4
+        .global _start
+        .type _start, @function
+# This R_RISCV_ALIGN for .balign 4
+# CHECK: R_RISCV_ALIGN *ABS*+0x2
+_start:
+        lui a0, %hi(foo)
+        addi a0, a0, %lo(foo)
+	mul a0, a1, a4
+        .option push
+
+        .option norelax
+        .option norvc
+# This R_RISCV_ALIGN for .balign 8, we should emit that even
+# norelax is set, because the code before this point might relax,
+# and size may changed, so that we need to align this again at linker
+# time.
+# Also padding pad should be +6 rather than +4 here, because we have enabled
+# RVC before, and linker may relax instructions to RVC instructions,
+# That will cause 4 byte padding might not be enough to fix the alignment.
+# CHECK: R_RISCV_ALIGN *ABS*+0x6
+        .balign 8
+SHOULD_ALIGN_8_HERE:
+        .word 0x12345678
+
+        .option pop
+
+foo:
+        ret
diff --git a/llvm/test/MC/RISCV/align-option-norelax.s b/llvm/test/MC/RISCV/align-option-norelax.s
new file mode 100644
index 0000000000000..61ed47091b4d3
--- /dev/null
+++ b/llvm/test/MC/RISCV/align-option-norelax.s
@@ -0,0 +1,30 @@
+# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax,+c,+m %s -o - | \
+# RUN: llvm-objdump -dr --mattr=+c,+m - | FileCheck %s
+
+        .text
+        .option relax
+        .balign 4
+        .global _start
+        .type _start, @function
+# This R_RISCV_ALIGN for .balign 4
+# CHECK: R_RISCV_ALIGN *ABS*+0x2
+_start:
+        lui a0, %hi(foo)
+        addi a0, a0, %lo(foo)
+	mul a0, a1, a4
+        .option push
+
+        .option norelax
+# This R_RISCV_ALIGN for .balign 8, we should emit that even
+# norelax is set, because the code before this point might relax,
+# and size may changed, so that we need to align this again at linker
+# time.
+# CHECK: R_RISCV_ALIGN *ABS*+0x6
+        .balign 8
+SHOULD_ALIGN_8_HERE:
+        .word 0x12345678
+
+        .option pop
+
+foo:
+        ret



More information about the llvm-commits mailing list