Otimização de retorno do GCC
Gostaria de saber se o GCC pode otimizar códigos como
int foo(args) {
if(is_true) {
do_smth;
n = call_func(args);
do_smth;
return n;
}
else {
return call_func(args);
}
}
de modo que, se eu estiver no ramo, a chamada de call_func será executada como se não houvesse chamada foo? Estou escrevendo o módulo do kernel e, para resolver um problema específico, preciso que pareça que esse call_func foi chamado diretamente. Para ser mais específico, call_func é uma chamada de sistema. Foo é a minha versão desta chamada de sistema. No caso de is_true, devo fazer algo, chamar essa chamada de sistema e retornar seu retorno. Mas em! Is_true eu gostaria de alterar de alguma forma a pilha de chamadas - para que, no nível atual, houvesse call_func em vez de foo. Isso é possível?
Implementação de is_true:
struct task_struct * cur_task = current;
if(check_dir(cur_task)) {
...
}
check_dir é uma função para verificar se queremos fazer algo com o diretório, a partir do qual a chamada do sistema foi chamada.