GCC返回优化

时间:2014-11-06 08:54:21

标签: c linux gcc linux-kernel kernel-module

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

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

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

is_true的实现:

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

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

1 个答案:

答案 0 :(得分:3)

这称为tail-call优化(在任何C标准中都指定 ;相反,某些语言-eg Scheme和Ocaml-指定需要进行尾调用优化)。在一些案例中,最近的GCC编译器可以执行optimization

但这实际上取决于细节,特别是传递给call_func

的实际参数

如果您依赖它,请注释您的代码并与gcc -fverbose-asm -O2 -S核对您的编译器正在执行此操作。

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

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