<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">