I'd like to know if GCC can optimize code like
int foo(args) {
if(is_true) {
do_smth;
n = call_func(args);
do_smth;
return n;
}
else {
return call_func(args);
}
}
so that if i'm in else branch call_func's call would be executed like there was no foo call? I'm writing kernel module, and for solving one particular issue I need it to look like this call_func was called directly. To be more specific call_func is some system call. Foo is my version of this system call. In is_true case I should do smth, call this system call and then return its return. But in !is_true I'd like to somehow change the call stack itself - so that on current level there was call_func instead of foo. Is it even possible?
Implementation of is_true:
struct task_struct * cur_task = current;
if(check_dir(cur_task)) {
...
}
check_dir is function to check if we want to do something with directory, from which system call was called.