Предположим, что я использую современную версию GCC
для компиляции программы на языке C. Кроме того, учтите, что моя программа содержит устаревшие ветки, но мне очень хотелось бы, чтобы мертвый код в этих устаревших ветвях компилировался и присутствовал в финальной программе. Рассмотрим следующую программу:
int main(int argc, char** argv) {
int a = 0;
goto skip;
a = -1;
skip: ;
return a;
}
Ясно, что если я использую GCC
с настройками оптимизации по умолчанию, второе назначение никогда не попадет в финальную программу, так как компилятор может легко сказать, что он никогда не будет выполнен. Предположим, что я не хочу, чтобы это произошло.
В GCC
существует несколько флагов, которые мешают мертвому коду (в первую очередь -fdce
), и я могу явно отключить их при вызове GCC соответственно:
-fno-dce
-fno-dse
-fno-tree-dce
-fno-tree-dse
Насколько я могу судить, это должно дать указание GCC
не связываться со вторым назначением. Тем не менее, соответствующий код никогда не попадает в мою программу.
Почему GCC
настаивает на удалении мертвого кода, и есть ли способ дать указание GCC не избавиться от второго назначения?