1

我想知道以下代码中 %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 的区别。

4

1 回答 1

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.
于 2013-06-26T02:59:34.873 回答