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