2013-07-17 2 views
3

Я привязываюсь к статической библиотеке, и мне интересно, как следует обрабатывать снятие мертвого кода в llvm/Clang. Я не могу найти документацию, в которой намекает, что у Клана есть эквивалент -Wl, -gc-section или -dead_strip.Clang удаляет мертвый код во время статического связывания (gcc-эквивалент -Wl, -gc-sections)

Я предполагаю, что устранение мертвого кода выполняется автоматически на более высоких уровнях оптимизации, но это так в gcc тоже, правильно? Тем не менее, gcc обеспечивает некоторый явный контроль над этим посредством вышеупомянутых флагов. Разве Кланг не дает этого или я что-то упускаю?

(Система OSX)

ответ

5

Мертвой отгонкой является особенностью линкера, не является функцией компилятора. В результате не было ни gcc, ни clang. Вот почему вам пришлось использовать -Wl - вы передаете этот флаг в компоновщик. Компонент Mac OS X использует -dead_strip. Вы можете передать флаг непосредственно вашему вызову clang и передать его автоматически.

+0

'-fdce', вероятно, ссылается на аналогичную оптимизацию, выполненную * внутри * каждой функции компилятором. Для компилятора довольно часто можно доказать, что отдельные базовые блоки мертвы. – zwol

+0

Да, жаль, что я не понимаю. Мой «параметр-уровень-аргумент» относится к -fdce, который, как я думал, выполнялся компилятором, а не компоновщиком. Но спасибо за ваш ответ - кажется, что dead_strip - это команда, чтобы перейти к компоновщику, и это действительно уменьшило размер двоичного файла (он был задокументирован только в man-страницах gcc, а не в clang). Я должен был читать man ld, чтобы получить, какие флаги он принял, а не ожидал, что руководство для компилятора будет включать в себя, какие флаги могут быть отправлены :)). – kamjagin