Оптимизация возврата GCC
Я хотел бы знать, может ли 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 я должен сделать что-то, вызвать этот системный вызов и затем вернуть его. Но в! Is_true я бы хотел как-то изменить сам стек вызовов - чтобы на текущем уровне вместо foo был call_func. Это вообще возможно?
Реализация is_true:
struct task_struct * cur_task = current;
if(check_dir(cur_task)) {
...
}
check_dir - это функция, которая проверяет, хотим ли мы что-то сделать с каталогом, из которого был вызван системный вызов.