Fro*_*ter 2 c macros compilation linux-kernel
我发现内核代码中的一些宏定义展开前后是一样的。为什么要这么麻烦地定义这个宏呢?
例如,在/arch/arm64/include/asm/atomic.h中:
#define arch_atomic_add_return_relaxed arch_atomic_add_return_relaxed
#define arch_atomic_add_return_acquire arch_atomic_add_return_acquire
#define arch_atomic_add_return_release arch_atomic_add_return_release
#define arch_atomic_add_return arch_atomic_add_return
Run Code Online (Sandbox Code Playgroud)
如果在普通代码中使用,扩展为自身的宏没有任何效果,但它算作#ifdef、#ifndef和 的定义宏#if defined。
当您想要将某些标识符定义为不作为宏,但您还希望能够根据该标识符是否已定义来有条件地编译代码时,这非常有用。这就是你的例子中发生的事情;arch/arm64/include/asm/atomic.h将您引用的宏定义与具体定义(扩展为的宏)配对作为内联函数:
#define ATOMIC_FETCH_OP(name, op) \
static __always_inline int arch_##op##name(int i, atomic_t *v) \
{ \
return __lse_ll_sc_body(op##name, i, v); \
}
#define ATOMIC_FETCH_OPS(op) \
ATOMIC_FETCH_OP(_relaxed, op) \
ATOMIC_FETCH_OP(_acquire, op) \
ATOMIC_FETCH_OP(_release, op) \
ATOMIC_FETCH_OP( , op)
ATOMIC_FETCH_OPS(atomic_add_return)
#define arch_atomic_add_return_relaxed arch_atomic_add_return_relaxed
#define arch_atomic_add_return_acquire arch_atomic_add_return_acquire
#define arch_atomic_add_return_release arch_atomic_add_return_release
#define arch_atomic_add_return arch_atomic_add_return
Run Code Online (Sandbox Code Playgroud)
预处理后的定义arch_atomic_add_return将类似于
static inline __attribute__((always_inline))
int arch_atomic_add_return(int i, atomic_t *v)
{
return __lse_ll_sc_body(atomic_add_return, i, v);
}
Run Code Online (Sandbox Code Playgroud)
同时,里面include/linux/atomic-arch-fallback.h有一个条件定义arch_atomic_add_return:
#ifndef arch_atomic_add_return
static __always_inline int
arch_atomic_add_return(int i, atomic_t *v)
{
int ret;
__atomic_pre_full_fence();
ret = arch_atomic_add_return_relaxed(i, v);
__atomic_post_full_fence();
return ret;
}
#define arch_atomic_add_return arch_atomic_add_return
#endif
Run Code Online (Sandbox Code Playgroud)
#define因此, in的重点arch/arm64/include/asm/atomic.h是告诉include/linux/atomic-arch-fallback.h“不要定义arch_atomic_add_return,我已经这样做了”。
| 归档时间: |
|
| 查看次数: |
81 次 |
| 最近记录: |