其他分享
首页 > 其他分享> > GCC退货优化

GCC退货优化

作者:互联网

我想知道GCC是否可以优化代码,例如

int foo(args) {
    if(is_true) {
        do_smth;
        n = call_func(args);
        do_smth;
        return n;
    }
    else {
        return call_func(args);
    }
}

这样,如果我在else分支中,将像没有foo调用一样执行call_func的调用?我正在写内核模块,为了解决一个特定的问题,我需要它看起来像直接调用了call_func.更具体地说,call_func是一些系统调用. Foo是此系统调用的我的版本.在is_true的情况下,我应该做一下,调用此系统调用,然后返回它的返回值.但是在!is_true中,我想以某种方式更改调用堆栈本身-以便在当前级别上使用call_func而不是foo.可能吗

is_true的实现:

struct task_struct * cur_task = current;
if(check_dir(cur_task)) {
...
}

check_dir是用于检查我们是否要对目录执行某些操作的函数,从中调用了系统调用.

解决方法:

这称为tail-call优化(在任何C标准中均未指定;相反,某些语言(例如Scheme和Ocaml)指定需要进行尾部调用优化).在某些情况下,最新的GCC编译器可以做到这一点optimization.

但这确实取决于细节,尤其是传递给call_func的实际参数

如果您依赖它,请注释您的代码,并使用gcc -fverbose-asm -O2 -S检查您的编译器正在执行此操作.

请注意,此优化不是必需的,并且可能是编译器,编译标志,处理器和ABI特定的.

(因此它可以在x86-64上运行,但不能在32位ia32或ARM上运行;您应该检查一下!)

标签:gcc,linux-kernel,kernel-module,c-3,linux
来源: https://codeday.me/bug/20191121/2049028.html