已知问题

如下代码去掉第一行 typedef unsigned long uint64; 会出错, 且问题无法避免, 因为无法判断位置符号 uint64 是函数名还是类型

typedef unsigned long uint64;
static uint64 (*syscalls[])(void) = {
    [SYS_fork] sys_fork,   [SYS_exit] sys_exit,     [SYS_wait] sys_wait,     [SYS_pipe] sys_pipe,
    [SYS_read] sys_read,   [SYS_kill] sys_kill,     [SYS_exec] sys_exec,     [SYS_fstat] sys_fstat,
    [SYS_chdir] sys_chdir, [SYS_dup] sys_dup,       [SYS_getpid] sys_getpid, [SYS_sbrk] sys_sbrk,
    [SYS_sleep] sys_sleep, [SYS_uptime] sys_uptime, [SYS_open] sys_open,     [SYS_write] sys_write,
    [SYS_mknod] sys_mknod, [SYS_unlink] sys_unlink, [SYS_link] sys_link,     [SYS_mkdir] sys_mkdir,
    [SYS_close] sys_close,
};

比较复杂的宏定义可以在开头补充 define 的内容, 即可以绕过不合理的文法解析, 例如

#define alternative_io(oldinstr, newinstr, ft_flags, output, input...) \
    asm_inline volatile(ALTERNATIVE(oldinstr, newinstr, ft_flags)  \
                : output                                   \
                : "i"(0), ##input)

static inline void vdso_read_cpunode(unsigned *cpu, unsigned *node)
{
    unsigned int p;

    /*
     * Load CPU and node number from the GDT.  LSL is faster than RDTSCP
     * and works on all CPUs.  This is volatile so that it orders
     * correctly with respect to barrier() and to keep GCC from cleverly
     * hoisting it out of the calling function.
     *
     * If RDPID is available, use it.
     */
    alternative_io ("lsl %[seg],%[p]",
            ".byte 0xf3,0x0f,0xc7,0xf8", /* RDPID %eax/rax */
            X86_FEATURE_RDPID,
            [p] "=a" (p), [seg] "r" (__CPUNODE_SEG));

    if (cpu)
        *cpu = (p & VDSO_CPUNODE_MASK);
    if (node)
        *node = (p >> VDSO_CPUNODE_BITS);
}
zood