This is a code from linux 5.4.21.
==== ./arch/arm64/include/asm/sysreg.h
#define __DEFINE_MRS_MSR_S_REGNUM \
" .irp num,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30\n" \
" .equ .L__reg_num_x\\num, \\num\n" \
" .endr\n" \
" .equ .L__reg_num_xzr, 31\n"
In __DEFINE_MRS_MSR_S_REGNUM, I understand .irp
and .equ
directive. But why does it use \\num
instead of \num
? I guess it's for escaping before special characters because \
is a special character and the preprecessor makes it .L__reg_num_x\num, \num
. But why is \n
using single back-slash then? Is it specially processed during preprocessing?
And another question is : what is that .L
in front of symbol name in .equ
statements? Does it have any special meaning, or is it just to express it's a long value?
CodePudding user response:
.L
is a file-local label, no visible in the symbol table. https://sourceware.org/binutils/docs/as/L.html.
As for the \num
after the C preprocessor is done expanding it, again read the GAS manual: https://sourceware.org/binutils/docs/as/Irp.html .irp
takes a parameter name to be expanded inside the macro. GAS macros in general use \name
for .macro
as well.