<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/100927>100927</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [RISC-V] Cannot switch CSR address immediate using .ifc and .set in assembly code
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          papparapa
      </td>
    </tr>
</table>

<pre>
    Clang failes to compile test.S.
test.S is an assembly code that allows the immediate value of the CSR address to be switched at compile time.

test.S
```assembly
#define CSR_STVEC 0x105
#define CSR_MTVEC 0x305

.macro INSTANTIATE_MODE_MACRO MACRO_NAME
 #ifdef rvtest_mtrap_routine
  \MACRO_NAME M         // actual m-mode prolog/epilog/handler code

        #ifdef rvtest_strap_routine
      \MACRO_NAME S     // actual s-mode prolog/epilog/handler code
    #endif
 #endif
.endm

 .macro XCSR_RENAME __MODE__    // enable CSR names to be parameterized, V,S merged
  .ifc   \__MODE__ , M
       .set CSR_XTVEC,   CSR_MTVEC
 .endif
  .ifc   \__MODE__ , S
       .set CSR_XTVEC,   CSR_STVEC
 .endif
.endm

.macro RVTEST_CODE_BEGIN
  INSTANTIATE_MODE_MACRO XCSR_RENAME
 csrw    CSR_XTVEC, a0
.endm

.globl _start
_start:
  RVTEST_CODE_BEGIN
```

```
$ clang --version
clang version 18.1.6 (Fedora 18.1.6-3.fc40)
Target: x86_64-redhat-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
Configuration file: /etc/clang/x86_64-redhat-linux-gnu-clang.cfg
$ clang -target riscv64-linux-none -Drvtest_mtrap_routine=True test.S
<instantiation>:2:7: error: operand must be a valid system register name or an integer in the range [0, 4095]
 csrw CSR_XTVEC, a0
      ^
asm-test-riscv.S:34:3: note: while in macro instantiation
  RVTEST_CODE_BEGIN
 ^
$
```

GCC compiles test.S successfully.

```
$ riscv64-linux-gnu-gcc --version
riscv64-linux-gnu-gcc (GCC) 14.1.1 20240507 (Red Hat Cross 14.1.1-1)
Copyright (C) 2024 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ riscv64-linux-gnu-gcc -ffreestanding -nostdlib -Drvtest_mtrap_routine=True test.S
$
```

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyUVl9v4r4S_TTmZZQoOFDggQcaYBdp264IW-19Qk48Cb5ybGQ7_XM__ZWdUGC37G9_VRUSz3jmzPHx2MxaUSvEORnfk_FywFp30GZ-ZMcjM-zIBoXm7_NMMlVDxYREC05DqZujkAgOrYvzmCRLkiy6DxAWmAJmLTaFfIdScwR3YA6YlPrVgjsgiKZBLphDeGGyRdBVGM7yLTDODdqQpUCwr8KVB-TA3DmpaLBPeZm4H7lLuv8TgH6YphwroUKOfb57XmWQvA2T8Wfmh96cfpjDM25YaTRsHvPd4nG3WexW-4en5Wr_sMi2TxCe-8fFw6rzBkJTUXGswLx4gPvGGXbcG906obD3ATLOzhPhAU5_hK4JXQMrXcskNFHjWTwaLXVN6BqPons5MMUlmkDyJdRzmGsM9jMMwfEKR_4JBvv3GPrMqLiozmRcfMaoeHOFt-f2p6d_uwog9h27-wsoqFghO5ko1uBJJF6pDTo04n_ICc3gmdAshwZNjfwEKRZV2RX6Edi7PlwRFlt0QQI_vQS8Hc6KOEG9rOtW2PyvwuY3wv7GT0_P9nm3ynf7zOe5X33ZPJ6y3NDkBZ29Z2nNK_TZP8Cw5FbaWupCwt46Zlw31L-nH0K7geljH17G-3WQjqAMnSWKXtBYoVVn6Ab7IRhO42F8B4RO18i1Yf1AlMZVOUoInXWTdszU6JHB2_RufzeKDPIDc5EUqn2LatX2bgeDjIMXs_TOR23FW2faKOuYlMiXwngToevWGkLXheiBZVpVom4Ncx5YJST2fuhKQtcBN6HrGwCiYI_Lqv6tfhfAgxG2fLkb9VOUVgjR8tP-kS53pj014D5cmglfgXIi4CPpiqQLStLFxKNEY3QoSx_RMMWhaa3z24f5Jiw42HfrsAGDtbAOTdhioI3v5kI5rNGAUKFPG6ZqBDK-T7x8RslsTMbLS4V9Kq9Tp-m1yGwTefhRKDrOSbpIR_7hMSrtArWvB9_xhYJuA1zX92cFnjMROvqDKL9k2elosT2fYNuyRGurVsr3-B8UfL1mfpnrsvxV0Z87ETr9kmWEzmA4iofxEGhCR8k4mXjLFjl8ZQ4yo63tHaLhh9wzfXw3oj447xti-MmwNoiQ68q9MoOw1q3iHVk0g40q49MmENYf1JX3tr03Se_BIoYVtro1JUKlfV8_vgtVQ6kVFz6UjQF2BzToIzw-dRFfmTFMuXcfRGkH-IIqTH9YbbOvi8fd4n7zbbP7jxfUerN7XOU5rJ-2sIDvi-1uk_34ttjC9x_b70_56prx2xRXHr4XBPf4IqWt41IU_2bL3FDGgM9TPktnbIDz4YTS4d00nc0Gh_mMs2LEiyFHrEYsrbAYFkkxYWzC06QYTwdiHtZwQqdDmtyl07gcsyLF8XQ2wWI4nk3IKMGGCRlL-dLE2tQDYW2L82GSzOhkIFmB0obbGKUKXyFYCaX-cmbmflJUtLUlo0QK6-w5jBNOhmvcdpNn0TMZLyFjyq9Fd4m6ul2dL2Ct9eSFY8w3hXBUiV_ub4PWyPnBuaP1jT-cxbVwh7aIS90QuvYY-p_oaPR_sXSErgNyS-i6L-1lTv8fAAD__3N1I3A">