我想知道以下代码中%P3的含义:
#define get_user(x, ptr) \
({ \
int __ret_gu; \
register __inttype(*(ptr)) __val_gu asm("%edx"); \
__chk_user_ptr(ptr); \
might_fault(); \
asm volatile("call __get_user_%P3" \
: "=a" (__ret_gu), "=r" (__val_gu) \
: "0" (ptr), "i" (sizeof(*(ptr)))); \
(x) = (__typeof__(*(ptr))) __val_gu; \
__ret_gu; \
})
此外,在LLVM IR中,代码映射到:
call { i32*, i64 } asm sideeffect "call __get_user_${3:P}", "={ax},={edx},0,i,~{dirflag},~{fpsr},~{flags}"(i32* %tmp73, i64 4)
我的理解是,这实际上是调用arch / x86 / lib / getuser.S中的特定函数__get_user_X,但是不清楚哪一个特别是(__get_user_4?)。
最后,我想了解%P和%p之间的区别。
答案 0 :(得分:1)
我认为%P3表示__get_user_X中的X依赖于“i”(sizeof((ptr))。例如sizeof((ptr))可能是1,2,4, 8。
3表示asm volatile(“...”)语句中的第三个参数。 %P用于字符串连接。
关于%P和%p的差异,我想这是字符串规范,但我不确定。我从GCC用户手册中复制了以下句子:
%p Substitutes the standard macro predefinitions for the current target machine.
Use this when running cpp.
%P Like ‘%p’, but puts ‘__’ before and after the name of each predefined macro,
except for macros that start with ‘__’ or with ‘_L’, where L is an uppercase
letter. This is for ISO C.